【问题标题】:Setting WPF dependency property without triggering events在不触发事件的情况下设置 WPF 依赖属性
【发布时间】:2008-09-30 17:49:05
【问题描述】:

我需要在我的代码中为控件 (Slider.Value) 设置依赖属性,而不触发 ValueChanged 事件(因为我设置了值,而不是用户)。在 WPF 中处理这种情况的最佳方法是什么?

为了澄清,我想要做的是将 WPF 滑块连接到 WinForms 用户控件。目前在我的应用程序中,我有一个 ValueChanged 事件处理程序,它通过方法调用将滑块值传递给 WinForms 控件。 WinForms 控件(实际上是原生 OpenGL 窗口的包装器)需要能够根据其内部计算动态更改滑块。为此,我使用了一个滑块 (ISlider) 的抽象,我在我的应用程序中实例化了该滑块的 WPF 风格,并通过 WinForms 用户控件上的 .NET 属性将一个句柄传递给 WinForms 控件。所有这些目前都在工作,只是当内部逻辑决定滑块需要更改时,它调用 ISlider::SetPos(),然后更改 WPF 滑块,然后在滑块上触发 ValueChanged 事件,以及处理程序对于该事件,提取滑块的位置并将其传递给最初发起该事件的 WinForms 控件。 ligaz 和 Alan Le 的建议似乎都应该奏效,但我不确定我是否会以最好的方式解决这个问题。

【问题讨论】:

    标签: c# wpf events dependency-properties


    【解决方案1】:

    这是一个简单的解决方法/hack。添加一个布尔值来跟踪您是否更改了设置,比如说“IsChangedByMe”。当您在代码中更改依赖属性时,将 bool 设置为 true。在 ValueChanged 事件中,如果 IsChangedByMe 为 true,则不执行任何操作。

    【讨论】:

    • 太棒了。以前,我每次需要临时禁用回调时,都注销事件,更改值,然后重新注册事件。这更简单、更高效。
    【解决方案2】:

    你确定你真的想这样做吗?如果有一段 UI 数据绑定到该属性,并且您允许在不触发 ValueChanged 事件的情况下更改值,那么您很快就会发现您的 UI 不再与数据同步。

    对于您的滑块,假设用户将其放置在 75%。现在您的代码在后台将其更改为 10%,但抑制了更改通知。它在屏幕上看起来仍然像 75%(因为它没有被告知它已更改),但它被正在运行的代码用作 10%。听起来像是混乱的秘诀。

    【讨论】:

    • 我明白你的意思——我没想到事件也会朝着这个方向发展。我将在问题中提供更多细节 - 也许我以错误的方式解决这个问题......
    • 虽然你是对的,但我想提出一个同样有问题的例子。假设您使用滑块显示音频文件的播放进度。用户可以手动滑动滑块以跳过,但随着文件自然播放,它的句柄也需要每秒更新一次。通过更新该值以使 UI 与播放保持同步,您最终会触发用于更改播放位置的更改事件。
    【解决方案3】:

    一种可能的解决方案是从 Slider 派生并覆盖 OnValueChanged(...)。当您不想引发事件时,您应该什么都不做,否则您应该调用基本实现。

    【讨论】:

      猜你喜欢
      • 2016-04-04
      • 2021-11-08
      • 2011-01-03
      • 2011-08-04
      • 1970-01-01
      • 2011-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多