问题描述
我的问题似乎与其他所有人的问题相反。我的WPF DataTrigger有时会触发 ,即使与其绑定的viewmodel属性没有更改 。我已将日志记录代码放在属性本身中,以确保它没有更改。
是否有一些简单的方法可以确定为什么要触发动画?我可以订阅一些事件,让我在自己的代码中放置一个断点,并在动画触发时查看调用堆栈吗?
这是情节提要。只需在1秒钟内将0到1的两倍动画。双人间将存储在FrameworkElement.Tag
中<Storyboard x:Key="TagZeroToOne" x:Shared="False">
<DoubleAnimation Storyboard.TargetProperty="Tag" From="0" To="1" Duration="0:0:1.0" />
</Storyboard>
这是在DataTrigger中使用它的样式的相关部分。 (我省略了项目模板和面板)
<!-- Style for ItemsControl that draws circular handles when ShapeVm is selected -->
<Style x:Key="ShapeHandlesItemsControlStyle" targettype="{x:Type ItemsControl}">
<d:Style.DataContext>
<x:Type Type="gci:ShapeVm" />
</d:Style.DataContext>
<!-- Default style value of ItemsControl.Tag" property is 1.0 -->
<Setter Property="Tag">
<Setter.Value>
<sys:Double>1.0</sys:Double>
</Setter.Value>
</Setter>
<!--
We cannot animate Opacity directly because its max value depends upon
a binding but we be we can make it be dependent upon another property
"Tag" that we *do* animate. This requires a Math Converter as well
Picked up this technique from the following SO question
https://stackoverflow.com/questions/2186933/wpf-animation-binding-to-the-to-attribute-of-storyboard-animation/14164245#14164245
-->
<Setter Property="Opacity">
<Setter.Value>
<MultiBinding Converter="{StaticResource CvtMath}"
ConverterParameter="1.0 - (x *(1.0-y))"> <!-- Calculation -->
<Binding Path="Tag" RelativeSource="{RelativeSource Self}" /> <!-- Animated operand (0.0 to 1.0) -->
<Binding ElementName="Root" Path="ShapeHandleOpacity" /> <!-- Configured opacity operand -->
</MultiBinding>
</Setter.Value>
</Setter>
<!-- When ShapeVm.IsSelected becomes true,animate the ItemsControl.Tag from 0 to 1.0 -->
<Style.Triggers>
<DataTrigger Binding="{Binding IsSelected}" Value="True">
<DataTrigger.Enteractions>
<BeginStoryboard Storyboard="{StaticResource TagZeroToOne}" />
</DataTrigger.Enteractions>
</DataTrigger>
</Style.Triggers>
这个想法是,当用户第一次选择形状时,我的后台代码将其IsSelected属性设置为“ true”。这使动画着火了,我看到了与动画有关的视觉效果。但这应该就是这样。
相反,似乎几乎每隔一次我单击相关对象,动画就会触发,并且看到效果。但是,我已通过日志记录和断点(反复)验证了IsSelected属性此后再也不会更改。没有人设置它。没有人为此触发PropertyChanged通知,据我所知,甚至没有人触发PropertyChanged(null)。
这是ShapeVm.IsSelected属性
private bool _isSelected;
public bool IsSelected
{
get => _isSelected;
set
{
if (value == _isSelected)
return;
_isSelected = value;
Debug.WriteLine($"Shape selected change to {value}");
}
}
那么我如何确定WPF为何触发此触发器?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)