Анимация того же свойства из взаимоисключающих VisualStateGroups - PullRequest
1 голос
/ 12 сентября 2010

У меня простой вопрос: возможно ли это?

Предположим, я хочу задать стиль ListBoxItem таким, чтобы он имел черный передний план по умолчанию, синий при выборе и красный, когда мышь над ним,В итоге получилось что-то вроде этого:

<!-- assume the default foreground color is black -->
<ControlTemplate TargetType="ListBoxItem">
    <Grid Background="{TemplateBinding Background}">
        <VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="CommonStates">
                <VisualState x:Name="Normal"/>

                <VisualState x:Name="MouseOver">
                    <Storyboard>
                        <ColorAnimation Duration="0:0:0.2" To="Red" Storyboard.TargetName="contentControl" Storyboard.TargetProperty="(Control.Foreground).(SolidColorBrush.Color)"/>
                    </Storyboard>
                </VisualState>
            </VisualStateGroup>

            <VisualStateGroup x:Name="SelectionStates">
                <VisualState x:Name="Unselected"/>

                <VisualState x:Name="Selected">
                    <Storyboard>
                        <ColorAnimation Duration="0:0:0.2" To="Blue" Storyboard.TargetName="contentControl" Storyboard.TargetProperty="(Control.Foreground).(SolidColorBrush.Color)"/>
                    </Storyboard>
                </VisualState>
            </VisualStateGroup>
        </VisualStateManager.VisualStateGroups>

        <ContentControl x:Name="contentControl" Foreground="{TemplateBinding Foreground}" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}"/>
    </Grid>
</ControlTemplate>

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

Если ListBoxItem выбран и правильно отображается синим цветом, при наведении курсора на него он снова становится черным, поскольку он возвращается кнормальное состояние.

Можно ли мне как-то справиться с этим, не прибегая к подклассам ListBoxItem и не добавляя свои собственные пользовательские состояния?Все, что я прочитал, говорит о том, что это невозможно, но мне кажется, что это смехотворно ограничивает меня.Чего мне не хватает?

1 Ответ

3 голосов
/ 12 сентября 2010

Вы в основном просите, чтобы передний план был черным и синим одновременно. Теперь это просто невозможно. Этот конфликт может быть разрешен, если отдельные состояния имеют приоритет, например MouseOver> Selected> Normal> Unselected. Но это привело бы к ненужному усложнению для уже сложного менеджера визуального состояния. Обычно эта ситуация разрешается путем добавления нового элемента и анимации свойств этого элемента в одной из конфликтующих групп состояний.

...