WPF: Wie kann man das Kontrollkästchen verhindern. Überprüftes Ereignis daran, für Combobox als ToggleButton gefeuert zu werden?
-
27-10-2019 - |
Frage
Ich habe viele Steuerelemente in einem Fenster, einschließlich Kontrollkästchen und Comboboxen. Ich möchte das Kontrollkästchen verfolgen.
<Grid CheckBox.Checked="OnModified" CheckBox.Unchecked="OnModified">
Das Problem ist, dass das gleiche Ereignis auch von Combobox gleich nach dem Klicken der Maus auf ein Element abgefeuert wird. Ich dachte, mein Event -Handler sollte das geprüfte Ereignis von Checkbox nur erfassen, nicht um ToggleButton. Habe ich etwas vergessen?
Bearbeiten: Wie ich unten betonte, dachte ich, es würde so funktionieren, weil ich gelesen habe Matthew MacDonald's Buchen "Pro WPF in C# 2010". Auf Seite 164, Er gab diesem Beispielcode zuerst:
<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>
Dann bemerkte er speziell:
Beachten Sie, dass das Klickereignis tatsächlich in der Schaltflächenklasse definiert und von der Schaltflächenklasse geerbt wurde. Wenn Sie einen Ereignishandler an buttonbase.click anschließen, wird dieser Ereignishandler verwendet, wenn ein durch Button Base abgeleiteter Steuerelement geklickt wird (einschließlich der Schaltfläche, Radiobutton und Kontrollkästchen). Wenn Sie einen Ereignishandler an Button.click anschließen, wird er nur für Tastenobjekte verwendet.
Habe ich ihn jetzt falsch verstanden oder ist seine Notiz falsch?
Lösung
Es gibt eigentlich keine separate CheckBox.Checked
Veranstaltung. Wenn Sie sich diese Seite ansehen:
und finde das Checked
Ereignis werden Sie sehen, dass es von geerbt wird ToggleButton
Also ToggleButton.Checked
und CheckBox.Checked
sind zwei verschiedene Namen für das gleiche Ereignis.
Da Sie sich für ein "Wildcard" -Event abonnieren, können Sie den Absender oder die Quelle im Event -Handler überprüfen, um Sie zu sehen, an dem Sie interessiert sind.
Bearbeiten:
Um Ihre folgende Frage zum Buchzitat zu beantworten, denke ich, dass das Zitat zumindest irreführend ist. Hier ist ein Gegenbeispiel, das a zeigt CheckBox
reagieren auf Button
Ereignis obwohl CheckBox
ist nicht abgeleitet von Button
:
<CheckBox Button.Click="CheckBox_Click"/>
Natürlich gibt es keine Button.Click
Ereignis nur a ButtonBase.Click
Ereignis, aber das ist der Kern des Zitats. Wenn das Zitat buchstäblich wahr wäre, wäre entweder diese Syntax nicht erlaubt oder das Ereignis würde nicht ausfeuern, von denen keiner wahr ist.
Andere Tipps
Es liegt daran Checkbox.Checked
Routed Event wird auf die Veranstaltung reagieren. In Ihrem Fall kommt es vor, dass die ComboboxItem
Verwendet das gleiche Routed -Ereignis (und ich bin sicher, dass andere Steuerelemente es wahrscheinlich auch wiederverwenden).
Der einfachste Weg, dies zu bewältigen, wäre, Ihrem Handler einen Test hinzuzufügen, so ähnlich:
private void OnModified(object sender, EventArgs args)
{
if ( sender is CheckBox )
{
CheckBox ckBox = sender as CheckBox;
// do stuff with ckBox
}
}
Dies geschieht, weil beide Ereignisse den Elementbaum aufsprudeln und beide Ihren Handler erreichen (CheckBox
Erben ToggleButton
, somit CheckBox.Checked
und ToggleButton.Checked
sind in der Tat die gleichen Ereignisse). Sie können dies nicht verhindern. Was Sie stattdessen tun können, ist zu prüfen, ob die Veranstaltung von a angehoben wurde CheckBox
. Es kann so gemacht werden:
private void OnModified(object sender, RoutedEventArgs e)
{
// Filter the event by its source
if (e.Source.GetType() != typeof(CheckBox))
return;
// Your handling code
}
Ich bin der Autor von "Pro WPF in C# 2010" und kann bestätigen, dass der Text aus dem Notizfeld unter das "Was rauchte ich?" Kategorie. Es gibt keine Unterscheidung zwischen dem Click -Ereignis, basierend darauf, wie Sie sich in Ihrem Markup darauf beziehen.
Matthew