WPF trigger che interessano valori impostati nel codice, non XAML
Domanda
Nella mia app ho bottoni a commutazione che hanno tre stati possibili; "Incontrollato", "Controllato", e "Usato Precedentemente". Quando l'utente arriva a questa schermata particolare, alcuni dei bottoni a commutazione sarà nello stato "utilizzata finora" per mostrare ciò che il lavoro è stato fatto. Clic su un pulsante di commutazione (indipendentemente dallo stato attuale) porrà in stato "controllato". Solo uno di questi bottoni a commutazione può essere verificata in un momento. I diversi stati sono indicate da diverso bagliore esterno colorato, o nessun bagliore affatto.
Per impostare il bagliore esterno per lo stato "Checked" Io uso un trigger su IsChecked euqals vero.
<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>
Per lo stato "utilizzata finora" Applico il bagliore esterno nel codice, non markup. Devo fare questo perché determinare se il pulsante dovrebbe essere in questo stato è fatto da controllo dei valori in un elenco.
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;
}
Tuttavia, quando un interruttore è scattato quando nello stato "utilizzata finora", il trigger non sembra avere alcun effetto. Il bagliore esterno non cambia.
Che cosa sto facendo di sbagliato? Sarà un trigger non effetto qualcosa che non è stato impostato in XAML?
Soluzione
Una volta impostata la DropShadowEffect
sul Button
, si sta impostando il valore locale della proprietà Button
del Effect
, che è un DependencyProperty
(Button.EffectProperty
). Il valore locale prevale su qualsiasi altro valore possibile fino a quando non viene cancellato in questo modo:
button1.ClearValue( Button.EffectProperty );
Tuttavia, che fa solo il funzionamento un po 'più complicata, perché si deve anche assicurarsi che si chiaro se è stato impostato prima e non è stato ancora chiarito.
Al contrario, è possibile creare un PreviouslyUsed
AttachedProperty ad apporre sui ToggleButton
s e utilizzare Bindings
in modo da ottenere il loro valore un po 'più automagicamente. Quindi fare riferimento a questo valore AttachedProperty nei vostri trigger e avrete un ombra per PreviouslyUsed
, e un altro per IsChecked
.
La parte dovrete cablare è il legame, e probabilmente necessario utilizzare un IValueConverter
da qualche parte per trasformare mViews[i].LocalizedName
in un true
o false
per PreviouslyUsed
.
Purtroppo, io non ne so abbastanza sulla vostra configurazione con mViews
e tale da offrire ulteriori consigli su questo. Non so se il ToggleButtons
fanno parte della associazione dati o meno. Ho il sospetto che non lo sono, come ti sembra di essere l'iterazione di una serie di loro. Se gli oggetti tenuti mViews
alla ItemsSource
di un ListBox
, ad esempio, è possibile creare un DataTemplate
che genera il ToggleButtons
con l'AttachedProperty già in atto. Che sarebbe anche semplificare la situazione IsChecked
legandosi a se tale elemento è selezionato nella ListBox
, e poi il ListBox
si prende cura di fare in modo che sia selezionata una sola.