激活故事板所需的丑陋的C#WPF代码

时间:2016-02-24 23:00:42

标签: c# wpf xaml

为了激活我通过XAML声明的故事板,我发现我正在编写以下丑陋的代码序列而不是很多;

(SomeElement.TryFindResource("SomeStoryboard") as Storyboard)?.Begin();

我真正喜欢的只是写作;

SomeStoryboard.Begin();

有没有什么方法可以更直接地声明/解决故事板?这将有助于代码可读性,并且还允许编译时而不是C#

中对象的运行时解析

3 个答案:

答案 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;
        }
    }