0

我有一个 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;
}
4

3 回答 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 将被对话框吞下。

于 2013-07-03T03:52:01.813 回答
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;
 }
于 2019-02-04T14:31:02.530 回答
0

我发现加里的解决方案留下了焦点问题。

此问题似乎仅在对话框中的“确定”按钮上使用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/

缺点是您必须更改所有对话框窗口才能以这种方式工作 - 有点难看,但代码不多。

于 2013-10-25T05:19:37.483 回答