设置WPF依赖项属性而不触发事件

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

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

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

你确定你真的想这样做吗? 如果有一个UI数据绑定到该属性并允许更改值而不触发ValueChanged事件,则很快就会终止UI不再与数据同步。

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

一种可能的解决方案是从Slider派生并覆盖OnValueChanged(…) 。 如果您不想提出事件,则不应该执行任何操作,否则应调用基本实现。