4

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

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

問題は、項目をマウスでクリックした直後に ComboBox によって同じイベントが発生することです。イベント ハンドラーは、ToggleButton ではなく、CheckBox の Checked イベントのみをキャプチャする必要があると考えました。何か見逃しましたか?

編集: 以下で指摘したように、Matthew MacDonald の本「Pro WPF in C# 2010」を読んだので、このように機能すると思いました。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>  

次に、彼は特に次のように指摘しました。

注 Click イベントは、実際には ButtonBase クラスで定義され、Button クラスによって継承されます。イベント ハンドラーを ButtonBase.Click にアタッチすると、ButtonBase から派生したコントロール (Button、RadioButton、および CheckBox クラスを含む) がクリックされたときに、そのイベント ハンドラーが使用されます。イベント ハンドラーを Button.Click にアタッチすると、それは Button オブジェクトに対してのみ使用されます。

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

4

5 に答える 5

2

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

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

「ワイルドカード」イベントをサブスクライブしているため、イベント ハンドラーで送信者またはソースをチェックして、関心のあるものであることを確認できます。

編集:

本の引用に関するあなたの追加の質問に答えるために、引用は少なくとも誤解を招くと思います. から派生していないにもかかわらず、イベントにCheckBox反応することを示す反例を次に示します。ButtonCheckBoxButton

<CheckBox Button.Click="CheckBox_Click"/>

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

于 2011-05-01T16:06:05.663 に答える
1

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

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

private void OnModified(object sender, EventArgs args)
{
    if ( sender is CheckBox )
    {
        CheckBox ckBox = sender as CheckBox;
        // do stuff with ckBox
    }
}
于 2011-05-01T15:57:05.237 に答える
1

これは、両方のイベントが要素ツリーをバブルアップし、両方がハンドラーに到達するために発生します ( CheckBoxinherits 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         
}
于 2011-05-01T15:58:16.263 に答える
0

以前は、Checkbox.Checked イベントがフォーカスされているかどうかを確認して防止していました。バインディングから発火するときはフォーカスされていませんが、クリックするとフォーカスされます。

 if(cbo.IsFocused){ // code here }

お役に立てれば。ブレリム。

于 2020-04-10T12:46:06.500 に答える
-1

私は「Pro WPF in C# 2010」の作成者であり、メモ ボックスのテキストが「何を吸っていましたか?」に該当することを確認できます。カテゴリー。マークアップでの参照方法に基づく Click イベントの区別はありません。

マシュー

于 2011-05-04T15:32:30.303 に答える