silverlight-3.0 visualstatemanager

silverlight 3.0 - ¿Cómo volver al estado "Base" utilizando VisualStateManager?



silverlight-3.0 (3)

Sé que podemos usar

VisualStateManager.GoToState(this,"SomeState1",true);

para ingresar a SomeState1, pero ahora cómo volver al estado base, como ningún estado, el estado donde se cargó el control.

VisualStateManager.GoToState(this,"base",true); // OR VisualStateManager.GoToState(this,"",true); // OR VisualStateManager.GoToState(this,null,true);

El problema es que si no hay tal manera de volver al estado inicial o base, tendré que crear siempre un primer estado y, en el contructor, pasar al primer estado en el inicio del control.

No encontré ninguna documentación, así que estoy probando todas las combinaciones pero no encontré ninguna que funcione.


Los controles predeterminados definen un estado visual "Normal" en el grupo CommonStates, que se revertirá con el mouseout, etc. Creo que tendrá que seguir el mismo patrón para lo que supongo que es un control personalizado.


Normal! = Base.

Base es solo el estado inicial del control antes de que se aplique cualquier estado visual (es decir, antes de que el VSM esté activo).

Si lees este artículo en el blog de Expression, hay una buena descripción que he recogido aquí:

... cuando crea su propio control con plantilla o UserControl, debe definir un estado "predeterminado" en cada grupo de estado. Haga que el control vaya a los estados "predeterminados" cuando se inicializa , y hágalo con las transiciones suprimidas para que ocurra sin demora. Una vez que está en el gráfico de estado, el control está listo para que se produzcan las transiciones de estado, por lo que ahora puede implementar los controladores de eventos que activan las transiciones dentro del gráfico de estado.

Desde una breve mirada al código fuente de VSM, parece que no hay manera de salir de VSM y volver a su estado base original ... así que sí, necesita un estado "normal". :(

También me parece un poco molesto que el estado de VSM no se pueda eliminar fácilmente, aunque la solución anterior tiene sentido. Tal vez lo arreglarán en el futuro.


Para hacer esto, primero debes definir tu estado "base".

El acuerdo es, si define un estado visual que no contiene un guión gráfico, entonces este estado será efectivamente igual al estado "base", en el que se cargó el control.

<VisualStateGroup x:Name="TheGroup"> <VisualState x:Name="SomeState1"> <Storyboard> ... </Storyboard> </VisualState> <VisualState x:Name="BaseState" /> <!-- Note: the VisualState tag is empty --> </VisualStateGroup>

Luego cambia a ese estado:

VisualStateManager.GoToState( this, "BaseState", true );