WPF:Checkbox.ComboboxのチェックされたイベントがToggleButtonとして起動されるのを防ぐ方法は?

StackOverflow https://stackoverflow.com/questions/5849353

質問

チェックボックスやコンボボックスなど、ウィンドウには多くのコントロールがあります。 Checkbox.ischeckedイベントを追跡したいので、Windowsレベルのイベントハンドラーを次のように定義しました

<Grid CheckBox.Checked="OnModified" CheckBox.Unchecked="OnModified">

問題は、マウスがアイテムをクリックした直後に同じイベントがコンボボックスによって発射されることです。私のイベントハンドラーは、チェックボックスのチェックイベントのみをキャプチャする必要があると思いました。何か逃しましたか?

編集:以下で指摘したように、読んだのでこのように機能すると思いました マシュー・マクドナルド 本 "C#2010のプロWPF". 164ページ, 、彼は最初にこの例を与えました:

<StackPanel Button.Click="DoSomething" Margin="5">   
  <Button Name="cmd1">Command 1</Button> 
  <Button Name="cmd2">Command 2</Button> 
  <Button Name="cmd3">Command 3</Button> 
  ... 
</StackPanel>  

それから、彼は特に指摘しました:

注意クリックイベントは、実際にはボタンベースクラスで定義され、ボタンクラスで継承されます。イベントハンドラーをButtonBase.clickに添付すると、そのイベントハンドラーは、ボタンベース由来のコントロールがクリックされたときに使用されます(ボタン、ラジオボタン、チェックボックスのクラスを含む)。イベントハンドラーをボタンに添付すると、ボタンオブジェクトにのみ使用されます。

さて、私は彼を誤解しましたか、それとも彼のメモは間違っていますか?

役に立ちましたか?

解決

実際には別のものはありません CheckBox.Checked イベント。このページを見ると:

そして、それを見つけます Checked イベントはそれが継承されていることがわかります ToggleButton それで ToggleButton.CheckedCheckBox.Checked 同じイベントの2つの異なる名前です。

「ワイルドカード」イベントを購読しているので、イベントハンドラーでは、送信者またはソースをチェックして、興味のあるものです。

編集:

本の引用に関する次の質問に対処するために、この引用は少なくとも誤解を招くと思います。以下は、aを示す反例です CheckBox に反応します Button でもイベント CheckBox 由来していません Button:

<CheckBox Button.Click="CheckBox_Click"/>

もちろんはありません Button.Click イベント、aのみ ButtonBase.Click イベントですが、それは引用の核心です。引用が文字通り真実である場合、この構文が許可されないか、イベントが発生しないか、どちらも真実ではありません。

他のヒント

それはあなたがグリッドにイベントを設定しているので、 Checkbox.Checked ルーティングされたイベントはイベントに応答します。あなたの場合、それは起こります ComboboxItem 同じルーティングイベントを使用します(そして、他のコントロールもおそらくそれを再利用すると確信しています)

これを処理する最も簡単な方法は、ハンドラーにテストを追加することです。

private void OnModified(object sender, EventArgs args)
{
    if ( sender is CheckBox )
    {
        CheckBox ckBox = sender as CheckBox;
        // do stuff with ckBox
    }
}

これは、両方のイベントが要素ツリーに泡立って、両方があなたのハンドラーに届くために起こります(CheckBox 継承 ToggleButton, 、したがって CheckBox.CheckedToggleButton.Checked 実際、同じイベントです)。これを防ぐことはできません。代わりにできることは、イベントが提起されたかどうかを確認することです CheckBox. 。このように行うことができます:

private void OnModified(object sender, RoutedEventArgs e)
{
    // Filter the event by its source
    if (e.Source.GetType() != typeof(CheckBox))
        return;

    // Your handling code         
}

私は「C#2010のPro WPF」の著者であり、ノートボックスのテキストが「私が喫煙していたのは何ですか?」に該当することを確認できます。カテゴリー。マークアップでどのように参照するかに基づいて、クリックイベントの間に区別はありません。

マシュー

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top