我有一个WPF应用程序。在它的主窗口中有一个PreviewKeyUp处理程序,处理某些国际按键 - 在这种情况下,回车。当一个模式对话框显示(的ShowDialog),并按下Enter键时,我发现,回车进入到主窗口上的PreviewKeyUp处理程序。根据您的角度来看,这可能会或可能没有意义......但它绝对不是我想要在这里。
所以,我看不到任何方式可靠拦截回车键在主窗口(不管聚焦控制的),没有一个模式对话框当按下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;
}
在这种情况下,我这样做,如果它是任何使用你...
Dispatcher.BeginInvoke(DispatcherPriority.Input,
(SendOrPostCallback)delegate { IsEnabled = false; }, new object[] { null });
var dr = MessageBox.Show("Hello");
Dispatcher.BeginInvoke(DispatcherPriority.Input,
(SendOrPostCallback)delegate { IsEnabled = true; }, new object[] { null });
和ENTER将由对话框被吞噬。
对于这个问题更简单和包容性的解决办法是捕捉按键事件,而不是让它继续向下顶端对话框后面的对话:
private void Window_PreviewKeyUp(object sender, KeyEventArgs e)
{
// whatever your code should do when the event fires...
// swallow Enter key so it won't
// press buttons under the current dialog
e.Handled = true;
}
我发现,加里的溶液离开集中的问题。
这个问题似乎在对话框中的OK按钮使用ISDEFAULT时才会发生。因此,无副作用简单的解决方案是不是在处理一个PreviewKeyUp事件回车键。
public partial class MyDialog : Window
{
...
private void Window_PreviewKeyUp(object sender, KeyEventArgs e)
{
switch(e.Key)
{
case Key.Enter:
OKButton_Click(sender,e);
break;
}
}
这也许是一个广义的问题访问密钥,因为回车按键被认为是由刚刚注册一个快捷键来处理。也许正是这种访问关键的制定范围的问题:http://coderelief.net/2012/07/29/wpf-access-keys-scoping/
缺点是,你必须改变所有对话窗口这样的工作方式 - 有点难看,但它不是大量的代码。