2011-01-09 2 views
1

У меня есть пользовательский DrawingCanvas, который унаследован от Canvas. Когда я добавляю 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 является рисованью и конструктор выше рисует Rect с (0,0) верхней левой точкой и длиной 200 к DrawingContext из GraphicsRectangle. DrawingContainer - это элемент FrameworkElement и имеет один дочерний элемент, который является прямым, заданный конструктором. DrawingContainer реализует методы переопределения GetVisualChild и VisualChildrenCount. Наконец, свойство Content ContentControl установлено в DrawingContainer, чтобы отображать контент DrawingVisual.

Когда я добавляю созданный ContentControl к регулярному холсту, элемент управления отображается правильно. Я думаю, причина в том, что DrawingCanvas не реализует метод ArrangeOverride. Он реализует только метод MeasureOverride. Также DrawingContainer не реализует Measure и Упорядочить методы переопределения. Есть идеи?

+0

Это то, что я искал, но что такое DrawingContainer, GraphicsBase и GraphicsObject. Ни один из них не известен в visualstudio (NET.4). Это некоторые самоопределяет классы. –

+0

Да, они есть. Я создал DrawingContainer, и я взял GraphicsBase, GraphicsObject с http://www.codeproject.com/KB/WPF/WPF_DrawTools.aspx –

ответ

1

Как я думал, проблема отсутствовала метод ArrangeOverride в DrawingCanvas. С помощью следующего метода 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, я добавил свойства width и height в GraphicsBase, которые установлены в конструкторе GraphicsRectangle.

Смежные вопросы