2012-07-30 13 views
5

Tengo una aplicación Silverlight 4 donde tengo algunos estados definidos en XAML y uso VisualStateManager.GoToState(this, "stateName", false) que funciona como se esperaba.Cómo actualizar el estado actual con VisualStateManager

El problema, sin embargo, es que algunas de las propiedades del estado están vinculadas a la interfaz de usuario, por lo que el usuario puede personalizar cosas como el color. Es posible hacer esto cuando se encuentre en ese estado (digamos estado A). Los cambios no se reflejan hasta que cambie a otro estado y vuelva al estado A. El problema no es la vinculación de la UI con las propiedades subyacentes (tienen los valores esperados), sino que el estado debe actualizarse, o al menos esa es mi conclusión.

Al principio simplemente probé VisualStateManager.GoToState(this, "StateA", false) pero descubrí que "if the control is already in the stateName state, GoToState takes no action returns true".

Luego trató sin éxito, a pesar de que en realidad no es una buena solución:

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

¿Alguien sabe cómo puedo forzar una actualización, o una solución?

ACTUALIZACIÓN: que logró conseguir que funcione con una combinación de la respuesta de abajo y usando el siguiente código cuando la propiedad de dependencia cambió. El Storyboard.Stop() y el Storyboard.Begin() parecían tener en cuenta el nuevo valor de las propiedades establecidas desde la interfaz de usuario.

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

Respuesta

4

Este código debería funcionar:

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

Esa es una forma típica de Silverlight/WPF para forzar una actualización. Si bien parece cursi, he visto este mismo enfoque en el código del kit de herramientas de Microsoft y Silverlight.

Ahora, supongo que el control no se ha cargado todavía o no está invocando el cambio de estado cuando cambian las propiedades.

que tiene que hacer dos cosas:

  1. En OnApplyTemplate o evento cargado del control, poner el control en el estado adecuado. DependencyProperties a menudo se actualizan antes de que el control realmente termine de cargar las plantillas. En este escenario, incluso si llamó a GoToState, no hay plantilla, por lo que no hará nada porque no hay plantilla.

  2. Asegúrese de que en el controlador de cambio de propiedad para la propiedad de dependencia, llame a los cambios de estado.

para usted referencia, se registra un manejador PropertyChanged así:

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

En uwp XAML sólo el nombre de VisualStateGroup:

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

y actualiza el estado haciendo:

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