2011-01-09 3 views
1

Canvas에서 상속 된 사용자 지정 DrawingCanvas가 있습니다. 다음 코드로 DrawingCanvas에 ContentControl을 추가하면 아무 것도 나타나지 않습니다.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과하며 생성자 상기 GraphicsRectangle의 drawingContext로 (0,0)과 좌측 상단 점 (200)의 길이의 사각형을 그린다. DrawingContainer는 FrameworkElement이며 하나의 자식을가집니다.이 자식은 위의 rect이며 생성자와 함께 제공됩니다. DrawingContainer는 GetVisualChild 및 VisualChildrenCount 메서드를 재정의합니다. 드디어 ContentControl의 Content 속성이 DrawingContainer로 설정되어 DrawingVisual의 내용을 표시 할 수 있습니다.

생성 된 ContentControl을 일반 Canvas에 추가하면 컨트롤이 올바르게 표시됩니다. 이유는 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

제가 생각하기에 문제는 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에 GraphicsRectangle의 생성자에서 설정된 width 및 height 속성을 추가했습니다.