2

親からのレイアウト変更を通知する必要があるカスタム コントロールがあります。したがって、親が子を再レイアウトする場合、新しい視覚的位置を計算したいと思います。残念ながらArrangeOverride、子コントロール内では位置が実際には変化しないため、子コントロールは呼び出されません。これは理にかなっています。レイアウト パスで、カスタム コントロールが適切に配置されますが、ArrangeOverride呼び出されません。私が達成しようとしていることをより明確に示すために、背景をぼかすコントロールがありますエアログラスのような効果を与えます。それを実現するために、私のコントロールは背景コントロールを視覚的なブラシにレンダリングし、そのブラシのビューボックスを計算して背景を輝かせます。次に、ぼかし効果によってぼかします。レイアウトが変わらない限り、問題なく動作します。もしそうなら、私はブラシを更新する必要があります。そして、これを ArrangeOverride メソッド内で行いました。

だから私は、無効化または親の無効化のさまざまな組み合わせArrangeOverrideを使用しようとしました。MeasureOverride最初は から継承しましContentControlたが、それを に変更しましたDecorator。これは、Decorator が役に立たない特別な動作をしている可能性があると考えたからです。LayoutChanged非常に悪質なイベントなので、できるだけ避けたいと思います。いくつかのコードを提供しますが、それについて特別なことは何もありません。私のコードに実際には縛られていない、かなり基本的な問題だと思います。ちなみに、レイアウターは(キャンバスだけでなく)何でもかまいません。では、親が私のコントロールに「あなたが何も変更していないことは知っていますが、私はあなたを再配置しました」と伝えていることを通知する必要があるイベント、メソッド、または方法は何ですか。

4

1 に答える 1

0

だから私はあまり満足していない方法でそれを修正しましたが、ぼかしコントロール自体がアニメーション化されているときのように、それを機能させるためだけに他の多くの不必要なものを解決しました. したがって、このソリューションは、何が起こっても機能するようになりました。私は LayoutUpdated イベントを回避しましたが、同様の「悪」イベントを使用しました。イベントでは、レンダリングイベントにCompositionTarget.Rendering登録し、レンダリングイベントから登録解除します。そうすれば、どのくらいの頻度で呼び出されてもかまいません。レンダリング イベント自体では、無効化コードをトリガーするだけです。イベントが頻繁に発生する場合でも、これは完全に正常に機能します。ぼかしはあまり使用しないので、パフォーマンスに大きな影響はありません...今のところ.LoadedUnloadedLoadedUnloadedVisualBrush.Viewbox

于 2012-07-23T13:33:28.377 に答える