我有一个自定义控件,需要从父级通知布局更改。因此,如果父母重新开始孩子,我想计算新的视觉位置。不幸的是,孩子的ArrangeOverride
不会被调用,这是有道理的,因为这个位置在儿童控制中并没有真正发生变化。现在在布局传递中,我的自定义控件已正确定位,但未调用ArrangeOverride
。
为了让你更清楚地了解我想要实现的目标:我有一个控制,that blurs the background给出类似空气玻璃的效果。为了实现这一点,我的控件将背景控件呈现为可视画笔并计算该画笔的视图框以使背景闪耀,然后通过模糊效果模糊。只要布局没有改变,它的工作就完美了。如果是的话,我需要更新画笔。我在ArrangeOverride方法中完成了这个。
所以我尝试使用ArrangeOverride
,MeasureOverride
,无效或父无效的各种组合。起初我继承自ContentControl
,但将其更改为Decorator
,认为装饰器可能有一些特殊行为无法使用。我想尽可能地避免LayoutChanged
,因为它是一个非常非常邪恶的事件。我会给你一些代码,但没有什么特别的,我认为它是一个相当基本的问题,并没有真正绑定到我的代码。顺便说一句,布局可以是任何东西(不仅是帆布)。
那么我有什么样的事件,方法或方法可以告诉父母告诉我的控制权#34;我知道你没有改变任何事情,但我确实重新定位了你。"
答案 0 :(得分:0)
所以我以一种我不太高兴的方式修复它,但它解决了很多其他不必要的东西,只是为了使它工作,就像模糊控制本身是动画的。所以这个解决方案现在适用于所发生的任虽然我避免了LayoutUpdated事件,但我使用了类似的“邪恶”事件。 CompositionTarget.Rendering
所以在Loaded
事件中,我注册了渲染事件,在Unloaded
我从渲染事件中取消注册。这样,调用Loaded
或Unloaded
的频率无关紧要。在渲染事件本身中,我只触发VisualBrush.Viewbox
失效代码。即使事件被激活很多,这也完美无缺。我没有那么多地使用模糊,所以它不会影响性能......现在。