如何忽略来自WPF模态对话框回车键,在PreviewKeyUp

问题描述 投票:0回答:3

我有一个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;
}
.net wpf dialog keyboard modal-dialog
3个回答
2
投票

在这种情况下,我这样做,如果它是任何使用你...

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将由对话框被吞噬。


2
投票

对于这个问题更简单和包容性的解决办法是捕捉按键事件,而不是让它继续向下顶端对话框后面的对话:

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;
 }

0
投票

我发现,加里的溶液离开集中的问题。

这个问题似乎在对话框中的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/

缺点是,你必须改变所有对话窗口这样的工作方式 - 有点难看,但它不是大量的代码。

© www.soinside.com 2019 - 2024. All rights reserved.