调用第二个 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语句,尤其是为了可读性;我投了赞成票,祝你好运。 用一些(可能是错误的)sender
和e
直接调用事件处理程序的想法是不好的,而是将代码从处理程序移动到单独的方法中,然后您可以从不同的事件处理程序调用该方法。目前尚不清楚当您显示第二个窗口时会发生什么(添加相关代码)。问题的描述“不工作” 很棒。什么不起作用?是否不再调用事件处理程序(在它的第一行设置断点并查看自己)?可能是其他一些控件获得焦点(或窗口不再处于活动状态,因此没有输入)?
【参考方案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>
然后实现SaveLogCommandCanExecute和SaveLogCommand
如果 SaveLogCommandCanExecute 返回 false,它将自动禁用 RoutedCommand 绑定到的任何 GUI。
请记住,具有键绑定的窗口必须具有焦点。
【讨论】:
以上是关于调用第二个 XAML 窗口后 C# 键盘快捷键不起作用的主要内容,如果未能解决你的问题,请参考以下文章