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 的绘图上下文中。DrawingContainer 是一个 FrameworkElement,它有一个子元素,它是上面的矩形,带有构造函数。DrawingContainer 实现 GetVisualChild 和 VisualChildrenCount 覆盖方法。最后,将 ContentControl 的 Content 属性设置为 DrawingContainer,以便能够显示 DrawingVisual 的内容。

当我将创建的 ContentControl 添加到常规 Canvas 时,控件会正确显示。我猜原因是 DrawingCanvas 没有实现 ArrangeOverride 方法。它只实现 MeasureOverride 方法。此外,DrawingContainer 不实现 Measure 和 Arrange 覆盖方法。有任何想法吗?

4

1 回答 1

1

正如我认为的问题是在 DrawingCanvas 中缺少 ArrangeOverride 方法。通过将以下 ArrangeOverride 方法添加到 DrawingCanvas,可以正确显示 ContentControl。

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 的大小,我在 GraphicsBase 中添加了 width 和 height 属性,它们是在 GraphicsRectangle 的构造函数中设置的。

于 2011-01-09T03:44:39.777 回答