C#键盘快捷方式在调用第二个XAML窗口后停止工作

5
我有一个软件,使用多个XAML窗口用于不同的实例:例如,为了导出一些信息,我创建了具有与母软件不同格式的辅助XAML窗口。它们工作得很好。
我的问题是,如果我在不调用任何这些辅助XAML窗口的情况下使用我的软件,快捷键运行得很好。但是一旦我调用这些新的XAML窗口,快捷键就不再起作用了。我需要重新启动程序才能使它们恢复正常。
对此行为有什么线索吗? 另外,我还没有成功创建像CTRL + Letter这样的快捷键。我看到了很多代码,似乎相当简单,但它们就是不能用...
代码
private void Window_KeyDown(object sender, KeyEventArgs e)
{
    Key key = e.Key;


    if ((key == Key.Left) && previousButton.IsEnabled)
        button_PreviewMouseDown(previousButton, null);
    else if ((key == Key.Right) && nextButton.IsEnabled)
        button_PreviewMouseDown(nextButton, null);
    //New Label
    else if (key == Key.L)
        //else if (key == Key.LeftAlt && e.Key.ToString() == "L")
        NewLabel_Click(sender, e);
    // Begin Event
    else if (key == Key.B)
        BeginEvent_Click(sender, e);
    // End Event
    else if (key == Key.E)
        EndEvent_Click(sender, e);
    // Delete Label
    else if (key == Key.K)
        DeleteLabel_Click(sender, e);
    else if (key == Key.R)
        // Delete Event
        DeleteEvent_Click(sender, e);
    // Edit Label
    else if (key == Key.I)
        EditLabel_Click(sender, e);
    // Edit Event
    else if (key == Key.F)
        EditEvent_Click(sender, e);
}

编辑 1

我现在发现只要调用一个 C# 弹出消息框,显示“事件创建成功”,快捷键就会重新启用!

MessageBox.Show("Event Created");

有任何想法为什么会发生这种情况吗?

2
可以分享一下你的代码和具体问题吗? - Apoorv
应该使用 switch 语句,尤其是为了可读性;我投了赞成票,祝好运。 - Jaquarh
直接使用一些(可能是错误的)“sender”和“e”来调用事件处理程序的想法是不好的,最好将处理程序中的代码移入单独的方法,然后可以从不同的事件处理程序中调用该方法。当您显示第二个窗口时会发生什么还不清楚(请添加相关的代码)。而且,“不起作用”的问题描述非常棒。是什么不起作用?事件处理程序不再被调用了吗(在它的第一行设置断点并自己查看)?可能是某个其他控件获得了焦点(或者窗口不再处于活动状态,因此没有输入)吗? - Sinatr
1个回答

0
另一种方法是使用 RoutedCommands。 使用RoutedCommand时,您可以分配KeyGestures
例如:
/// <summary>
/// Save Log command
/// </summary>
public static readonly RoutedCommand SaveLog =
    new RoutedCommand("SaveLog", typeof(Commands),
        new InputGestureCollection 
        {
            new KeyGesture(Key.S, ModifierKeys.Control,"Save log contents to a file. (Ctl+S)")
        });

在你的XAML中分配RoutedCommand

            <Button Style="{StaticResource LoggingWindowSaveLogButton}" Command ="{x:Static local:Commands.SaveLog}" />

将该命令绑定到您的窗口。
    <!-- Command Bindings-->
<Window.CommandBindings>
    <CommandBinding Command="{x:Static local:Commands.SaveLog}" Executed="SaveLogCommand" CanExecute="SaveLogCommandCanExecute"/>
</Window.CommandBindings>

然后实现SaveLogCommandCanExecuteSaveLogCommand

如果SaveLogCommandCanExecute返回false,它将自动禁用RoutedCommand绑定的任何GUI。

请记住,具有键绑定的窗口必须具有焦点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接