WPF-Trigger Werte in Code zu beeinflussen, nicht XAML
Frage
In meiner app habe ich Umschaltflächen die drei möglichen Zustände haben; „Nicht aktiviert“, „Karo“ und „Früher verwendete“. Wenn der Benutzer auf diesen speziellen Bildschirm kommt, werden einige der Umschaltflächen im „Früher verwendeten“ Zustand zu zeigen, was Arbeit getan wurde. Durch Klicken auf eine Schaltfläche mit Umschaltfunktion (unabhängig von der aktuellen Zustand) findet es in den „Checked“ Zustand. Nur eine dieser Umschaltflächen können gleichzeitig geprüft werden. Die verschiedenen Zustände werden durch verschiedene farbige äußere glow angezeigt ist, oder überhaupt kein Glanz.
Um den Schein nach außen für den „Checked“ Zustand gesetzt ich einen Trigger auf IsChecked verwenden euqals wahr.
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Effect">
<Setter.Value>
<DropShadowEffect Color="Salmon" BlurRadius="40" ShadowDepth="0" Opacity="1.0"></DropShadowEffect>
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
Für den „Früher verwendeten“ Zustand ich den Schein nach außen in Code anwenden, nicht Markup. Ich muss dies tun, weil die Bestimmung, ob die Taste in diesem Zustand sein sollte, indem Sie Werte in einer Liste erfolgt.
if (mExistingViews.Contains(mViews[i].LocalizedName))
{
DropShadowEffect dse = new DropShadowEffect();
dse.ShadowDepth = 0;
dse.BlurRadius = 20;
dse.Opacity = 1.0;
dse.Color = Colors.Yellow;
mViewButtons[i].Effect = dse;
}
Wenn jedoch eine umschaltbare Schaltfläche geklickt wird, wenn sie im „Früher verwendeten“ Zustand, wird der Auslöser keine Wirkung zu haben scheint. Der äußere Schein nicht ändert.
Was mache ich falsch? Wird ein Trigger nicht etwas bewirken, die nicht in XAML festgelegt hat?
Lösung
Wenn Sie den DropShadowEffect
auf dem Button
gesetzt, Sie setzen den lokalen Wert der Button
Unterkunft Effect
, die ein DependencyProperty
(Button.EffectProperty
). Der lokale Wert hat Vorrang vor allen anderen möglichen Wert, bis es wie folgt gelöscht:
button1.ClearValue( Button.EffectProperty );
Allerdings macht, dass nur die Funktionsweise etwas gewunden, denn Sie müssen auch sicherstellen, dass Sie deutlich, wenn vor eingestellt wurde und wurde noch nicht gelöscht.
Stattdessen könnten Sie eine AttachedProperty PreviouslyUsed
erstellen, die auf den ToggleButton
s zu setzen und verwenden Bindings
, so dass sie ihren Wert ein bisschen mehr automatisch erhalten. beziehen sich dann auf diesen AttachedProperty Wert in Ihre Trigger und Sie werden ein Schlagschatten für PreviouslyUsed
haben, und eine andere für IsChecked
.
Der Teil Sie Draht haben bis ist die Bindung, und Sie werden wahrscheinlich eine IValueConverter
irgendwo zu drehen mViews[i].LocalizedName
in eine true
oder false
für PreviouslyUsed
verwenden.
Leider, ich weiß nicht genug über das Setup mit mViews
und so zu mehr Beratung darüber anbieten. Ich weiß nicht ob Ihre ToggleButtons
Teil von Datenbindung ist oder nicht. Ich vermute, dass sie nicht sind, wie Sie eine Reihe von ihnen zu sein scheinen iterieren. Wenn Sie Ihre mViews
Objekte in die ItemsSource
eines ListBox
gebunden ist, zum Beispiel, könnten Sie eine DataTemplate
erstellen, die die ToggleButtons
mit dem AttachedProperty bereits an Ort und Stelle erzeugt. Das würde auch Ihre IsChecked
Situation vereinfachen, indem sie verbindlich, ob dieses Element in den ListBox
ausgewählt ist, und dann die ListBox
kümmert, sicherzustellen, dass nur eine ausgewählt wird.