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?

È stato utile?

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 ToggleButtons 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top