-1

私はWPFレンダリングシステムがどのように機能するかを理解しようとしています.今、私は質問で数日間立ち往生しています:

ビジュアルは描画オブジェクトのリストをレンダリング システムにどのように配信しますか?

その目的を果たす Visual のメンバーは見当たりません。

簡単に言えば、実装する必要があるのは次のとおりです。

public class MyVisual : Visual
{
   // ???
}

となることによって

DrawingGroup dg = VisualTreeHelper.GetDrawing( new MyVisual() );

非 null (有効な DrawingGroup オブジェクト) になりますか?

編集 (2013 年 3 月 14 日):

この質問は、WPF を理解している人なら誰でも簡単に答えられるはずだと思っていましたが、そうではないようです。

私は 1 週間以上前にこの質問をしましたが、WPF の専門家が非常に多く存在するにもかかわらず、WPF アーキテクチャに関するこの非常に具体的で具体的で基本的な質問には回答がありませんでした。非常に多くの「上位レベル」の質問に答えるWPFの専門家の誰も、WPFが基本レベルでどのように機能するかを実際に知らない可能性はありますか?

実際、私の質問は実際には次のとおりです。WPFの本当の専門家はいますか、それとも人間の理解を超えているほど神秘的ですか?

4

3 に答える 3

1

が機能するDrawingGroup dg = VisualTreeHelper.GetDrawing( new MyVisual() );には、 をオーバーライドする必要がありますVisual.GetDrawing。ただし、これはinternal virtualメソッドであるため、オーバーライドすることはできません。

Visualから直接派生することはサポートされているシナリオではないと思います。たとえば、 (パブリックメソッドを公開する) 他の -派生クラスの 1 つから (合成または継承を介して)派生UIElementまたは使用する必要があります。VisualDrawingVisualRenderOpen

于 2013-03-18T17:30:59.907 に答える
1

DrawingVisualブラッドリーが言及しているように、これを機能させるのではなく、派生する必要がありますVisual


あなたはそれを逆にやっています。Visual何かをレンダリングするまで、 は空です。何かが空になる可能性があることDrawingGroup...

DrawingGroupの内容に対応するを取得するにはVisual

DrawingGroup dg = new DrawingGroup();
using (DrawingContext myContext = myVisual.RenderOpen())
    myContext.DrawDrawing(dg);

RenderOpenと を破棄する間に発生するすべてのことは、内部に格納DrawingContextされる に移動します。DrawingGroupVisual

その後、

VisualTreeHelper.GetDrawing( myVisual )

非nullになります(それが上で作成されたものか、上で作成された1つのアイテムをDrawingGroup含むWPFで作成されたものかは確認していません)。DrawingGroup

作業したい場合は、のコンストラクターVisualTreeHelper.GetDrawing( new MyVisual() )内で上記のものを実行するだけです。MyVisual

MyVisual()
{
    using (DrawingContext myContext = RenderOpen())
        myContext.DrawDrawing(new DrawingGroup());
}

で使用される内部データ構造GetDrawingが正しく設定されています。オーバーライドする必要はありません。

于 2014-06-12T21:47:31.667 に答える
0

[Phil への回答: Visual にメソッド OnRender がないことを除けば、それは素晴らしいことです。あなたは実際にUIElementについて話している.]

MSDN の次の行が間違っていることを誰かが確認できれば満足です。

「Visual オブジェクトは次のサポートを提供します: [とりわけ] - 出力表示: 永続化され、シリアル化されたビジュアルの描画コンテンツのレンダリング...」.

UIElement、ContainerVisual、または Viewport3DVisual はすべて、描画コンテンツ配信の異なるメカニズムを持っているため、Visual 自体には描画配信の中心的な (ポリモーフィックな種類の) メカニズムはありませんが、これらの役割はこれら 3 つの事前定義されたクラスに分類されます (つまり、レンダリング システムはこれら 3 つのクラスの処理方法しか認識しておらず、Visual 自体は認識していないため、これらの 3 つのクラスのいずれからも派生しない新しい種類の Visual を作成することはできません)。

私は正しいですか?

編集:

番号。この結論は、マイクロソフトのドキュメントに記載されている内容のみに基づいているため、正しくありません。視覚的なオブジェクトには、ドキュメントにあるものよりも多くのものがあります。さらに掘り下げるには、リフレクションを使用します。

于 2013-03-16T16:05:13.423 に答える