我有一个包含Slider sli
的WPF应用程序,它通常会在ValueChanged
- 事件上触发一个方法。此外,在某些情况下,sli
的最大值和最小值会发生变化。现在我已经意识到,在这些情况下Value
sli
可能会在超出新的最大/最小值范围的情况下发生变化。这也将触发ValueChanged
。另外,我有时必须以编程方式调整Value
,这当然也会触发`ValueChanged。
现在,我只希望在用户更改Value
时执行该方法,但如果强行更改则不会执行该方法,因为它超出范围或在代码中更改时。
我的尝试是使用DragCompleted
- 事件,但我确实希望在用户拖动滑块头时连续触发事件。另一种尝试是在最大/最小更改或代码内更新之前简单地从ValueChanged
的事件处理程序中删除该方法,然后添加该方法。在这里,我不确定这是否真的是最干净,尤其是性能最快的解决方案。
因此,我想问一下是否有人可能有一个更好的解决方案,也许是一些实际上知道的东西,但是,我找不到关于这个主题的任何内容。
答案 0 :(得分:1)
最简单的方法是在某处设置位标志,只在标志具有适当值时才处理事件:
bool isSystemFired = false;
然后在你的事件处理程序中:
if(isSystemFired)
{
isSystemFired = false;
return;
}
显然,在自动代码执行任何操作以触发事件处理程序之前,您可以将单位设置为true
。
答案 1 :(得分:1)
您可以使用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)
{
}