визуальный менеджер состояний wpf с условием

#wpf #animation #expression-blend

#wpf #Анимация #выражение-смешивание

Вопрос:

я пытаюсь изменить стиль itemcontainerstyle списка, изменив наведение курсора мыши и выбранное состояние.

с чем-то вроде этого

    <VisualState x:Name="MouseOver">
                                    <Storyboard>
                                        <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" Storyboard.TargetName="border">
                                            <EasingColorKeyFrame KeyTime="0" Value="#48FF5643"/>
                                        </ColorAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                                <VisualStateGroup x:Name="SelectionStates">
                                    <VisualState x:Name="Unselected"/>
                                    <VisualState x:Name="Selected">
                                        <Storyboard>
                                            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" Storyboard.TargetName="border">
                                                <EasingColorKeyFrame KeyTime="0" Value="#FFFF5643"/>
                                            </ColorAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>


                                    <VisualState x:Name="SelectedUnfocused"/>
                                </VisualStateGroup>
enter code here
 

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

я также пробовал мультитриггеры controltemplate с чем-то вроде

    <MultiTrigger.Conditions>
          <Condition Property="IsSelected" Value="False" />
          <Condition Property="IsMouseOver" Value="False" />
   </MultiTrigger.Conditions>
 

но это не сработало, и нет свойства IsMouseLeave

надеюсь, я четко объясню проблему, поэтому любая помощь приветствуется

спасибо и хорошего дня!

Ответ №1:

Гораздо проще изменить ListBoxItem.Background свойство, используя a Trigger и some SystemColors . Попробуйте это вместо:

 <ListBox ItemsSource="{Binding Days}">
    <ListBox.ItemContainerStyle>
        <Style TargetType="{x:Type ListBoxItem}">
            <Style.Resources>
                <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#FFFF5643" />
                <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="#FFFF5643" />
                <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black" />
            </Style.Resources>
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Background" Value="#48FF5643" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>
 

У меня такое ощущение, что они SystemColors могут не работать ни в Windows 8, ни в .NET 4.5, но они работают с .NET 4 и Windows 7. Дайте мне знать, если это делает то, что вы хотели.


ОБНОВИТЬ >>>

проблема заключается в mouseLeave, такого свойства у eventtriggers нет

Возможно, вам следует продолжить изучение Trigger класса?:

 <Trigger Property="IsMouseOver" Value="True">
    <Trigger.EnterActions>
        <!--Performed with MouseEnter event-->
    </Trigger.EnterActions>
    <Trigger.ExitActions>
        <!--Performed with MouseLeave event-->
    </Trigger.ExitActions>
</Trigger>
 

Комментарии:

1. да, но если выбран элемент, я не хочу, чтобы он реагировал на триггер наведения курсора мыши, решением, на мой взгляд, было бы сочетание триггеров VSM и свойств, поэтому определите выбранное состояние с помощью vsm и наведения курсора мыши с несколькими условиями: наведение курсора мыши и isselected= false . проблема заключается в mouseLeave, такого свойства у eventtriggers нет