用户在ValueChanged之间或在Slider上自动不同

时间:2014-08-31 16:02:34

标签: c# wpf events slider

我有一个包含Slider sli的WPF应用程序,它通常会在ValueChanged - 事件上触发一个方法。此外,在某些情况下,sli的最大值和最小值会发生变化。现在我已经意识到,在这些情况下Value sli可能会在超出新的最大/最小值范围的情况下发生变化。这也将触发ValueChanged。另外,我有时必须以编程方式调整Value,这当然也会触发`ValueChanged。

现在,我只希望在用户更改Value时执行该方法,但如果强行更改则不会执行该方法,因为它超出范围或在代码中更改时。

我的尝试是使用DragCompleted - 事件,但我确实希望在用户拖动滑块头时连续触发事件。另一种尝试是在最大/最小更改或代码内更新之前简单地从ValueChanged的事件处理程序中删除该方法,然后添加该方法。在这里,我不确定这是否真的是最干净,尤其是性能最快的解决方案。

因此,我想问一下是否有人可能有一个更好的解决方案,也许是一些实际上知道的东西,但是,我找不到关于这个主题的任何内容。

2 个答案:

答案 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)
{

}