调用第二个 XAML 窗口后 C# 键盘快捷键不起作用

Posted

技术标签:

【中文标题】调用第二个 XAML 窗口后 C# 键盘快捷键不起作用【英文标题】:C# Keyboard Shortcuts quit working after calling 2nd XAML window 【发布时间】:2016-07-25 05:55:45 【问题描述】:

我有一个软件,它为不同的实例使用多个 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");

知道为什么会发生这种情况吗?

【问题讨论】:

关心分享您的代码和确切的问题 应该使用switch语句,尤其是为了可读性;我投了赞成票,祝你好运。 用一些(可能是错误的)sendere 直接调用事件处理程序的想法是不好的,而是将代码从处理程序移动到单独的方法中,然后您可以从不同的事件处理程序调用该方法。目前尚不清楚当您显示第二个窗口时会发生什么(添加相关代码)。问题的描述“不工作” 很棒。什么不起作用?是否不再调用事件处理程序(在它的第一行设置断点并查看自己)?可能是其他一些控件获得焦点(或窗口不再处于活动状态,因此没有输入)? 【参考方案1】:

另一种方法是使用 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。

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

【讨论】:

以上是关于调用第二个 XAML 窗口后 C# 键盘快捷键不起作用的主要内容,如果未能解决你的问题,请参考以下文章

C# Xamarin - 如何延迟第二个 void

pyqt 怎样切换两个窗口?

C#快捷键大全

当第二个活动方向改变时 registerForActivityResult 不起作用

C# PostMessage 到 Spotify

PYQT GUI更新和通过Qthread在第二个窗口的QLCD显示器上显示浮点信号不起作用[关闭]