5

詳細を表示するために多くのレンダリングを行う非常に大きな子コントロールがありますが、そのコントロールの一部のみが実際に表示されるため (直接の親ではなく、階層のさらに上の何かによってクリップされます)、レンダリングのみが必要です。 OnRender 呼び出し中の可視部分。

次の図を考えてみましょう。子は 100x50 ですが、可視領域は子座標の (10,5) と (100,50) に角がある長方形です。それが私たちが探しているエリアです。

クリップされた子

注: クリッピングを行っているのは親ではない可能性があるため、子から親への座標変換を単純に実行してクリッピングをテストすることはできません。

ScrollViewer 内にネストされた Canvas コントロールを検討してください。内側の Canvas は、外側の Canvas の境界内に完全に配置される可能性がありますが、外側の Canvas は ScrollViewer によってクリップされる可能性があるため、内側の Canvas も視覚的にクリップされます。

ビジュアル ツリーをたどって各親をテストすると、パフォーマンスが低下します。

コントロールの可視領域の境界を取得できる WPF に組み込まれているものはありますか?

4

1 に答える 1

0

一般に、OnRender メソッド内では、Z オーダーに細心の注意を払って可視アイテムを構成またはレンダリングする必要がありますが、可視アイテムについて心配することに必ずしも時間を費やす必要はありません。これは C++ ではありません。WPF の設計の背後にある理由の 1 つは、表示されるものと表示されないものをシステムが判断できるようにする必要があるということです。やや高いレベルの抽象化を意図しています。何が表示されているか、およびその表示部分の境界が何であるかをテストするコードを書いていることがわかった場合は、おそらくそれを正しく使用していません。少し怠け者になってください。これ(あなたが上で説明したこと)は非常に単純であるはずです。

表示されているオブジェクトが上下にスライドしたり、垂直方向 (Z オーダー) で移動したりすると、単に表示されるかどうかが決まります。Z オーダー内の位置に関係なく何かを非表示にしたい場合は、非表示にします (理想的には、Visibility.Visible、Visibility.Hidden、または Visibility.Collapsed に評価されるプロパティにバインドします)。

また、グラフィックスのさまざまな実装を見ると、特に他のプラットフォームから WPF に移行する開発者にとっては、実際には OnRender をオーバーライドする必要がないことがよくあります。リアルタイムでレンダリングする必要があるグラフィックスが大量にある場合を除き、多くの場合、WPF に作業を任せて、XAML 内に表示したいものを定義するだけで済みます。

于 2014-04-14T02:17:30.897 に答える