У меня есть довольно сложный настраиваемый элемент управления, который поразит вас, если я покажу вам весь код. ;) В общем, это панель с несколькими элементами управления. Вы можете думать об этом как о настраиваемом списке. (Пожалуйста, не говорите мне использовать список, я был там, и он не полностью соответствует моим потребностям).
Итак, я установил несколько анимаций в VisualStateManager. Вот что происходит:
- Когда я нахожу на один из своих дочерних элементов управления, я ожидаю, что сработает состояние MouseOver. Оно делает.
- Когда я выбираю один из моих дочерних элементов управления, я ожидаю, что сработает состояние Выбрано, и оно сработает.
- Когда я выбираю другой дочерний элемент управления, также срабатывает состояние Выбрано.
- Когда я возвращаюсь к своему первому выбранному мной дочернему элементу управления и выбираю его, состояние Selected отображается как срабатывающее (с помощью операторов отладки в моем коде), но Отображается анимация MouseOver.
Есть ли проблема с анимацией, которую можно каким-то образом переопределить, или проблема между состояниями MouseOver и Selected, о которых я не знаю?
Вот моя разметка VSM:
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal">
<Storyboard>
<ColorAnimationUsingKeyFrames BeginTime="0" Duration="00:00:00.150000" Storyboard.TargetName="Backdrop" Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)">
<SplineColorKeyFrame KeyTime="0" Value="DarkGray"/>
</ColorAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="MouseOver">
<Storyboard>
<ColorAnimationUsingKeyFrames BeginTime="0" Duration="00:00:00.150000" Storyboard.TargetName="Backdrop" Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)">
<SplineColorKeyFrame KeyTime="0" Value="Yellow"/>
</ColorAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
<VisualStateGroup x:Name="SelectedStates">
<VisualState x:Name="Unselected">
<Storyboard>
<ColorAnimationUsingKeyFrames BeginTime="0" Duration="1" Storyboard.TargetName="Backdrop" Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)">
<SplineColorKeyFrame KeyTime="0" Value="Purple"/>
</ColorAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="Selected">
<Storyboard>
<ColorAnimationUsingKeyFrames BeginTime="0" Duration="1" Storyboard.TargetName="Backdrop" Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)">
<SplineColorKeyFrame KeyTime="0" Value="Green"/>
</ColorAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
И вот моя логика GoToState ():
private void GoToState (bool useTransitions) {TestingVariables ("Внутри GoToState");
if (_isSelected)
{
System.Diagnostics.Debug.WriteLine(_thumbnail.ShortFileName + " firing Selected VSM");
VisualStateManager.GoToState(this, "Selected", useTransitions);
}
else if (_wasSelected)
{
_wasSelected = false;
System.Diagnostics.Debug.WriteLine(_thumbnail.ShortFileName + " firing Unselected");
VisualStateManager.GoToState(this, "Unselected", useTransitions);
}
else if (_isMouseOver)
{
System.Diagnostics.Debug.WriteLine(_thumbnail.ShortFileName + " firing MouseOver VSM");
VisualStateManager.GoToState(this, "MouseOver", useTransitions);
}
else
{
System.Diagnostics.Debug.WriteLine(_thumbnail.ShortFileName + " firing Normal VSM");
VisualStateManager.GoToState(this, "Normal", useTransitions);
}
}
Итак, я могу видеть, какой метод VisualStateManger.GoToState () запущен, а вызов TestingVariables () - это всего лишь метод, который я использую для записи условных флагов, которые я использую, чтобы определить, какое визуальное состояние запускать.
Заранее спасибо.