如何向Framework Element的Visibility Dependency Property添加回调?

时间:2011-10-11 14:15:13

标签: c# .net wpf dependency-properties

我正在使用一个依赖属性来处理框架元素的淡入/淡出。

只要动画元素的Visibility属性发生变化,就可以通过注册回调方法来处理淡入/淡出动画。

这是由前一个编码员完成的:

UIElement.VisibilityProperty.AddOwner(typeof (FrameworkElement), new FrameworkPropertyMetadata(Visibility.Visible, VisibilityChanged,                                                                           CoerceVisibility));

这里的问题是FrameworkElement已经是VisibilityProperty的所有者,因此触发了一个由ExpressionBlend捕捉到的异常(幸运的是)。

为了解决这个问题,我注意到依赖属性有一个“OverwriteMetadata”方法,允许有人覆盖给定类型的元数据,在我的案例中是FrameworkElement。

因此,我可以使用以下代码:

UIElement.VisibilityProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(Visibility.Visible, VisibilityChanged, CoerceVisibility));

我的问题是:

覆盖FrameworkElement的Visibility的元数据有多安全?如果它不安全,我还有其他选择吗?

编辑:好吧,从头开始......显然覆盖元数据会触发另一个例外:“PropertyMetadata已经注册了'FrameworkElement'类型。

如果我无法添加所有者或覆盖元数据,如何为依赖项属性添加回调方法?

我是否被迫创建一个派生自FrameworkElement的类,将其添加为VisibilityProperty的所有者,并使使用该属性的所有控件与派生类的类型相同?

1 个答案:

答案 0 :(得分:2)

如果没有其他钩子,您可以使用DependencyPropertyDescriptor添加更改的处理程序:

var desc = DependencyPropertyDescriptor.FromProperty(FrameworkElement.VisibilityProperty, typeof(FrameworkElement));
desc.AddValueChanged(this.OnVisibilityChanged);

但是,FrameworkElement定义了IsVisibleChanged事件 - 您可以使用它吗?