Как вернуться в «базовое» состояние с помощью VisualStateManager? - PullRequest
16 голосов
/ 02 октября 2009

Я знаю, что мы можем использовать

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

, чтобы войти в SomeState1, но теперь, как вернуться к базовому состоянию, как без состояния, в состояние, в котором был загружен элемент управления.

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

// OR

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

// OR

VisualStateManager.GoToState(this,null,true);

Проблема в том, что если такого способа возврата в исходное или базовое состояние не существует, мне придется всегда создавать первое состояние, а в конструкторе переходить в первое состояние в начале управления.

Я не нашел никакой документации, поэтому пробую все комбинации, но не нашел работающей ..

Ответы [ 3 ]

20 голосов
/ 14 октября 2009

Нормально! = База.

База - это просто начальное состояние элемента управления до применения любого визуального состояния (т. Е. До того, как VSM активен).

Если вы читаете эту статью в блоге Expression , есть хорошее описание, которое я поднял здесь:

... когда вы создаете свой собственный шаблон контроль или UserControl, вы должны определить состояние «по умолчанию» в каждом штате группа. Пусть контроль перейдет к тем Состояние по умолчанию при инициализации , и сделать это с подавленными переходами так что это происходит без промедления. однажды это на графике состояния, контроль готов к переходу государства в происходят, так что теперь вы можете реализовать обработчики событий, которые запускают переходы в графе состояний.

Из краткого взгляда на исходный код VSM видно, что нет никакого способа выйти из VSM и вернуться в исходное состояние Base ... так что да, вам действительно нужно состояние "Normal" (

Меня также немного раздражает, что состояние VSM не может быть легко удалено, хотя вышеприведенное решение имеет смысл. Возможно, они исправят это в будущем.

16 голосов
/ 16 октября 2009

Для этого вам необходимо сначала определить ваше "базовое" состояние.

Дело в том, что если вы определяете визуальное состояние, которое не содержит раскадровки, то это состояние будет фактически равно «базовому» состоянию - тому, в которое был загружен элемент управления.

<VisualStateGroup x:Name="TheGroup">  
    <VisualState x:Name="SomeState1">
       <Storyboard>
         ...
       </Storyboard>
    </VisualState>

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

Затем перейдите в это состояние:

VisualStateManager.GoToState( this, "BaseState", true );
5 голосов
/ 02 октября 2009

Элементы управления по умолчанию определяют «Нормальное» визуальное состояние в группе CommonStates, которое возвращается при наведении мыши и т. Д. Я думаю, вам нужно будет следовать той же схеме, что, как я полагаю, является пользовательским элементом управления?

...