【问题标题】:WPF Listview row background blinking effectWPF Listview 行背景闪烁效果
【发布时间】:2011-10-08 14:33:55
【问题描述】:

我将 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>

【问题讨论】:

  • 在我看来,当您的鼠标悬停时,它会触发背景更改。您可能需要在 Blend 中分解控件并查看是否可以。另一种可能性是你的背景上有东西,它可能仍然在后面闪烁。和 Snoop 一起看看吧。
  • 似乎列表视图默认的鼠标悬停动画正在阻止你......你可以控制这个 tru blend

标签: wpf wpf-controls binding styles


【解决方案1】:

使用StyleSnooperPeter Blois' Snoop 检查鼠标悬停在做什么。我怀疑你有一个 MouseOver 处理程序会覆盖你的 StoryBoard。您可以为不包含 MouseOver 处理程序的 ListBox 项(或其中的某些内容)创建自己的样式,或者如果您的其他条件为真,则使用 MultiTrigger 不执行 MouseOver。

【讨论】:

  • Scott 在下面的回答给出了一个很好的例子。如果您使用他的代码,请随时接受他的回答。
【解决方案2】:

这种情况需要 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 here

编辑 2:我修改了代码以使用控件模板,并添加了一组条件以在选择另一个项目时停止动画。

编辑 3:删除不需要的 IsSelected 条件。

【讨论】:

  • 我收到一个异常“‘绑定’必须具有非空值。” ,我发现它是因为 "" ,我用 但现在它根本不会触发。
  • 在我看来,列表视图的默认样式会妨碍您。使用相同的代码,但将 Storyboard.TargetProperty 更改为 Control.Foreground。我让它闪烁。
  • 带有控制模板的新示例应该适合您。
  • 谢谢你,代码仍然无法工作。应用更改后,listview 行确实闪烁不显示行列/数据。它也只在选择项目时闪烁,我希望它闪烁直到参数更改。
  • 移除 IsSelected 触发条件。我将从我的示例代码中删除它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-27
  • 1970-01-01
  • 2013-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多