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

时间:2008-09-30 17:49:05

标签: c# wpf events dependency-properties

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

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

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:1)

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