【问题标题】:Differ between ValueChanged by user or automatically on SliderValueChanged 由用户更改或在 Slider 上自动更改
【发布时间】:2014-08-31 16:02:33
【问题描述】:

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

现在,我只希望在用户更改 Value 时执行该方法,而不是在它被强制更改时执行,因为它超出范围或当我在代码中更改它时。

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

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

【问题讨论】:

    标签: c# wpf events slider


    【解决方案1】:

    最简单的方法是在某处设置位标志,并且仅在标志具有适当值时处理事件:

    bool isSystemFired = false;
    

    然后在您的事件处理程序中:

    if(isSystemFired)
    {
        isSystemFired = false;
        return;
    }
    

    而且,显然,在您的自动化代码执行任何操作来触发事件处理程序之前,您可以将平面设置为 true。

    【讨论】:

    • 感谢您的回答。在这里,我可能会看到性能方面的一个小问题(我不知道有多大)。每当用户拖动滑块时,在代码中,如果那是用户事件还是系统事件,我将不得不每秒检查多次。但是,是的,您是对的,这显然是一个非常简单快捷的解决方案!
    【解决方案2】:

    您可以使用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)
    {
    
    }
    

    【讨论】:

    • 感谢您的回答 Postlagerkarte。这看起来确实是一种有趣且很好的方法,但是当我拖动滑块时,该事件会持续触发吗?如果你只在SourceUpdated 上得到一个触发器,在我看来你只会得到一个事件,还是我理解错了?
    • 如果您设置 UpdateSourceTrigger=PropertyChanged,则滑块上的每个刻度都会引发事件。
    • 我刚刚尝试了您的解决方案,但从未触发该事件。不是当我更改滑块值时,也不是当它在代码中更改时。有什么遗漏吗?
    • 您必须将 Binding.SourceUpdated 放在滑块的父控件上,而不是放在滑块本身上。在滑块上,您必须设置 NotifyOnSourceUpdated。您可以发布您的代码吗?
    • 我已经做到了,正如你所说:&lt;Grid Binding.SourceUpdated="Slider_TargetUpdated" Background="White"&gt;&lt;Slider x:Name="Slider1" Value="{Binding SliderValue, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/&gt;&lt;/Grid&gt; 在我的MainWindow-code 中我有处理程序private void Slider_TargetUpdated(object sender, DataTransferEventArgs e) { isTriggered = true; }
    猜你喜欢
    • 2016-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 2021-07-11
    • 1970-01-01
    相关资源
    最近更新 更多