2011-01-09 49 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中。