WPF-将ContentControl添加到自定义画布

WPF-将ContentControl添加到自定义画布,wpf,canvas,contentcontrol,frameworkelement,Wpf,Canvas,Contentcontrol,Frameworkelement,我有一个从Canvas继承的自定义DrawingCanvas。当我使用下面的代码向DrawingCanvas添加ContentControl时,什么都没有显示 GraphicsRectangle rect = new GraphicsRectangle(0, 0, 200, 200, 5, Colors.Blue); DrawingContainer host = new DrawingContainer(rect); ContentControl control = new ContentC

我有一个从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是一个DrawingVisual,上面的构造函数在GraphicsRectangle的drawingContext中绘制一个左上角点为(0,0)、长度为200的矩形。DrawingContainer是一个FrameworkElement,它有一个子元素,上面是rect,由构造函数提供。DrawingContainer实现GetVisualChild和VisualChildrenCount重写方法。最后,ContentControl的Content属性被设置为DrawingContainer,以便能够显示DrawingVisual的内容

当我将创建的ContentControl添加到常规画布时,会正确显示该控件。我猜原因是DrawingCanvas没有实现ArrangeOverride方法。它只执行MeasureOverride方法。此外,DrawingContainer未实施措施和
排列覆盖方法。有什么想法吗

因为我认为问题在于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的大小,我向GraphicsBase添加了宽度和高度属性,这些属性是在GraphicsRectangle的构造函数中设置的。

因为我认为问题在于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的大小,我向GraphicsBase添加了宽度和高度属性,这些属性是在GraphicsRectangle的构造函数中设置的。

这是我一直在寻找的,但什么是DrawingContainer、GraphicsBase和GraphicsObject。在visualstudio(NET.4)中,这两种方法都不为人所知。是一些自定义类。是的。我创建了DrawingContainer,并从中获取了GraphicsBase,GraphicsObject,这是我一直在寻找的,但什么是DrawingContainer,GraphicsBase和GraphicsObject。在visualstudio(NET.4)中,这两种方法都不为人所知。是一些自定义类。是的。我创建了DrawingContainer,并从