2012-04-17 11 views
4

問題:奇妙なkeyUpイベントの振る舞い(メインフォームが子供からのイベントを処理します!)

  1. keyUpイベントは、メインウィンドウのグリッドによって処理されます(Grid_KeyUp
  2. メインウィンドウは子ウィンドウを示し(例えばMessageBox.Show(...)を)
  3. ユーザプレス[戻る](Keys.Return)はMessageBox
  4. メインウィンドウが実際にメッセージボックスにそのキー押下から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"); 
    } 
} 

あなたがメッセージボックスに出力ウィンドウを閉じるには、ボタンを押しながら[戻る]をクリックすると印刷されます:

KEYUP: Return 

奇妙な事実:

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

何が起こっているのですか?

PSターゲットフレームワークです:あなたはMainWindowがフォーカスを取得したボタンやキャッチを持ち上げる前に、何が起こっているのか、.NET 4クライアント

答えて

4

明らかにあなたが入力するか、エスケープキーを押したときに、メッセージボックスが閉じることで、KeyPressも同様にです。

これは、スペースバーで起きていない理由は、スペースバーを押すと、下のボタンを押すことですが、あなたは、スペースバー自分自身を解放するまで、それを解放しません。これは、スペースボタンが解放される前にスペースバーが解放され、MessageBoxがスペースバーが解放されると閉じるため、MainWindowはボタンを押さないことを意味します。

あなたには、スペースバーを保持することによってこれをテストすることができます。 あなたは、ボタンが押されていますが、それを解放するまで押されていないことがわかります。

MessageBoxが終了したあとに消えるフラグを作成することができます。それが最初のKeyPressであることを確認してください(そして、おそらくそれが終了後に10ミリ秒未満であることを確認してください)。

私が知っている

、その醜いが、(私が正しいならば)私はこれは、実際に、私は来ることができませんでした非常に良い説明:)です

+0

あなたがすることができる他の多くはないと思います何らかの理由でこれで自分自身と一緒に。 (ちなみに、純粋なWPFアプリケーションは全く同じように動作するため、WinForms/WPFとは何の関係もありません)。ありがとう! – Jefim

+0

本当に?それは奇妙です...私は私の答えを編集します –

+0

@Jefimそれをテストし、あなたは正しいです。ウィンドウ内でいくつかのポップアップを取得したときに、しばしばそれらのすべてを取り除くためにEnterキーを押したままにすることを考えると、実際には動作は理にかなっています。あなたはそのようなことを提案する前にそれを考えなければならないと思っていたはずです –