当您不是父级时,如何监听AffectsParentArrange事件

时间:2009-11-11 18:13:56

标签: wpf wpf-controls wpftoolkit

有一个属性“AffectsParentArrange”隐式地使父级布局无效 - 但我想将事件处理程序附加到由该属性触发的“事件”。

当属性发生变化的子属性时,父级的排列无效。

我有一个需要接收事件的自定义控件(不是直接父级)。

有谁知道可以在这里使用的事件?

我是否需要提供一个覆盖方法并触发事件的自定义父级?

1 个答案:

答案 0 :(得分:1)

当属性发生变化时,它只会在父级上调用InvalidateArrange()。这会导致WPF稍后在父级上调用Arrange()。这些调用都没有任何方法可以拦截它(不使用真正的偷偷摸摸的技术,比如修补IL代码或将调试器附加到进程中)。

这意味着编写可以检测InvalidateArrange()的托管代码的唯一方法是创建一个覆盖ArrangeOverride方法的自定义父代,或者点击Arrange的某些行为有问题的特定控件的方法 - 例如,如果父级是Panel,您可以添加一个额外的隐形子级,以便从其父级接收Arrange()次调用。

更新当您获得Arrange()回调时,您无法检测为什么在父级上调用了InvalidateArrange(),但您可以检测具有AffectsParentArrange标志的属性是否已更改或不是通过在每个Arrange调用中保存属性的旧值并将其与先前保存的值进行比较。这可以使用循环,字典以及属性列表或对GetLocalValueEnumerator()的调用扩展到多个属性。