用户更改的值或滑块上自动更改的值之间存在差异
本文关键字:之间 存在 用户 | 更新日期: 2023-09-27 18:20:05
我有一个WPF应用程序,它包含一个Slider sli
,它通常会在ValueChanged
-事件上激发一个方法。此外,在某些情况下,sli
的最大值和最小值会发生变化。现在我已经意识到,在这些情况下,sli
的Value
可能会在超出新的max/min值范围的情况下发生变化。这也将触发ValueChanged
。此外,我有时必须以编程方式调整Value
,这当然也会触发`ValueChanged。
现在,我只希望在用户更改Value
时执行该方法,但不希望在强制更改时执行,因为它超出了范围或当我在代码中更改它时。
我的尝试是使用DragCompleted
-事件,但我确实希望在用户拖动滑块头的同时继续激发该事件。另一种尝试是在最大/分钟更改或代码更新之前,简单地从ValueChanged
的事件处理程序中删除该方法,然后添加该方法。在这里,我不确定这是否真的是最干净的,尤其是最快的解决方案性能。
因此,我想问是否有人可能有一个更好的解决方案,也许是一些众所周知的东西,然而,我在这个话题上找不到任何东西。
最简单的方法是在某个地方设置一个位标志,并且只有当标志具有适当的值时才处理事件:
bool isSystemFired = false;
然后在您的事件处理程序中:
if(isSystemFired)
{
isSystemFired = false;
return;
}
而且,很明显,在您的自动化代码触发事件处理程序之前,您可以将平面设置为true
。
您可以使用Binding.SourceUpdated
事件来检测专用用户输入,而不是使用ValueChanged事件。SourceUpdated事件仅由显式用户输入触发。
在滑块上,将NotifyOnSourceUpdated
属性设置为true。
<Slider x:Name="slider" Value="{Binding SliderValue, NotifyOnSourceUpdated=True,UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"></Slider>
滑块的父容器可以处理SourceUpdate事件
<Grid Binding.SourceUpdated="Slider_TargetUpdated">
private void Slider_TargetUpdated(object sender, DataTransferEventArgs e)
{
}