这是我的代码:
<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/