2010-07-02 2 views
0

Я использую 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 }, 
      }; 
     } 
... 
} 
+0

Действительно ли myRectangle наследует Rectangle? –

+0

не нужно включать C# и silverlight в заголовке нити, так как вы их отметили – heisenberg

+0

no myRectangle не наследует Rectangle, но что, если мой класс является комбинацией вещей и не является только особым случаем прямоугольника? – david

ответ

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

Спасибо, это была просто опечатка на вопрос .. – david

1

Определение "обертку" ... унаследует ли от прямоугольника или какой-либо другой UIElement? Подпись Canvas.Children.Add требует что-то, что происходит от UIElement, потому что это UIElementCollection.

Вы должны были бы получить UIElement или контейнер UIElement, например Panel, чтобы вы могли добавлять дочерние объекты, такие как Rectangle.

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

Edit:

Вы должны добавить визуальные элементы в визуальном дереве. Просто сделать их членами вашего класса не будет. Анализатор 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. 

если вы просто извлечь из панели вы получаете эту функциональность. Затем все, что вы хотите визуализировать в визуальном дереве, вы можете просто добавить к свойству «Дети» вашего класса.

Или вы могли бы реализовать свой собственный 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); 

Edit: Просто пытался скомпилировать это и заметил, что вы не можете получить от UIElement ... Попробуйте FrameworkElement или управления.

+0

, так что если вы создадите класс, который содержит, среди прочего, прямоугольник, как вы его делаете, поэтому он происходит от UIElement? – david

+0

отредактировал мое сообщение, чтобы показать вам –

+0

У меня есть первая часть .. так что даже если XAML не будет знать, как обращаться с моим объектом? – david

0

Класс myRectangle должен наследовать от UIElement (или его подкласса, то есть Shape). Вы не можете наследовать напрямую от Rectangle, потому что он запечатан.

0

Вам необходимо расширить UIElement для вашего класса, чтобы он мог быть дочерним на холсте. Если вы просто хотите обернуть один прямоугольник в нем, продлите ContentControl и присвойте ему свойство Content:

public class MyRectangle : ContentControl 
{ 
    private Rectangle recNewColor; 
    public MyRectangle() 
    { 
     ///... 
     this.Content = recNewColor; 
    } 
} 
Смежные вопросы