为了激活我通过XAML声明的故事板,我发现我正在编写以下丑陋的代码序列而不是很多;
(SomeElement.TryFindResource("SomeStoryboard") as Storyboard)?.Begin();
我真正喜欢的只是写作;
SomeStoryboard.Begin();
有没有什么方法可以更直接地声明/解决故事板?这将有助于代码可读性,并且还允许编译时而不是C#
中对象的运行时解析答案 0 :(得分:4)
对于简单方案,您应该使用Trigger
/ DataTrigger
而不是直接管理故事板。这是一个例子:
<DataTrigger Binding="{Binding IsAnimationEnabled}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard x:Name="MyStoryBoard" Storyboard="{StaticResource MyStoryBoardResourceKey}"/>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<RemoveStoryboard BeginStoryboardName="MyStoryBoard"/>
</DataTrigger.ExitActions>
</DataTrigger>
IsAnimationEnabled
是您的viemodel(或视图)上的一些Boolean
属性,您可以从代码中设置该属性以启用或禁用动画。
答案 1 :(得分:1)
另一个选择是使用EventTriggers
,如下所示:
<Style TargetType="TextBlock">
<Style.Triggers>
<EventTrigger RoutedEvent="MouseEnter">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Duration="0:0:0.300" Storyboard.TargetProperty="FontSize" To="28" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="MouseLeave">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Duration="0:0:0.800" Storyboard.TargetProperty="FontSize" To="18" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Style.Triggers>
</Style>
答案 2 :(得分:0)
不确定这是否对您有所帮助,但如果您确定该资源在那里,您可以在窗口上拥有一个私有变量,并在构造函数中初始化它,如:
private Storyboard SomeStoryboard;
public MainWindow()
{
InitializeComponent();
Storyboard = SomeElement.TryFindResource("SomeStoryboard") as Storyboard;
}
然后使用它。你必须检查空值。
或者您可以编写只读属性包装器:
private Storyboard SomeStoryboard
{
get
{
var someStoryboard = SomeElement.TryFindResource("SomeStoryboard") as Storyboard;
if (someStoryboard == null)
{
throw new InvalidOperationException("SomeStoryboard is not found");
//or
someStoryboard = new Storyboard();
}
return someStoryboard;
}
}