3

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

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

4

3 回答 3

5

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

于 2008-09-30T23:33:59.563 回答
5

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

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

于 2008-10-01T06:49:35.837 回答
1

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

于 2008-09-30T21:51:56.393 回答