需要解释add child方法

时间:2010-07-02 17:43:18

标签: c# silverlight

我一直在使用Children.Add,使用不同的默认silverlight控件将它们添加到画布中。 我没有得到的是为什么这样的事情是可能的:

Rectangle rec = new Rectangle(){...};
canvas.Children.Add(rec);

但不是这样的(甚至不编译):

myRectangle rec = new myRectangle();    
canvas.Children.Add(rec);

myRectangle只是一个矩形的包装

我确定我遗漏了一些基本的东西...... 谢谢你的帮助。


myRectangle class:

public class myRectangle
{
        private SolidColorBrush fillColor;
        private Rectangle recNewColor;

        internal myRectangle()
        {
            fillColor = new SolidColorBrush(Colors.White);
            LinearGradientBrush strokeBrush = new LinearGradientBrush()
            {
                StartPoint = new Point(0.5, 0),
                EndPoint = new Point(0.5, 1),
                GradientStops = 
                { 
                    new GradientStop() { Color = Colors.Red, Offset = 1.0 },
                    new GradientStop() { Color = Colors.Orange, Offset = 0.0 },
                }
            };
            recNewColor = new Rectangle()
            {
                Stroke = strokeBrush,
                Height = 20,
                Width = 20,
                Fill = fillColor,
                HorizontalAlignment = HorizontalAlignment.Left,
                VerticalAlignment = VerticalAlignment.Top,
                Margin = new Thickness() { Bottom = 5, Left = 5 },
            };
        }
...
}

4 个答案:

答案 0 :(得分:2)

myRectangle rec = new myRectangle();     
canvas.Children.Add(rec.myrectmember); <-- add member which is actually a rectangle  

答案 1 :(得分:1)

定义“包装器”...它是继承自Rectangle还是其他一些UIElement? Canvas.Children.Add的签名需要从UIElement派生的东西,因为它是一个UIElementCollection。

您必须从UIElement派生,或者从容器UIElement派生,例如Panel,这样您就可以添加子对象,例如Rectangle。

 public class MyRectangle : Panel
    {
        public MyRectangle()
        {
            this.Children.Add(new System.Windows.Shapes.Rectangle());
        }
    }

编辑:

您需要将可视元素添加到可视树中。简单地让他们成为你班上的成员是行不通的。 xaml解析器需要知道要添加到可视树的成员。

使用面板类,这是一个很好的起点。它使用ContentProperty属性标记类:

[ContentProperty("Children", true)] 

// Summary:
//     Specifies which property of a class can be interpreted to be the content
//     property when the class is parsed by a XAML processor.

如果您只是从Panel派生,您将获得该功能。然后,您想要在可视化树中呈现的任何内容都可以添加到类的“Children”属性中。

或者您可以实现自己的UIElementCollection并使用属性

标记您的类
[ContentProperty("Children", true)] 
public class MyRectangle : UIElement
{
     public MyRectangle()
     {
          this.Children = new UIElementCollection();
          this.Children.Add(new System.Windows.Shapes.Rectangle());
     }

     public UIElementCollection Children {get; private set;}
}

再一次编辑:

然后,您还需要构建矩形的实例并将其添加到应用程序的可视树中。所以你以前的代码会这样做:

MyRectangle rec = new MyRectangle();     
canvas.Children.Add(rec); 

编辑: 只是尝试编译它并注意到你无法从UIElement派生...尝试FrameworkElement或Control。

答案 2 :(得分:0)

您的myRectangle类必须从UIElement(或其子类,即Shape)继承。您无法直接从Rectangle继承,因为它已被密封。

答案 3 :(得分:0)

您需要为您的班级扩展UIElement才能成为Canvas的孩子。如果您只想在其中包装一个Rectangle,请扩展ContentControl并为其分配Content属性:

public class MyRectangle : ContentControl
{
    private Rectangle recNewColor;
    public MyRectangle()
    {
        ///...
        this.Content = recNewColor;
    }
}