2011-01-09 79 views
1

我有一个从Canvas继承的自定义DrawingCanvas。当我使用下面的代码将一个ContentControl添加到DrawingCanvas时,什么都不显示。WPF - 将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以上构造绘制矩形与(0,0)左上方的点和200长度GraphicsRectangle的的DrawingContext。 DrawingContainer是一个FrameworkElement,它有一个孩子,这个孩子在构造函数给出的上面。 DrawingContainer实现了GetVisualChild和VisualChildrenCount覆盖方法。最后,ContentControl的Content属性被设置为DrawingContainer以能够显示DrawingVisual的内容。

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

+0

这就是我一直在寻找,但什么是DrawingContainer,GraphicsBase和GraphicsObject。 它们都不在visualstudio(NET.4)中已知。 它是一些自定义类。 – 2011-03-09 19:33:09

回答

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的大小,我将宽度和高度属性添加到GraphicsBase的构造函数中设置的GraphicsBase中。