2

我有一个自定义控件,需要通知父级的布局更改。因此,如果父母重新安排孩子,我想计算新的视觉位置。不幸ArrangeOverride的是,孩子不会被调用,这是有道理的,因为在孩子控件内部的位置并没有真正改变。现在在布局过程中,我的自定义控件被正确定位但ArrangeOverride没有被调用。为了让您更清楚地了解我想要实现的目标:我有一个控件,它模糊了背景产生类似航空玻璃的效果。为了实现这一点,我的控件将背景控件渲染到可视画笔中,并计算该画笔的视图框以使背景发光,然后通过模糊效果对其进行模糊处理。只要布局没有改变,它就可以正常工作。如果是这样,我需要更新画笔。我在 ArrangeOverride 方法中做到了这一点。

ArrangeOverride因此,我尝试使用MeasureOverrideInvalidating 或 Parent 无效的各种组合。起初我继承自ContentControl但将其更改为Decorator,认为装饰器可能有一些特殊行为无用。我想尽可能地避免LayoutChanged,因为它是一个非常非常邪恶的事件。我会给你一些代码,但它没有什么特别之处,我认为这是一个相当基本的问题,并没有真正绑定到我的代码。顺便说一下,布局器可以是任何东西(不仅仅是画布)。那么我必须通过什么事件、方法或方式来告知父母告诉我的控制“我知道你没有改变任何东西,但我确实重新定位了你”。

4

1 回答 1

0

所以我以一种我不太满意的方式修复了它,但它解决了很多其他不必要的东西,只是为了让它工作,比如当模糊控件本身被动画时。因此,无论发生什么,这个解决方案现在都适用。虽然我避免了 LayoutUpdated 事件,但我使用了类似的“邪恶”事件。CompositionTarget.Rendering所以在Loaded事件中,我注册到渲染事件,在Unloaded我从渲染事件中注销。这样,无论多久Loaded或被Unloaded调用一次都无关紧要。在渲染事件本身中,我只是触发了我的VisualBrush.Viewbox失效代码。这工作得很好,即使事件被触发了很多。我并没有过多地使用模糊,所以它不会对性能产生太大影响......现在。

于 2012-07-23T13:33:28.377 回答