c# - 没有触发器的循环 Storyboard 动画

标签 c# .net wpf vb.net xaml

这是我的代码:

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

如果我将 ScrollingCheckerBoardBackground 样式应用于 .XAML 文件中的 ListBox,一切正常,但我想在代码隐藏,当用户单击 Button 时。它不起作用,因为未调用 EventTrigger

有没有办法在没有任何触发器的情况下为 ListBox 设置动画?

最佳答案

Is there a way to animate the ListBox without any triggers?

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

在这种情况下尝试使用DataTrigger,如果运行动画时ListBox的Tag是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";
}

编辑

您还可以像这样在代码隐藏中启动Storyboard:

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>

代码隐藏

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);
    }
}

关于c# - 没有触发器的循环 Storyboard 动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23263596/

相关文章:

c# - 以编程方式将多个 SQL 列组合并存储到一个列中

c# - 如何使用 Unity 2019.1.0f2 中的动画修复音调变换中的不一致问题

c# - 双击后 Devexpress GridContol 检查值变化

c# - 高级 WPF 验证

c# - Windows Phone MVVM + Prism --- 将事件转换为命令

c# - 在使用前预加载上下文

c# - "DateTime?"和 "DateTime"之间的差异。 (试图从日期选择器中获取值(value))

.net - .Net 标准 DLL 项目的构建文件夹中缺少 Nuget Pkg Dll。 dll 不是复制本地的吗?在 Visual Studio 2019 中修复?

c# - 在 Windows 中检查 OSX (.dmg) 文件的数字签名

c# - ComboBox - 从两个属性中选择对象