4

問題:

  1. KeyUpは、メインウィンドウのグリッドによって処理されます(Grid_KeyUp
  2. メインウィンドウには子ウィンドウが表示されます(例MessageBox.Show(...)
  3. ユーザーが[Return](Keys.Return)を押して、MessageBox
  4. メインウィンドウは、実際にはMessageBoxのそのキー押下からKeyUpイベントを取得します

私が抱えている問題を示す非常に単純な分離サンプルがあります。空のWPFプロジェクトを作成し、次のXAMLを使用するだけです。

<Grid KeyUp="Grid_KeyUp">
    <Button Click="Button_Click"></Button>
</Grid>

そして、コードビハインド:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void Grid_KeyUp(object sender, KeyEventArgs e)
    {
        Console.WriteLine("KEYUP: " + e.Key);
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        MessageBox.Show(this, "TEST");
    }
}

ボタンをクリックして[Return]を押してメッセージボックスを閉じると、出力ウィンドウに次のように出力されます。

KEYUP: Return

奇妙な事実:

  1. [Escape](KEYUP: Escape印刷される)を押しても同じ動作をしますが、[Space]を押すとコンソールは何も印刷しません!
  2. e.Sourceとe.OriginalSourceは、メインウィンドウのボタンを指しています(これは明らかに間違っています)。
  3. MessageBox.Show(...)イベントがoutKeyUpハンドラーによって処理されない(つまり、出力が空である)直後にブレークポイントを設定した場合。

誰かが私に何が起こっているのか説明してもらえますか?

PSターゲットフレームワークは次のとおりです。.NET4クライアント

4

1 に答える 1

4

明らかに何が起こっているのかというと、EnterキーまたはEscapeキーを押すとメッセージボックスが閉じ、ボタンを持ち上げる前にMainWindowフォーカスが取得され、同様にキャッチKeyPressれます。

スペースバーでこれが発生しない理由は、スペースバーを押すとボタンが押し下げられますが、スペースバーを自分で離すまでボタンを離さないためです。これは、ボタンが「押されていない」前にスペースバーが解放されることを意味します。したがって、MessageBoxスペースバーが解放されると閉じられるだけなので、ボタンが押されたときにMainWindowキャッチされません。

スペースバーを押したままにすると、これをテストできます。 ボタンは押したままですが、離すまで押されないことがわかります。

閉じた後に消える旗をプロリーに作成することができますMessageBox。それが最初であるかどうかKeyPressを確認し(おそらく、クローズ後10ミリ秒未満で発生したことを確認します)、それを無視します。

I know, its ugly, but I don't think there's much else you can do (if I'm right)

于 2012-04-17T07:22:52.140 に答える