在 ControlTemplate 中干净地跳过故事板

问题描述

我有一个用于定义 ControlTemplate 的 ToggleButton 样式。我的 ToggleButton 在更改状态时会进行动画处理,但我不希望它在导航到新页面时进行动画处理。因此,我使用 SkipStoryboardToFill 在 Loaded 事件上添加一个 EventTrigger 以避免这种行为,它可以满足我的要求。

我现在唯一的问题是,当我添加一个新的 ToggleButton 时,它会尝试跳过尚未启动的故事板,从而生成动画警告(“无法执行操作,因为指定的故事板从未应用于此对象交互式控件。”)这似乎影响了我的应用程序的性能

我可能可以解决这个问题,但我宁愿解决实际问题。有没有办法在我的 EventTrigger 中添加条件?

<ControlTemplate.Triggers>
    <EventTrigger RoutedEvent="ToggleButton.Loaded">
        <SkipStoryboardToFill BeginStoryboardName="checkedSB" />
        <SkipStoryboardToFill BeginStoryboardName="uncheckedSB" />
    </EventTrigger>
    <DataTrigger Binding="{Binding IsChecked,RelativeSource={RelativeSource Self}}" 
                 Value="true">

        <DataTrigger.Enteractions>
            <BeginStoryboard Name="checkedSB">
                <Storyboard Storyboard.TargetName="Ellipse" 
                            Storyboard.TargetProperty="Margin">
                    <ThicknessAnimation To="20 1 2 1" Duration="0:0:0.1" />
                </Storyboard>
            </BeginStoryboard>
        </DataTrigger.Enteractions>

        <DataTrigger.Exitactions>
            <BeginStoryboard Name="uncheckedSB">
                <Storyboard Storyboard.TargetName="Ellipse" 
                            Storyboard.TargetProperty="Margin">
                    <ThicknessAnimation To="2 1 2 1" Duration="0:0:0.1"/>
                </Storyboard>
            </BeginStoryboard>
        </DataTrigger.Exitactions>

    </DataTrigger>
</ControlTemplate.Triggers>

解决方法

有没有办法在我的 EventTrigger 中添加条件?

简答:否。

当引发相应的事件时,始终应用 EventTrigger

如果您想有条件地触发动画,您应该切换到使用 MultiDataTrigger 或以编程方式实现动画。