問題:奇妙なkeyUpイベントの振る舞い(メインフォームが子供からのイベントを処理します!)
- keyUpイベントは、メインウィンドウのグリッドによって処理されます(
Grid_KeyUp
) - メインウィンドウは子ウィンドウを示し(例えば
MessageBox.Show(...)
を) - ユーザプレス[戻る](
Keys.Return
)は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");
}
}
あなたがメッセージボックスに出力ウィンドウを閉じるには、ボタンを押しながら[戻る]をクリックすると印刷されます:
KEYUP: Return
奇妙な事実:
- [エスケープ](
KEYUP: Escape
が印刷されます)を押すと同じ動作になりますが、[スペース]を押すとコンソールに何も印刷されません! - e.Sourceとe.OriginalSourceはメインウィンドウのボタンを指しています(明らかに間違っています)。
MessageBox.Show(...)
の直後にブレークポイントを設定した場合、イベントは出力KeyUpハンドラで処理されません(つまり、出力は空です)。
何が起こっているのですか?
PSターゲットフレームワークです:あなたはMainWindow
がフォーカスを取得したボタンやキャッチを持ち上げる前に、何が起こっているのか、.NET 4クライアント
あなたがすることができる他の多くはないと思います何らかの理由でこれで自分自身と一緒に。 (ちなみに、純粋なWPFアプリケーションは全く同じように動作するため、WinForms/WPFとは何の関係もありません)。ありがとう! – Jefim
本当に?それは奇妙です...私は私の答えを編集します –
@Jefimそれをテストし、あなたは正しいです。ウィンドウ内でいくつかのポップアップを取得したときに、しばしばそれらのすべてを取り除くためにEnterキーを押したままにすることを考えると、実際には動作は理にかなっています。あなたはそのようなことを提案する前にそれを考えなければならないと思っていたはずです –