質問

Canvasから継承されたカスタムDrawingCanvasがあります。次のコードでDrawingCanvasにContentControlを追加すると、何も表示されません。

GraphicsRectangle rect = new GraphicsRectangle(0, 0, 200, 200, 5, Colors.Blue);
DrawingContainer host = new DrawingContainer(rect);

ContentControl control = new ContentControl();
control.Width = 200;
control.Height = 200;
DrawingCanvas.SetLeft(control, 100);
DrawingCanvas.SetTop(control, 100);
control.Style = Application.Current.Resources["DesignerItemStyle"] as Style;

control.Content = host;

drawingCanvas.Children.Add(control);

GraphicsRectangleは描画視聴者であり、上のコンストラクターは(0,0)左上ポイントと200の長さがグラフィックスレクタンのDrawingContextを持つ長方形を描画します。 DrawingContainerはフレームワークセレメントであり、1人の子供がいます。 DrawingContainerは、GetVisualChildとVisualChildRencountオーバーライドメソッドを実装します。最後に、ContentControlのコンテンツプロパティは、DrawingVisualのコンテンツを表示できるように、DrawingContainerに設定されています。

作成されたContentControlを通常のキャンバスに追加すると、コントロールが正しく表示されます。その理由は、DrawingCanvasがArrangeOverRideメソッドを実装していないことだと思います。 MeasureOverRideメソッドのみを実装します。また、DrawingContainerは測定を実装してオーバーライドメソッドを実装しません。何か案は?

役に立ちましたか?

解決

問題にはDrawingCanvasのArrangeOverRideメソッドが欠落していると思ったように。 DrawingCanvasに次のArrangeOverRideメソッドを追加すると、ContentControlsが正しく表示されます。

protected override Size ArrangeOverride(Size arrangeSize)
{
    foreach (Visual child1 in children)
    {
        if (child1 is DrawingVisual)
            continue;

        ContentControl child = child1 as ContentControl;
        GraphicsBase content = ((DrawingContainer)(child.Content)).GraphicsObject;

        child.Arrange(new Rect(DrawingCanvas.GetLeft(child), DrawingCanvas.GetTop(child), content.Width, content.Height));
     }

     return arrangeSize;
}

GraphicsBaseは、GraphicsRectangleクラスのベースです。グラフィックスベースのサイズを見つけるために、グラフィックスレクタルのコンストラクターに設定されたグラフィックスベースに幅と高さの特性を追加しました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top