2012-03-26 12 views
0

Canvasから継承し、Visual Basicをcanvasbaseに追加できるクラスを作成する必要があります。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

あなたがプログラム的に派生キャンバスに子を追加したい場合は、単にこのようにそれを行うことができます。ビジュアル層まで行くとVisualChildrenCountGetVisualChildをオーバーライドする

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

必要はありません。

その他の理由でビジュアルを使用する必要がある場合は、キャンバスを使用する必要はありません。 UIElementまたはFrameworkElementから派生する可能性があります。

+0

hmmmもう質問がある場合はもう一度やり直してみてください...悪いそれを試してください –

+0

問題は私が視覚的な層に下がる必要があります。私はキャンバスが必要です。私の英語はあなたのことを説明するほど良くはありません。しかし私はある種の描画ツールを作成しようとしています。このアイデアに基づいています:http://www.codeproject.com/Articles/22776/WPF-DrawTools ここでは、コンテナとビジュアルコレクションとしてCanvasのベースクラスを使用します。そして、私はこれがかなりきれいだと思います。 –

+0

あなたが参照しているプロジェクトを調べていない。しかし、ここでコンセプトをミックスしています。あなたは間違いなく[ContainerVisual](http://msdn.microsoft.com/en-us/library/system.windows.media.containervisual.aspx)の子**または** [Panel](http:// msdn Microsoft.com/jp/en/US/library/ system.windows.controls.panel.aspx)(例:Canvas)の両方の子ではありません。 – Clemens

関連する問題