2012-03-26 2 views
0

Canvas에서 상속 받고 canvasbase에 Visual을 추가 할 수있는 클래스를 작성해야합니다. Canvas에 VisualChild를 추가해도 작동하지 않음 - 표시되지 않음

그래서이 코드 작성 :

class TestCanvas : Canvas 
{ 
    VisualCollection visuals; 

    public TestCanvas() 
    { 
     visuals = new VisualCollection(this); 
    } 

    protected override void OnMouseDown(MouseButtonEventArgs e) 
    { 
     Rectangle rect = new Rectangle 
     { 
      Width = 200, 
      Height = 200, 
      Stroke = Brushes.Red, 
      StrokeThickness = 5, 
      Fill = Brushes.Black 
     }; 
     visuals.Add(rect); 
     base.OnMouseDown(e); 
    } 

    protected override int VisualChildrenCount 
    { 
     get 
     { 
      return visuals.Count; 
     } 
    } 

    protected override Visual GetVisualChild(int index) 
    { 
     if (index < 0 || index > visuals.Count) 
      throw new ArgumentOutOfRangeException("index"); 

     return visuals[index]; 
    } 
} 

을하지만 그것을 클릭하고 내가 표시되지 않는이 Rectangle를 추가합니다. 누구도 이것이 작동하지 않는 이유를 알고 있습니까? 당신이 프로그래밍 방식으로 파생 캔버스에 아이를 추가하려면

답변

2

,이 같은 그것을 간단하게 할 수 있습니다

Rectangle rect = new Rectangle 
{ 
    Width = 200, 
    Height = 200, 
    Stroke = Brushes.Red, 
    StrokeThickness = 5, 
    Fill = Brushes.Black 
}; 

Canvas.SetLeft(rect, ...); 
Canvas.SetTop(rect, ...); 

Children.Add(rect); 

비주얼 계층으로 내려 가서 VisualChildrenCountGetVisualChild을 재정의 할 필요가 없습니다.

다른 이유로 비주얼을 사용해야하는 경우 캔버스를 사용할 필요가 없습니다. UIElement 또는 FrameworkElement에서 파생 될 수 있습니다.

+0

hmmm ok 더 이상 질문이있을 경우 다시 질문 할 것입니다 ... 아프지 말고 시도하십시오 –

+0

문제는 시각적 레이어로 이동해야합니다. 그리고 저는 캔버스가 필요합니다. 제 영어는 당신을 아주 잘 설명하는만큼 좋지 않습니다. 그러나 어떤 종류의 그리기 도구를 만들 계획입니다. 이 아이디어를 기반으로합니다 : http://www.codeproject.com/Articles/22776/WPF-DrawTools 여기에는 또한 컨테이너 및 시각적 컬렉션으로 Canvas 기본 클래스가 사용됩니다. 그리고 이것은 꽤 예쁜 방법이라고 생각합니다. –

+0

당신이 말하는 프로젝트를 들여다 보지 않았습니다. 그러나 여기서 개념을 혼합하고 있습니다. 반드시 [ContainerVisual] (http://msdn.microsoft.com/en-us/library/system.windows.media.containervisual.aspx) children ** 또는 ** [Panel] (http : // msdn .microsoft.com/en-us/library/ystem.windows.controls.panel.aspx) (예 : Canvas) 자식 둘 다 사용할 수 없습니다. – Clemens

관련 문제