我有一个自定义的DrawingCanvas,它继承自Canvas。当我使用以下代码向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,上面的构造函数将一个带有(0,0)左上角和长度为200的Rect绘制到GraphicsRectangle的drawingContext中。 DrawingContainer是一个FrameworkElement,它有一个子节点,上面是rect,用构造函数给出。 DrawingContainer实现了GetVisualChild和VisualChildrenCount覆盖方法。最后,ContentControl的Content属性设置为DrawingContainer,以便能够显示DrawingVisual的内容。
当我将创建的ContentControl添加到常规Canvas时,控件显示正确。我想原因是DrawingCanvas没有实现ArrangeOverride方法。它只实现MeasureOverride方法。 DrawingContainer也没有实现Measure和 安排覆盖方法。有任何想法吗?
答案 0 :(得分: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的构造函数中设置了GraphicsBase的width和height属性。