【问题标题】:Looping Storyboard Animation Without Trigger在没有触发器的情况下循环故事板动画
【发布时间】:2014-04-24 08:23:02
【问题描述】:

这是我的代码:

<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 设置动画?

【问题讨论】:

    标签: c# .net wpf vb.net xaml


    【解决方案1】:

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

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

    在这种情况下尝试使用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";
    }
    

    Edit

    您也可以像这样在代码隐藏中启动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>
    

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

    【讨论】:

    • 谢谢,但有更好的解决方案吗?你不觉得这有点丑吗?
    • @Zuck:This is somewhat ugly don't you think,要启动动画,您需要特定的动作或事件,请参阅我的答案编辑。没有事件,所以我不认为这是一个丑陋的决定。您还可以添加附加的依赖属性,例如 IsStartAnimate 并将其绑定到 DataTrigger。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 2016-05-15
    • 1970-01-01
    • 2016-07-13
    • 2015-09-27
    相关资源
    最近更新 更多