WPF: Rysowanie 2D

 

Jak to mówią – nie samym konkursem człowiek żyje 🙂 Elementem niezbędnym do powstania mojej pracy magisterskiej jest wykorzystanie grafiki 3D, stąd zapadła decyzja, że powstanie ona w technologii WPF. Nie o grafice trójwymiarowej jednak w tym poście. Okazało się bowiem, że istnieje również potrzeba wykorzystania grafiki 2D do wyświetlania przebiegów funkcji.

Celem, który mi przyświeca od początku pisania aplikacji jest stworzenie architektury, która przynajmniej w jakimś  niewielkim stopniu, na miarę mojej wiedzy, mogłaby być później rozbudowywana. Przede wszystkim to dobry impuls do zastosowania wzorca projektowego obserwatora (Observer Pattern), w odmianie .Net–owej, czyli Event Pattern. Odmiana ta zakłada wykorzystanie zdarzeń oraz delegatów. Samego wzorca nie będę tutaj opisywał – zachęcam do zapoznania się z nim pod adresem: http://msdn.microsoft.com/en-us/library/ee817669.aspx.

Elementem składowym całej układanki jest utworzenie osobnej kontrolki umożliwiającej wyświetlanie rysunków na płaszczyźnie. Jako, że mam pewne doświadczenie w tworzeniu grafiki w Windows Forms, to z lekkim zaskoczeniem przekonałem się, że w WPF sposób tworzenia grafiki jest dość odmienny. Postanowiłem więc moje spostrzeżenia z tego etapu prac umieścić na blogu, aby później odnalezione przeze mnie informacje nie uległy zapomnieniu.

Zacznijmy od tego, że z racji tego, że moje główne okno aplikacji ma być zajęte wyświetlaniem grafiki 3D i innych rzeczy to chciałbym, aby dla grafiki 2D otwierane było nowe okno. W tym celu należy stworzyć nowy element typu Window, w którym umieszczona zostanie przygotowana wcześniej kontrolka. Nowe okno wywołać można  w następujący sposób:

var myWindow = new WindowPlainGraph();
myWindow.Show();

W powyższym kodzie WindowPlainGraph to nazwa pliku wybrana dla elementu typu Window.

Kontrolka została stworzona w tej samej przestrzenii nazw, stąd nie ma konieczności dodawania żadnych referencji do projektu. Przydałoby się jednak powiadomić w jakiś sposób edytor, że kontrolka taka będzie wykorzystywana w projekcie. W kodzie XAML na nowej stronie dla elementu Window, trzeba dodać następujący wpis:

xmlns:myPlainGraphControl="clr-namespace:MyNamespace"
    

W przypadku gdyby konieczne było dodanie kontrolki z zewnątrz projektu trzeba dodać jeszcze parametr assembly. Od tego momentu w kodzie XAML kontrolkę można wstawiać używając składni:

<myPlainGraphControl:PlainGraph/>

gdzie PlainGraph to klasa z kontrolką. Co warte podkreślenia, aby element z tego samego assembly mógł być dostępny w projekcie z kodu, konieczne jest nadanie mu identyfikatora x:Name, zamiast zwyczajnego Name.

Co do samego rysowania przebiegów funkcji, to przynajmniej w moim podejściu do narysowania jest zbiór odcinków wyznaczonych przez pary punktów. Koniec jednego odcinka oczywiście musi być zarazem początkiem drugiego odcinka. W przypadku WPF doskonale do tego celu nadaje się obiekt klasy Polyline. Punkty składowe tego obiektu ustawiane są za pomocą metody:

 polyline.Points.Add(...);

która jako argument przyjmuje obiekt typu Point, którego składowe z kolei są typu double. Sam obiekt Polyline wyświetlany jest na panelu poprzez dodanie go komendą:

pnlDrawing.Children.Add(polyline);

gdzie polyline to nazwa utworzonego obiektu typu Polyline.

Pamiętać należy bezwzględnie o tym, że żaden rysunek nie powstanie, jeśli nie zostanie do niego uprzednio przypisane “narzędzie rysujące”, np:

//Before adding to panel
polyline.Stroke = System.Windows.Media.Brushes.Black;
polyline.StrokeThickness = 2;
Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s

%d blogerów lubi to: