2011-01-09 33 views
1

Ich habe eine benutzerdefinierte DrawingCanvas, die von Canvas übernommen wird. Wenn ich ein ContentControl zu DrawingCanvas mit dem folgenden Code hinzufüge, wird nichts angezeigt.WPF - Hinzufügen von ContentControl zu benutzerdefinierten Canvas

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 ist ein DrawingVisual und der Konstruktor oben zieht einen Rect mit (0,0) obere linke Punkt und einer Länge von 200 zu dem DrawingContext von GraphicsRectangle. DrawingContainer ist ein FrameworkElement und es hat ein Kind, das direkt über dem Konstruktor liegt. DrawingContainer implementiert die Override-Methoden GetVisualChild und VisualChildrenCount. Zum Schluss wird die Content-Eigenschaft von ContentControl auf DrawingContainer gesetzt, um den Inhalt von DrawingVisual anzeigen zu können.

Wenn ich das erstellte ContentControl zu einem regulären Canvas hinzufügen, wird die Steuerung korrekt angezeigt. Ich denke, der Grund ist, dass DrawingCanvas die Methode ArrangeOverride nicht implementiert. Es implementiert nur die MeasureOverride-Methode. DrawingContainer implementiert auch nicht Measure und Arrangier Override-Methoden. Irgendwelche Ideen?

+0

Dies ist, was ich gesucht habe, aber was ist DrawingContainer, GraphicsBase und GraphicsObject. Keine von beiden ist in Visual Studio (NET.4) bekannt. Ist es selbst definiert Klassen. –

+0

Ja, das sind sie. Ich habe DrawingContainer erstellt und GraphicsBase, GraphicsObject von http://www.codeproject.com/KB/WPF/WPF_DrawTools.aspx genommen –

Antwort

1

Als ich dachte, das Problem fehlt ArrangeOverride-Methode in DrawingCanvas. Mit der folgenden ArrangeOverride-Methode, die DrawingCanvas hinzugefügt wurde, werden ContentControls korrekt angezeigt.

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; 
} 

wo GraphicsBase die Basis der GraphicsRectangle-Klasse ist. Um die Größe von GraphicsBase zu ermitteln, habe ich GraphicsBase die Eigenschaften width und height hinzugefügt, die im Konstruktor von GraphicsRectangle festgelegt sind.

Verwandte Themen