0

私はWPFアプリケーションを持っています。そのメイン ウィンドウには、PreviewKeyUp ハンドラーがあり、特定のグローバル キーの押下 (この場合は Enter) を処理します。モーダル ダイアログ (ShowDialog) が表示されているときに Enter キーを押すと、Enter キーがメイン ウィンドウの 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 に答える
0

Garry の解決策ではフォーカスの問題が残ることがわかりました。

この問題は、ダイアログの [OK] ボタンでIsDefaultを使用した場合にのみ発生するようです。したがって、副作用のない簡単な解決策は、代わりに PreviewKeyUp イベントで Enter キーを処理することです。

public partial class MyDialog : Window
{
    ...

    private void Window_PreviewKeyUp(object sender, KeyEventArgs e)
    {
        switch(e.Key)                
        {
            case Key.Enter:
                OKButton_Click(sender,e);
                break;
        }

    }

Enter キーの押下は、アクセス キーを登録するだけで処理されると思われるため、これはおそらくアクセス キーの一般的な問題です。おそらく、このアクセス キーのスコープの問題です: http://coderelief.net/2012/07/29/wpf-access-keys-scoping/

欠点は、この方法で動作するようにすべてのダイアログ ウィンドウを変更する必要があることです。少し見苦しいですが、それほど多くのコードではありません。

于 2013-10-25T05:19:37.483 に答える