1

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

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はDrawingVisualであり、上記のコンストラクターは、左上の点(0,0)と長さが200のRectをGraphicsRectangleのdrawingContextに描画します。DrawingContainerはFrameworkElementであり、コンストラクターで指定された1つの子があります。DrawingContainerは、GetVisualChildおよびVisualChildrenCountオーバーライドメソッドを実装します。最後に、ContentControlのContentプロパティがDrawingContainerに設定され、DrawingVisualのコンテンツを表示できるようになります。

作成したContentControlを通常のCanvasに追加すると、コントロールが正しく表示されます。その理由は、DrawingCanvasがArrangeOverrideメソッドを実装していないためだと思います。MeasureOverrideメソッドのみを実装します。また、DrawingContainerはMeasureおよびArrangeオーバーライドメソッドを実装していません。何か案は?

4

1 に答える 1

1

問題はDrawingCanvasにArrangeOverrideメソッドがないことだと思っていました。次のArrangeOverrideメソッドをDrawingCanvasに追加すると、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クラスのベースです。GraphicsBaseのサイズを見つけるために、GraphicsRectangleのコンストラクターで設定されるGraphicsBaseにwidthプロパティとheightプロパティを追加しました。

于 2011-01-09T03:44:39.777 に答える