有一个属性“AffectsParentArrange”隐式地使父级布局无效 - 但我想将事件处理程序附加到由该属性触发的“事件”。
当属性发生变化的子属性时,父级的排列无效。
我有一个需要接收事件的自定义控件(不是直接父级)。
有谁知道可以在这里使用的事件?
我是否需要提供一个覆盖方法并触发事件的自定义父级?
答案 0 :(得分:1)
当属性发生变化时,它只会在父级上调用InvalidateArrange()
。这会导致WPF稍后在父级上调用Arrange()
。这些调用都没有任何方法可以拦截它(不使用真正的偷偷摸摸的技术,比如修补IL代码或将调试器附加到进程中)。
这意味着编写可以检测InvalidateArrange()
的托管代码的唯一方法是创建一个覆盖ArrangeOverride
方法的自定义父代,或者点击Arrange
的某些行为有问题的特定控件的方法 - 例如,如果父级是Panel
,您可以添加一个额外的隐形子级,以便从其父级接收Arrange()
次调用。
更新当您获得Arrange()回调时,您无法检测为什么在父级上调用了InvalidateArrange(),但您可以检测具有AffectsParentArrange
标志的属性是否已更改或不是通过在每个Arrange
调用中保存属性的旧值并将其与先前保存的值进行比较。这可以使用循环,字典以及属性列表或对GetLocalValueEnumerator()
的调用扩展到多个属性。