不需要触发的循环故事板动画

5
这是我的代码:
<DrawingBrush Viewport="0,0,16,16" ViewportUnits="Absolute" Stretch="None" TileMode="Tile" x:Key="dbCheckerBoard">
    <DrawingBrush.Drawing>
        <DrawingGroup>
            <GeometryDrawing Brush="Black">
                <GeometryDrawing.Geometry>
                    <GeometryGroup>
                        <RectangleGeometry Rect="0,0,8,8"/>
                        <RectangleGeometry Rect="8,8,8,8"/>
                    </GeometryGroup>
                </GeometryDrawing.Geometry>
            </GeometryDrawing>
        </DrawingGroup>
    </DrawingBrush.Drawing>
</DrawingBrush>
<Style x:Key="ScrollingCheckerBoardBackground" TargetType="Control">
    <Setter Property="Background" Value="{StaticResource dbCheckerBoard}" />
    <Style.Triggers>
        <EventTrigger RoutedEvent="Control.Loaded">
            <BeginStoryboard>
                <Storyboard>
                    <RectAnimation Storyboard.TargetProperty="Background.Viewport" From="0 0 16 16" To="16 16 16 16" Duration="0:0:1" RepeatBehavior="Forever" />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Style.Triggers>
</Style>

如果我在XAML文件中将ScrollingCheckerBoardBackground样式应用于我的ListBox,一切都正常,但是我想在代码后台中应用样式,当用户单击按钮时。这不起作用,因为EventTrigger没有被调用。
有没有一种方法可以在没有任何触发器的情况下对ListBox进行动画处理?
1个回答

4

有没有一种方法可以在没有任何触发器的情况下动画化ListBox?

不,要启动动画,您需要特定的操作或事件。

在这种情况下,请尝试使用DataTrigger,如果ListBox的标记为ShowAnimation时运行动画:

<Style x:Key="ScrollingCheckerBoardBackground" TargetType="Control">
    <Setter Property="Background" Value="{StaticResource dbCheckerBoard}" />

    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=Tag, RelativeSource={RelativeSource Mode=Self}}" Value="ShowAnimation">
            <DataTrigger.EnterActions>
                <BeginStoryboard>
                    <Storyboard>
                        <RectAnimation Storyboard.TargetProperty="Background.Viewport" From="0 0 16 16" To="16 16 16 16" Duration="0:0:1" RepeatBehavior="Forever" />
                    </Storyboard>
                </BeginStoryboard>
            </DataTrigger.EnterActions>    
        </DataTrigger>
    </Style.Triggers>
</Style>

在代码后台写入以下内容:

private void Button_Click(object sender, RoutedEventArgs e)
{
    MyListBox.Tag = "ShowAnimation";
}

编辑

您也可以在代码后台像这样启动故事板

XAML

<Window.Resources>
    ...
    <Storyboard x:Key="MyStoryboard">
        <RectAnimation Storyboard.TargetProperty="Background.Viewport" From="0 0 16 16" To="16 16 16 16" Duration="0:0:1" RepeatBehavior="Forever" />
    </Storyboard>

    <Style x:Key="ScrollingCheckerBoardBackground" TargetType="Control">                       
        <Setter Property="Background" Value="{StaticResource dbCheckerBoard}" />           
    </Style>        
</Window.Resources>

<Grid>
    <ListBox Name="MyListBox" 
             Style="{StaticResource ScrollingCheckerBoardBackground}" 
             Tag="Null" 
             Width="100" 
             Height="30" />    

    <Button VerticalAlignment="Bottom" Content="Click" Click="Button_Click" />
</Grid>

Code-behind

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();          
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        var story = (Storyboard)this.FindResource("MyStoryboard");

        if (story != null)
            story.Begin(MyListBox, true);
    }
}

1
谢谢,但有更好的解决方案吗?你觉得这有点丑陋,不是吗? - Elmo
@Zuck: “这有点丑,你不觉得吗?”要启动动画,您需要特定的操作或事件,请参见我编辑的答案。没有此类事件,因此我认为这不是一个丑陋的决定。您还可以添加附加依赖属性,例如“IsStartAnimate”,并在DataTrigger中绑定它。 - Anatoliy Nikolaev
额外建议:如果您想要动画在没有触发器的情况下开始,可以直接将“Tag =” ShowAnimation“”添加到您的ListBox中,这种情况下不需要“Button_Click事件”,只有当您需要手动触发时才需要它。在您的情况下,他提供的Xaml代码已足够,您只需要直接将“Tag =” ShowAnimation“”添加到您的图像中,一旦启动应用程序,ListBox将自动进行动画处理,无需任何触发器 @埃尔莫 - RAMM-HDR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接