2012-07-30 4 views
5

Ho un'applicazione Silverlight 4 dove ho alcuni stati definiti in XAML, e utilizzare VisualStateManager.GoToState(this, "stateName", false) che funziona come previsto.Come aggiornare lo stato attuale con VisualStateManager

Il problema però è che alcuni di proprietà dello Stato sono destinati a l'interfaccia utente in modo che l'utente può personalizzare le cose come il colore. È possibile farlo quando ci si trova in quello stato (diciamo stato A). Le modifiche non si riflettono fino a quando non si passa a un altro stato, quindi si torna allo stato A. Il problema non è il binding dall'interfaccia utente alle proprietà sottostanti (hanno i valori previsti), ma piuttosto lo stato deve essere aggiornato - o almeno questa è la mia conclusione.

All'inizio ho appena provato VisualStateManager.GoToState(this, "StateA", false) ma ho scoperto che "if the control is already in the stateName state, GoToState takes no action returns true".

Allora ho provato senza successo, anche se non è davvero una bella soluzione:

VisualStateManager.GoToState(this, "StateB", false); 
VisualStateManager.GoToState(this, "StateA", false); 

Qualcuno sa come posso forzare un aggiornamento o una soluzione?

UPDATE: sono riuscito a farlo funzionare con una combinazione della risposta qui sotto e utilizzando il seguente codice quando la proprietà di dipendenza modificata. Il Storyboard.Stop() e Storyboard.Begin() sembravano prendere in considerazione il nuovo valore delle proprietà impostate dall'interfaccia utente.

if (VisualStateManager.GoToState(this, "StateA", false)) 
{ 
    VisualState stateA = (VisualState)VisualStateGroup.States[0]; 
    stateA.Storyboard.Stop(); 
    stateA.Storyboard.Begin(); 
} 

risposta

4

Questo codice dovrebbe funzionare:

VisualStateManager.GoToState(this, "StateB", false); 
VisualStateManager.GoToState(this, "StateA", false); 

Questo è un tipico Silverlight/WPF modo per forzare un aggiornamento. Mentre sembra hacky, ho visto questo stesso identico approccio nel codice del toolkit Microsoft e Silverlight.

Ora, la mia ipotesi è che il controllo non ha ancora caricato o non si sta invocando il cambiamento di stato quando le proprietà cambiano.

Hai bisogno di fare due cose:

  1. In OnApplyTemplate o di un evento carico del controllo, mettere il vostro controllo nello stato corretto. Le proprietà di dipendenza vengono spesso aggiornate prima che il controllo termini effettivamente il caricamento dei modelli. In questo scenario, anche se hai chiamato GoToState, non esiste un modello, quindi non farà nulla perché non esiste un modello.

  2. Assicurarsi che nel gestore Cambia proprietà della proprietà di dipendenza, che si sta chiamando i cambiamenti di stato.

per voi riferimento, si registra un gestore PropertyChanged come questo:

public static readonly DependencyProperty MinValueProperty = 
     DependencyProperty.Register("MinValue", typeof(double), typeof(ScaleValueConverter), new PropertyMetadata(0.0d,OnMinValuePropertyChanged)); 
1

In UWP XAML solo citarne de VisualStateGroup:

<VisualStateManager.VisualStateGroups> 
      <VisualStateGroup x:Name="PopupStates"> 
       <VisualState x:Name="Mobile"> 
        <VisualState.StateTriggers> 
         <AdaptiveTrigger MinWindowWidth="0"/> 
        </VisualState.StateTriggers> 

e si aggiorna lo stato facendo:

VisualStateManager.GoToState(this, PopupStates.CurrentState.Name, false);