用户更改的值或滑块上自动更改的值之间存在差异

本文关键字:之间 存在 用户 | 更新日期: 2023-09-27 18:20:05

我有一个WPF应用程序,它包含一个Slider sli,它通常会在ValueChanged-事件上激发一个方法。此外,在某些情况下,sli的最大值和最小值会发生变化。现在我已经意识到,在这些情况下,sliValue可能会在超出新的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)
{
}