【发布时间】:2013-06-29 02:16:27
【问题描述】:
我有一个 WPF 应用程序。在它的主窗口上,它有一个 PreviewKeyUp 处理程序,用于处理某些全局按键 - 在本例中为 Enter。 我发现当显示模式对话框(ShowDialog)并按下回车键时,回车进入主窗口上的 PreviewKeyUp 处理程序。 根据您的观点,这可能有意义,也可能没有意义……但这绝对不是我想要的。
所以我看不到任何方法可以在主窗口上可靠地拦截 Enter 键(无论集中控制如何),而在模式对话框中按下 Enter 键时也不会被调用。
这似乎是特定于 Enter 键的行为 - 它不会发生在其他键上,例如数字。
有人有什么想法吗?
主窗口代码:
private void Window_PreviewKeyUp(object sender, KeyEventArgs e)
{
switch (e.Key)
{
case Key.Enter:
Controller.ProductSelected();
ActionComplete();
e.Handled = true;
break;
}
}
public bool PromptForPassword(string promptText, out string result)
{
DataEntryForm entryForm = new DataEntryForm();
entryForm.Owner = this;
entryForm.PromptText = promptText;
IsEnabled = false; // doesn't help
entryForm.ShowDialog();
IsEnabled = true;
result = entryForm.EntryData;
return (bool) entryForm.DialogResult;
}
【问题讨论】:
-
在显示对话框之前,您是否尝试过在主窗口中设置 IsEnabled = false?
-
刚刚尝试过 - 不会停止 PreviewKeyUp 触发。在 PreviewKeyUp 触发时,该窗口似乎已重新启用。也会有点难看,因为我必须记住在每个 ShowDialog 周围都这样做。
-
现在刚试的时候,有没有用Dispatcher.BeginInvoke?我检查了我的,PKU 事件被吞了。
-
我没有使用任何 Invoke 或 BeginInvoke(或一般的后台线程)...
-
如果它对你有用的话,我就这么做了... Dispatcher.BeginInvoke(DispatcherPriority.Input, (SendOrPostCallback)delegate { IsEnabled = false; }, new object[] { null }); var dr = MessageBox.Show("你好"); Dispatcher.BeginInvoke(DispatcherPriority.Input, (SendOrPostCallback)delegate { IsEnabled = true; }, new object[] { null });并且 ENTER 键消失了
标签: .net wpf dialog keyboard modal-dialog