【发布时间】:2021-06-03 08:13:39
【问题描述】:
我有一个定义 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>
【问题讨论】:
-
您可以考虑使用多数据触发器。加载后半秒设置切换按钮的标签或附加属性。或者。使用视图模型的另一个属性与 IsLoading 标志相结合。仅当 isloading 为 false 时,才从您的 ischecked(绑定)属性的设置器中设置此属性。
-
最后,我切换到在 Checked 和 Unchecked 事件上使用 EventTriggers,它似乎工作正常。不知道为什么我没有早点想到。我真的没有可以调整的 ViewModel,ControlTemplate 在我的应用程序的资源字典中。不将此设置为答案,因为它不是实际问题的解决方案,更多的是关于 EventTriggers 中的条件。
-
啊,我被提醒为什么 EventTriggers 不是解决方案。如果在页面加载之前有任何触发它们,则情节提要已启动,但找不到 TargetName 引用的元素。
标签: c# wpf triggers controltemplate