нужно объяснение по методу добавления детей - PullRequest
0 голосов
/ 02 июля 2010

Я использую 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 ]

2 голосов
/ 02 июля 2010
myRectangle rec = new myRectangle();     
canvas.Children.Add(rec.myrectmember); <-- add member which is actually a rectangle  
1 голос
/ 02 июля 2010

Определить "обертку" ... Она наследуется от 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());
        }
    }

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.

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

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

0 голосов
/ 03 июля 2010

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

public class MyRectangle : ContentControl
{
    private Rectangle recNewColor;
    public MyRectangle()
    {
        ///...
        this.Content = recNewColor;
    }
}
0 голосов
/ 02 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...