0

Winforms TextBoxのKeyDownハンドラーで(ShowDialogを使用して)WPFウィンドウを起動しています。WPFウィンドウには、IsDefault=trueのボタンがあります。テキストボックスでEnterキーを押した後、WPF AccessKeyメカニズムは、ウィンドウの読み込み後にそれを取得し、デフォルトのボタンをトリガーするようです。

この問題は、WPFTextBoxのKeyDownハンドラーからウィンドウを起動する場合には発生しません。

Winformsテキストボックスで処理されているキーの押下をWPFウィンドウが受け取らないようにする回避策を探しています。

問題を説明するサンプルコードを次に示します。

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        var window = new System.Windows.Window();
        var button = new System.Windows.Controls.Button
        {
            IsDefault = true,
            Content = "OK",
        };
        button.Click += (s, args) => window.Close();
        window.Content = button;

        // window loads then immediately closes due to the default button being triggered
        window.ShowDialog();
    }
}
4

2 に答える 2

1

これを行うにはおそらくもっと良い方法がありますが、変更する

window.ShowDialog(); 

Dispatcher.CurrentDispatcher.Invoke(new Action(() => window.ShowDialog()));

私に意図された振る舞いを与えました。

于 2012-06-20T23:02:53.397 に答える
0

今のところ私のハッキーな解決策は、ボタンのコマンドに、コンテンツがレンダリングされた場合にのみコマンドの残りの部分の実行を許可するガード条件を設定することです(ContentRenderedイベントハンドラーで設定されたフラグによって決定されます)。私の特定のシナリオ(置換メッセージボックス)では、これは正常に機能し、1つの場所にローカライズできますが、存在する場合はより良い解決策を探しています。

更新:小さな羊の解決策(Dispatcher.Invokeにダイアログを表示)ははるかにクリーンです。

于 2012-06-21T15:43:00.010 に答える