Silverlight: анимация VisualState каким-то образом переопределяется - PullRequest
0 голосов
/ 19 января 2010

У меня довольно сложный пользовательский элемент управления, который бы ошеломил вас, если бы я показал вам весь код. ;) В общем, это панель с несколькими элементами управления. Вы можете думать об этом как о пользовательском списке. (Пожалуйста, не говорите мне использовать список, я был там, и он не полностью отвечает моим потребностям).

Итак, я установил некоторые анимации в VisualStateManager. Вот что происходит:

  • Когда я наведите на один из моих дочерних элементов управления, я ожидаю срабатывания состояния MouseOver . Оно делает.
  • Когда я выбираю один из моих дочерних элементов управления, я ожидаю, что состояние Выбранный сработает, и это произойдет.
  • Когда я выбираю другой дочерний элемент управления, также срабатывает состояние Выбранный
  • Когда я возвращаюсь к своему первому дочернему элементу управления, который я выбрал, и select it, состояние 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 ("Inside 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 () - это просто метод, который я использую для записи условных флагов, которые я использую, чтобы определить, какое визуальное состояние вызывать.

Заранее спасибо.

1 Ответ

1 голос
/ 08 сентября 2010
...