Klasa VisualCollection

Ostatnio było dużo o wielowątkowości więc może zmieńmy temat i zajmijmy się przez dwa posty tematyką WPF. Celem dzisiejszego wpisu jest wyjaśnienie klasy VisualCollection, która będzie niezbędna aby omówić tzw. Adorner. W większości przypadków, XAML w zupełności wystarcza jeśli chodzi o tworzenie interfejsu użytkownika. W WPF istnieje jednak drugie podejście pozwalające rysować elementy i kontrolki. Można manualnie stworzyć kolekcje VisualCollection oraz dodać do niej wszelkie obiekty. Na przykład:

public class SampleControl:Control
{
   private readonly VisualCollection _visualCollection;
   public SampleControl()
   {
       _visualCollection=new VisualCollection(this);
       _visualCollection.Add(CreateButton());
       _visualCollection.Add(CreateRectangle());
   }
   private DrawingVisual CreateRectangle()
   {
       var drawing=new DrawingVisual();
       using (DrawingContext dc = drawing.RenderOpen())
       {
           dc.DrawRectangle(Brushes.Red,null,new Rect(0,0,50,50));
       }
       return drawing;
   }
   private Button CreateButton()
   {
       var button = new Button();
       button.Content = "Hello world";
       button.Width = button.Height = 300;
       return button;
   }
   protected override Visual GetVisualChild(int index)
   {
       return _visualCollection[index];
   }
   protected override int VisualChildrenCount
   {
       get { return _visualCollection.Count; }
   }
}

VisualCollection to jak sama nazwa mówi, zawiera kolekcję obiektów wizualnych. Mogą być to kontrolki oraz shape’y. Konstruktor kolekcji przyjmuje element stanowiący obiekt nadrzędny (rodzic). Następnie należy dodać wszelkie elementy, które chcemy wyświetlać. Niezbędne jest również przeładowanie dwóch metod: GetVisualChild oraz VisualChildrenCount. Pierwsza z nich zwraca element wizualny pod danym indeksem, druga  z kolei zwraca liczbę obiektów, które kontrolka\element zawiera. Jeśli umieścimy tak utworzoną kontrolkę na formatce wtedy wyświetli się przycisk i kwadrat. Oczywiście to samo moglibyśmy zdefiniować za pomocą XAML lub Controls. VisualCollection to nic innego jak lista obiektów do renderowania. W powyższym przypadku stworzyliśmy ją po prostu manualnie.

Powyższy przykład nie ma w praktyce większego sensu. VisualCollection jest jednak bardzo praktyczny w przypadku implementacji Adorner’a  o czym przekonamy się już w następnym poście.

Leave a Reply

Your email address will not be published.