Эффект мигающего фона строки списка WPF Listview - PullRequest
4 голосов
/ 19 июля 2011

Я использую WPF с элементом управления ListView.

Когда для определенного параметра установлено значение True, я хочу, чтобы строка в ListView имела мигающую анимацию.

У меня есть следующий код, который работает, но анимация останавливается, когда мышь находится над строкой с анимацией.

Я хочу, чтобы анимация продолжалась до тех пор, пока параметр не будет изменен на False.

<ListView.ItemContainerStyle>
    <Style TargetType="ListViewItem">
        <Setter Property="IsSelected" Value="{Binding Selected}"/>
        <Style.Triggers>
            <DataTrigger Binding="{Binding DoBlink}" Value="True">
                <DataTrigger.EnterActions>
                    <BeginStoryboard>
                        <Storyboard FillBehavior="Stop">
                            <ColorAnimation Storyboard.TargetProperty="(Control.Background).(SolidColorBrush.Color)" 
                                            From="Blue" To="LightBlue" Duration="0:0:0.2"
                                            AutoReverse="True" RepeatBehavior="Forever" />
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.EnterActions>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</ListView.ItemContainerStyle>

Ответы [ 2 ]

7 голосов
/ 19 июля 2011

В этой ситуации потребуется MultiDataTrigger. Попробуйте что-то вроде этого.

<Style
        TargetType="{x:Type ListViewItem}">
        <Setter Property="IsSelected" Value="{Binding Selected}"/>
        <Setter
            Property="Template">
            <Setter.Value>
                <ControlTemplate
                    TargetType="{x:Type ListViewItem}">
                    <Border
                        Name="Border"
                        SnapsToDevicePixels="True"
                        Padding="2,2,2,2"
                        Background="Transparent">
                        <ContentPresenter />
                    </Border>
                    <ControlTemplate.Triggers>
                        <MultiDataTrigger>
                            <MultiDataTrigger.Conditions>
                                <Condition
                                    Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=IsMouseOver}"
                                    Value="True" />
                     <Condition
                        Binding="{Binding DoBlink}"
                        Value="True" />
                            </MultiDataTrigger.Conditions>
                            <MultiDataTrigger.EnterActions>
                                <BeginStoryboard
                                    Name="Flash">
                                    <Storyboard
                                        FillBehavior="Stop">
                                        <ColorAnimation
                                            Storyboard.TargetProperty="Background.Color"
                                            Storyboard.TargetName="Border"
                                            From="Blue"
                                            To="LightBlue"
                                            Duration="0:0:0.2"
                                            AutoReverse="True"
                                            RepeatBehavior="Forever" />

                                    </Storyboard>
                                </BeginStoryboard>
                            </MultiDataTrigger.EnterActions>
                        </MultiDataTrigger>
                        <MultiDataTrigger>
                            <MultiDataTrigger.Conditions>
                                <Condition
                                    Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=IsMouseOver}"
                                    Value="False" />
                                <Condition
                                    Binding="{Binding DoBlink}"
                                    Value="True" />
                            </MultiDataTrigger.Conditions>
                            <MultiDataTrigger.EnterActions>
                                <StopStoryboard
                                    BeginStoryboardName="Flash" />
                            </MultiDataTrigger.EnterActions>
                        </MultiDataTrigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style> 

Вам также потребуется использовать MultiDataTrigger, чтобы остановить анимацию, когда условие соответствует, когда вы хотите, чтобы оно остановилось.

РЕДАКТИРОВАТЬ: Вы можете прочитать о MultiDataTriggers здесь

РЕДАКТИРОВАТЬ 2: я изменил код для работы с шаблоном элемента управления и добавил набор условий, чтобы остановить анимацию при выборе другого элемента.

РЕДАКТ. 3: Удалить ненужное условие IsSelected.

2 голосов
/ 19 июля 2011

Используйте StyleSnooper или Snoop Питера Блуа , чтобы проверить, что делает MouseOver.Я подозреваю, что у вас есть обработчик MouseOver, который переопределяет вашу StoryBoard.Вы можете создать свой собственный стиль для своих элементов ListBox (или чего-то внутри них), который не включает обработчик MouseOver, или использовать MultiTrigger, чтобы не выполнять MouseOver, если ваше другое условие истинно.

...