【发布时间】:2012-07-23 11:41:22
【问题描述】:
我有一个自定义控件,需要通知父控件的布局更改。因此,如果父母重新安排孩子,我想计算新的视觉位置。不幸的是,不会调用子级上的ArrangeOverride,这是有道理的,因为子级控件内部的位置并没有真正改变。现在在布局过程中,我的自定义控件已正确定位,但未调用 ArrangeOverride。
为了让您更清楚地了解我想要实现的目标:我有一个控件,that blurs the background 提供类似航空玻璃的效果。为了实现这一点,我的控件将背景控件渲染到可视画笔中,并计算该画笔的视图框以使背景发光,然后通过模糊效果对其进行模糊处理。只要布局没有改变,它就可以正常工作。如果是这样,我需要更新画笔。我在 ArrangeOverride 方法中做到了这一点。
所以我尝试使用ArrangeOverride、MeasureOverride、Invalidating 或 Parent 失效的各种组合。起初我继承自ContentControl,但将其更改为Decorator,认为装饰器可能有一些特殊行为无用。我想尽可能避免LayoutChanged,因为这是一个非常非常邪恶的事件。我会给你一些代码,但它没有什么特别之处,我认为这是一个相当基本的问题,并没有真正绑定到我的代码。顺便说一下,布局器可以是任何东西(不仅仅是画布)。
那么我必须通过什么事件、方法或方式来了解父母告诉我的控件“我知道你没有改变任何东西,但我确实重新定位了你”。
【问题讨论】:
-
不确定,但这对您有帮助吗? - 最后一个子填充的停靠面板
-
你在孩子身上试过LayoutUpdated事件吗?
-
@Clemens 好吧,是的,这是我想采取的最后一个选择。因为就像我写了一个非常邪恶的事件,你永远不应该使用我仍然不知道微软为什么保留它,或者为什么他们以他们的方式实施它。简而言之,当任何控件更新时都会触发此事件。因此,如果您在某处有动画或鼠标悬停效果,则无论您在何处注册此事件,它都会随时调用。
-
刚刚使用 Canvas 上的派生形状做了一个非常基本的测试。它表明每当子位置发生变化时都会调用
ArrangeOverride(此处为 Canvas.Left/Top)。据我了解安排机制,每个父母必须在其所有孩子上调用Arrange,这导致在每个孩子中调用ArrangeOverride。