通常のWPFレンダリングをハイジャックして、コントロールをプリミティブに分割し、レイアウト管理を行い、バインディングなどを適用したいと思います。カスタムDrawingContextへのレンダリング
私の知る限り、WPFのレンダリング全体は、依存関係プロパティシステムによって定義された値を持つレイアウトマネージャによって計算された場所にプリミティブ(テキスト、イメージ、ライン、カーブ)をレンダリングすることになっています。私自身のプリミティブ・レンダリング・ロジックを供給できるなら、私はレンダリングすることができます。カスタムドキュメントタイプに、ネットワーク上で実際のレンダリングのためのプリミティブを転送するなど
私の計画は以下の通りです:
- 、カスタム
DrawingContext
を実装します。DrawingContext
は抽象クラスであり、DrawEllipse
,DrawText
、DrawImage
などのメソッドを定義しています。この機能のために独自の実装を用意する必要があります。 - WPF
UserControl
を作成し、指定したDrawingContext
に強制的にレンダリングします。
は、しかし、私は次のような問題が発生しました:
DrawingContext
は、私は簡単に上書きすることはできません抽象内部メソッドvoid PushGuidelineY1(double coordinate)
とvoid PushGuidelineY2(double leadingCoordinate, double offsetToDrivenCoordinate)
が含まれています。 (おそらくこれを克服するためのいくつかのトリックがありますか?)- レンダリングする方法がないようです
DrawingContext
でビジュアルをレンダリングする方法はありませんか?どうして?
私は
void RenderRecursively(UIElement e, DrawingContext ctx)
{
e.OnRender(ctx);
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(e); i++)
RenderRecursively((UIElement)VisualTreeHelper.GetChild(e, i), ctx);
}
ような何かを行うことができます - しかしUIElement
をレンダリングするための直接的な方法があるのだろうか。 (もちろん、この問題は軽微ですが、インフラがないので、これが適切な方法であるかどうか疑問に思うでしょう)
したがって、DrawingContext
は継承を意図したものではありませんか?カスタムDrawingContext
の正しい方向への一歩を踏み出すという考えは全部か、それとも戦略を再考する必要がありますか? WPFでサポートされているカスタムコンテキストに描画しているのですか、または別のインターセプトポイントを探す必要がありますか?
DrawingContextの注釈から: 'DrawingContextを直接インスタンス化することはありません。 DrawingGroup.OpenやDrawingVisual.RenderOpenなどの特定のメソッドから描画コンテキストを取得することができます。これは、実際に*カスタムDrawingContextをどこかに提供する方法がないことを意味します。 – Clemens
@クレメンス:はい、私はこの発言を見ましたが、「自分で作成するのではなく、内部的にやって、DrawingVisualに描画するだけで適切に初期化させてください」と理解しました。とにかく面白いのは、描画に有効なインターセプトポイントがある場合です。 – Vlad
DrawingVisualに描画する唯一の方法は、DrawingVisual.RenderOpenによって提供されるDrawingContextに描画することです。カスタムDrawingContextをVisualに関連付ける方法はありません。アイデアは無意味です。 – Clemens