Windows Forms. Własne kontrolki. Programowanie w środowisku Windows. Wykład 7-1

Podobne dokumenty
Instrukcja laboratoryjna cz.3

- Narzędzie Windows Forms. - Przykładowe aplikacje. Wyższa Metody Szkoła programowania Techniczno Ekonomiczna 1 w Świdnicy

Programowanie obiektowe i zdarzeniowe wykład 1 Wprowadzenie do programowania zdarzeniowego

xmlns:prism= c. <ContentControl prism:regionmanager.regionname="mainregion" />

Wykład 5 Okna MDI i SDI, dziedziczenie

Programowanie w technologii.net wykład 4 Aplikacja i okna

1. Wprowadzenie do WPF i XAML. Tworzenie interfejsu użytkownika.

Praca w środowisku Visual Studio 2008, Visual C

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Instrukcja laboratoryjna nr.4

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

WPF 4.5 : księga eksperta / Adam Nathan. Gliwice, cop Spis treści

Język JAVA podstawy. wykład 2, część 2. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Przykładowa dostępna aplikacja w Visual Studio - krok po kroku

Programowanie obiektowe

Wykład 6 Dziedziczenie cd., pliki

Projektowanie Graficznych Interfejsów Użytkownika Robert Szmurło

Utworzenie aplikacji mobilnej Po uruchomieniu Visual Studio pokazuje się ekran powitalny. Po lewej stronie odnośniki do otworzenia lub stworzenia

Microsoft.NET: LINQ to SQL, ASP.NET AJAX

Programowanie aplikacji okienkowych Windows

Microsoft Visual C : praktyczne przykłady / Mariusz Owczarek. Gliwice, cop Spis treści

2. W oknie dialogowym Choose Toolbox Items w zakładce.net Framework Components naciskamy przycisk Browse...

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

Microsoft Visual C++

Programowanie obiektowe

MVVM i XAML w Visual Studio 2015 / Jacek Matulewski. Gliwice, cop Spis treści

ASP.NET MVC. Podstawy. Zaawansowane programowanie internetowe Instrukcja nr 3

Visual Studio instalacja

Projektowanie obiektowe. Roman Simiński Wzorce projektowe Wybrane wzorce strukturalne

Implementacja aplikacji sieciowych z wykorzystaniem środowiska Qt

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Politechnika Gdańska Katedra Optoelektroniki i Systemów Elektronicznych

using System;... using System.Threading;

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Rozdział 3. Zapisywanie stanu aplikacji w ustawieniach lokalnych

Programowanie Komputerów

Henryk Budzisz. materiały przygotowane w ramach projektu ZPORR nr POKL /08-00

Programowanie na poziomie sprzętu. Programowanie w Windows API

Informatyka I. Interfejs GUI wysokiego poziomu. Biblioteka Swing. Programowanie zdarzeniowe. Politechnika Warszawska Wydział Transportu 2018

Multimedia JAVA. Historia

Klasy cd. Struktury Interfejsy Wyjątki

Programowanie obiektowe

Laboratorium programowania urządzeń mobilnych

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

Kompleksowe tworzenie aplikacji klasy Desktop z wykorzystaniem SWT i

1 LINQ. Zaawansowane programowanie internetowe Instrukcja nr 1

Programowanie obiektowe i zdarzeniowe

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL III TI 4 godziny tygodniowo (4x30 tygodni =120 godzin ),

Programowanie Obiektowe GUI

Jarosław Kuchta Podstawy Programowania Obiektowego. Podstawy grafiki obiektowej

Lokalizacja Oprogramowania

Programowanie obiektowe

PARADYGMATY PROGRAMOWANIA Wykład 4

Programowanie obiektowe

Projektowanie, tworzenie aplikacji mobilnych na platformie Android

Aplikacje w środowisku Java

Ekspert radzi. mechanizm w enova, umożliwiający wskazanie domyślnej drukarki dla danego stanowiska i wydruku. Strona 1 z 8. Ekspert radzi.

Aplikacje internetowe i rozproszone - laboratorium

D:\DYDAKTYKA\ZAI_BIS\_Ćwiczenia_wzorce\04\04_poprawiony.doc 2009-lis-23, 17:44

Wstęp - Prosta aplikacja internetowa w technologii Java EE 5. Programowanie komponentowe 1

Wprowadzenie do projektu QualitySpy

Cechy systemu X Window: otwartość niezależność od producentów i od sprzętu, dostępny kod źródłowy; architektura klient-serwer;

Rys. 1. Główne okno programu QT Creator. Na rysunku 2 oznaczone zostały cztery przyciski, odpowiadają kolejno następującym funkcjom:

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Programowanie obiektowe

Król Łukasz Nr albumu:

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

Opis. Wykład: 30 Laboratorium: 30

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

Laboratorium 7 Blog: dodawanie i edycja wpisów

Programowanie obiektowe

16) Wprowadzenie do raportowania Rave

Dodanie nowej formy do projektu polega na:

Szablony funkcji i szablony klas

Ćwiczenia laboratoryjne. Oprogramowanie i badanie prostych metod sortowania w tablicach

Budowa aplikacji z graficznym interfejsem użytkownika - GUI (Graphic User Interface)

Wprowadzenie do programowanie obiektowego w języku C++

Programowanie w środowiskach graficznych. Wykład 1 OS, Podstawy Windows API

Programowanie zaawansowane

Programowanie obiektowe

Zacznij Tu! Poznaj Microsoft Visual Basic. Michael Halvorson. Przekład: Joanna Zatorska

Tworzenie i wykorzystanie usług sieciowych

Baza danych sql. 1. Wprowadzenie

C# 6.0 : kompletny przewodnik dla praktyków / Mark Michaelis, Eric Lippert. Gliwice, cop Spis treści

Wykład 8: klasy cz. 4

Rozwój aplikacji modułowych Paweł Brudnicki. Dodanie modułu

Microsoft.NET: ASP.NET MVC + Entity Framework (Code First)

Laboratorium 1. Wzorce oprogramowania lab1, Zofia Kruczkiewicz

Zaawansowane programowanie w C++ (PCP)

Kurs programowania 2 - listy

Aplikacje WWW - laboratorium

Język Java część 2 (przykładowa aplikacja)

TEMAT : KLASY DZIEDZICZENIE

Aplikacje WWW. Laboratorium z przedmiotu Aplikacje WWW - zestaw 01

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

Zaawansowane aplikacje internetowe - laboratorium

Język Java część 2 (przykładowa aplikacja)

Delphi podstawy programowania. Środowisko Delphi

PROBLEMY TECHNICZNE. Co zrobić, gdy natrafię na problemy związane z użytkowaniem programu DYSONANS

Aplikacje RMI

Transkrypt:

Windows Forms Wykład 7-1 Własne kontrolki

Wykład 7-2 Windows Forms Custom Controls Kontrolka złożona z innych kontrolek (user control) dowolny zbiór kontrolek Windows Forms umieszczonych w jednym kontenerze Rozszerzenie kontrolki (extended control, derived control) stworzyć klasę dziedziczącą z jednej z kontrolek Windows Forms rozszerzyć funkcjonalność przez dodanie własnych metod, zdarzeń, właściwości lub zmianę standardowego zachowania unikalny wygląd: nadpisać metodę OnPaint() Owner-drawn control (custom control) dziedzicząca z odpowiedniej klasy (np. ListBox) i nadpisująca metody do rysowania (e.g. MeasureItem, DrawItem) dziedzicząca z klasy Control z całą funkcjonalnością tworzoną od podstaw

Wykład 7-3 Klasy bazowe dla własnych kontrolek Component może być dodany do formularza z Toolbox'a, ale nie otrzymuje miejsca na tym formularzu (np. ToolTip, Timer, etc.) Control obsługa myszy i klawiatury (owner-drawn controls) ScrollableControl obsługa skrolowania ContainerControl obsługa kontrolek potomnych i zmiany fokusa (np. GroupBox, Panel) UserControl zdarzenie Load, obsługa design-time (user controls) Form i inne klasy kontrolek dziedziczenie z Form daje możliwość stworzenia wzorca formularza, dziedziczenie z istniejącej kontrolki pozwala na wykorzystanie jej funkcjonalności (derived controls)

Wykład 7-4 Naśladowanie standardowego zachowania Wszystkie elementy standardowego zachowania powinny zostać odwzorowane, np.: obsługa skrolowania obsługa fokusa (wizualne powiadomienie o posiadaniu fokusa) stan "wciśnięty" dla przycisków obsługa ruchu kursora myszy ponad kontrolką sprawdzanie miejsca kliknięcia stosowanie kompozycji Windows XP lub Vista

Wykład 7-5 Visual Studio Toolbox Podczas każdej kompilacji projektu biblioteki klas Visual Studio szuka komponentów i kontrolek i dodaje je do specjalnej zakładki na Toolbox'ie Podczas pierwszego użycia kontrolki w projekcie (np. przez przeciągnięcie jej do formularza z Toolbox'a) Visual Studio: dodaje referencję do assembly, w którym kontrolka jest zdefiniowana kopiuje to assembly do katalogu projektu Zawartość Toolbox'a może być modyfikowana jest pamiętana dla każdego użytkownika Visual Studio, a nie dla każdego projektu

Wykład 7-6 Design Time Pozwala programiście dodawać kontrolki do formularza i konfigurować ich właściwości Zapewnia zapisanie wartości właściwości w kodzie źródłowym (tzw. serializacja kodu) pozwala to na poprawną inicjalizację kontrolki podczas uruchamania formularza Daje możliwość realistycznej wizualizacji Menu kontekstowe, smart tags, własne edytory niestandardowych typów właściwości itp. Licencjonowanie kontrolek i komponentów

Wykład 7-7 Przykład Custom Control

Wykład 7-8 Obsługa Design Time Atrybuty dają możliwość zdefiniowania wartości wykorzystywanych w oknie właściwości pozwalają na dołączenie innych komponentów do kontrolki i konfigurację serializacji właściwości Konwertery typów konwersja pomiędzy własnymi i standardowymi typami generowanie kodu inicjującego właściwości kontrolki podczas uruchamiania formularza Edytory typów graficzny interfejs modyfikacji wartości zaawansowanych typów Control designers wygląd i zachowanie w design-time

Wykład 7-9 Atrybuty wykorzystywane podczas edycji Dla klas: DefaultPropertyAttribute oznaczenie właściwości, która zostanie wybrana po kliknięciu na kontrolce DefaultEventAttribute Dla właściwości: DefaultValueAttribute EditorAttribute edytor używany w Visual Studio LocalizableAttribute właściwość z tym atrybutem zostanie umieszczona w zasobach, jeśli będą wersje językowe TypeConverterAttributes Dla właściwości i zdarzeń (wygląd w Visual Studio): BrowsableAttribute CategoryAttribute DescriptionAttribute

Wykład 7-10 Tworzenie konwertera typów Stworzyć klasę dziedziczącą z TypeConverter Nadpisać: CanConvertFrom(), CanConvertTo() czy konwersja jest możliwa ConvertFrom(), ConvertTo() wykonanie konwersji IsValid() sprawdzenie poprawności Wszystkie te metody są zaimplementowane w klasie TypeConverter

Wykład 7-11 Przykład konwertera typów public class PointConverter : TypeConverter { public override bool CanConvertFrom( ITypeDescriptorContext context, Type sourcetype) { if (sourcetype == typeof(string)) { return true; return base.canconvertfrom(context, sourcetype); public override object ConvertFrom( ITypeDescriptorContext context, CultureInfo culture, object value) { if (value is string) { string[] v = ((string)value).split(new char[] {','); return new Point(int.Parse(v[0]), int.parse(v[1])); return base.convertfrom(context, culture, value); public override object ConvertTo( ITypeDescriptorContext context, CultureInfo culture, object value, Type dsttype) { if (destinationtype == typeof(string)) { return ((Point)value).X + "," + ((Point)value).Y; return base.convertto(context, culture, value, dsttype);

Wykład 7-12 Wbudowane edytory typów System.ComponentModel.Design: ArrayEditor, BinaryEditor, CollectionEditor, MultilineStringEditor System.Drawing.Design: FontEditor, ImageEditor System.Web.UI.Design.WebControls: RegexTypeEditor System.Windows.Forms.Design: MaskPropertyEditor, FileNameEditor, FolderNameEditor, ShortcutKeysEditor

Wykład 7-13 Edycja własnych typów Możliwości: jako tekst wymaga konwertera (TypeConverter) edycja w liście rozwijalnej - wymaga UITypeEditor edycja w modalnym oknie dialogowym - wymaga UITypeEditor

Wykład 7-14 Edytor typu z interfejsem użytkownika Niezbędne czynności: stworzyć klasę dziedziczącą z UITypeEditor nadpisać GetEditStyle(), zwrócić wartość: None, DropDown lub Modal nadpisać EditValue(), parametry: ITypeDescriptorContext kontekst (także edytowana kontrolka) IServiceProvider do wyświetlenia okna lub listy rozwijalnej Opcjonalnie: konstruktor (inicjalizacja) GetPaintValueSupported(), PaintValue() wyświetlanie graficznej reprezentacji wartości

Wykład 7-15 Przykład edytora typu z interfejsem użytkownika public class MyEditor : UITypeEditor { public override object EditValue( ITypeDescriptorContext context, IServiceProvider provider, object value) { if (context!= null && context.instance!= null && provider!= null) { IWindowsFormsEditorService edsvc = (IWindowsFormsEditorService)provider.GetService( typeof(iwindowsformseditorservice)); if (edsvc!= null) { MyControl orgctrl = (MyControl)context.Instance; MyControl propctrl = new MyControl(); propctrl.width = orgctrl.width; (...) edsvc.dropdowncontrol(propctrl); return propctrl.points; return value; public override UITypeEditorEditStyle GetEditStyle( ITypeDescriptorContext context) { return UITypeEditorEditStyle.DropDown;

Wykład 7-16 Serializacja kodu Po modyfikacji wartości w oknie właściwości Visual Studio musi zapisać kod odpowiadający tym modyfikacjom w metodze InitializeComponent() Podstawowa serializacja Visual Studio sprawdza wszystkie publiczne właściwości kontrolki i generuje instrukcje ustawiania ich wartości DefaultValueAttribute może być wykorzystany do ograniczenia ilości kodu generowanego przez Visual Studio kod zostanie wygenerowany tylko dla właściwości o wartościach różnych od domyślnych

Wykład 7-17 Programistyczna serializacja kodu Reset... ustawienie domyślnej wartości dla właściwości ShouldSerialize... czy Visual Studio powinno wygenerować kod dla ustawienia aktualnej wartości Nie używać DefaultValueAttribute z tymi metodami [(...)] public Image SourceImage { (...) public bool ShouldSerializeSourceImage() { return (image!= null); [(...)] public Point[] Points { (...) public void ResetPoints() { points[0].x = 25; points[0].y = 25; (...) Invalidate();

Wykład 7-18 Własne właściwości Użycie atrybutów wykorzystywanych podczas edycji Wywołanie Invalidate() dla wymuszenia odświeżenia Użycie konwerterów typów dla niestandardowych typów [Browsable(true), Category("Image"), DefaultValue(null), Description("Image drawn in the control")] public Image SourceImage { get { return image; set { image = value; Invalidate();

Wykład 7-19 Własne zdarzenia private EventHandler onpointschanged; [Browsable(true), Category("Specific events"), Description("Notification that points have changed")] public event EventHandler PointsChanged { add { onpointschanged += value; remove { onpointschanged -= value; public Point[] Points { get { return points; set { points = value; if (onpointschanged!= null) { onpointschanged(this, EventArgs.Empty); Invalidate(); Krzysztof Mossakowski

Wykład 7-20 Rysowanie zawartości kontrolki protected override void OnPaint(PaintEventArgs pe) { Graphics gr = pe.graphics; gr.smoothingmode = SmoothingMode.AntiAlias; if (DesignMode) { gr.fillrectangle(brushes.pink, pe.cliprectangle); GraphicsPath path = BuildPath(); if (DesignMode EditMode) { gr.drawrectangle(pens.black,0,0,width-1,height-1); gr.drawpath(pens.black, path); for (int i = 0; i < points.length; i++) { gr.fillrectangle(brushes.red, Points[i].X-size,Points[i].Y-size, 2*size+1,2*size+1); if (this.image!= null) { TextureBrush tb = new TextureBrush(image); gr.fillpath(tb,path); tb.dispose(); base.onpaint(pe);

Wykład 7-21 Użycie stylów wizualnych Klasa ControlPaint rysowanie elementów standardowych kontrolek systemowych Uniwersalne klasy, których można użyć niezależnie od ustawień systemowych: ButtonRenderer, CheckBoxRenderer, GroupBoxRenderer, RadioButtonRenderer Klasy, których można użyć wyłącznie przy włączonej obsłudze stylów wizualnych w systemie: ComboBoxRenderer, ProgressBarRenderer, ScrollBarRenderer, TabRenderer, TextBoxRenderer, TrackBarRenderer

Wykład 7-22 Przykład użycia stylów wizualnych protected override void OnPaint(PaintEventArgs e) { base.onpaint(e); if (!ComboBoxRenderer.IsSupported) { ControlPaint.DrawComboButton(e.Graphics, this.clientrectangle, ButtonState.Normal); else { ComboBoxRenderer.DrawDropDownButton(e.Graphics, this.clientrectangle, ComboBoxState.Normal);

Wykład 7-23 Rysowanie elementów kontrolek private VisualStyleRenderer renderer = null; private readonly VisualStyleElement element = VisualStyleElement.StartPanel.LogOffButtons.Normal; public CustomControl() { if (Application.RenderWithVisualStyles && VisualStyleRenderer.IsElementDefined(element)) { renderer = new VisualStyleRenderer(element); protected override void OnPaint(PaintEventArgs e) { if (renderer!= null) { renderer.drawbackground(e.graphics, this.clientrectangle); else { this.text = "Visual styles are disabled."; TextRenderer.DrawText(e.Graphics, this.text, this.font, new Point(0, 0), this.forecolor);

Windows Presentation Foundation WPF

Założenia WPF Platforma z bogatymi możliwościami prezentacji Programowalna platforma Możliwość określania zachowania i wyglądu na poziomie deklaratywnym Integracja interfejsu użytkownika, dokumentów i multimediów Wykorzystanie najlepszych cech środowiska WWW i środowiska systemu Windows Integracja programistów i grafików

Historia WPF 2001 2003 2006 2007 2008 Powstaje w Microsoft zespół, którego zadaniem ma być stworzenie nowej platformy prezentacji, która mogłaby zastąpić User32/GDI32, Visual Basic, DHTML i Windows Forms Projekt o nazwie Avalon zostaje ogłoszony na konferencji PDC Premiera WPF jako części składowej.net Framework 3.0 VS 2005 Extensions for.net 3.0 (CTP) WPF wbudowany w Windows Vista.NET Framework 3.5 Expression Blend 1.0 VS 2008 & VS WPF Designer WPF 3.5 SP1 (jako część.net 3.5 SP1)

Obsługiwane wersje Windows WPF wraz z.net Framework 3.0 jest wbudowany w: Windows Vista Windows Server 2008 WPF można zainstalować wraz z.net Framework 3.x (w szczególności 3.5 SP1) na: Windows XP SP2 Windows Server 2003

Najważniejsze cechy WPF Usługi graficzne w całości oparte o Direct3D zaawansowane możliwości graficzne wykorzystanie GPU (Graphics Processing Unit) z karty graficznej grafika wektorowa skalowalna bez straty jakości renderowanie scen trójwymiarowych Współpraca z poprzednimi rozwiązaniami WPF i Win32 mogą wykorzystywać się wzajemnie WPF może wykorzystywać kontrolki Windows Forms (WindowsFormsHost) Windows Forms może wykorzystywać elementy WPF (ElementHost) Adnotacje - możliwość tworzenia, przechowywania i zarządzania w obrębie dokumentów

Najważniejsze cechy WPF c.d. Usługi multimedialne grafika 2D z wbudowanymi zestawami pędzli, piór, geometrii i transformacji możliwości grafiki 3D jako podzbiór pełnego zestawu Direct3D obsługa większości popularnych formatów obrazów obsługa Windows Imaging Component pozwalającego na pisanie kodeków obsługa filmów WMF, MPEG i niektórych AVI obsługa kodeków Windows Media Player Animacje animacje oparte na upływie czasu animacje mogą być uruchamiane w reakcji na zdarzenia, włączając w to akcje użytkownika efekty animacji mogą być definiowane dla poszczególnych obiektów zestaw predefiniowanych efektów animacji

Najważniejsze cechy WPF c.d. Wiązanie danych 3 typy wiązań danych: One time: klient ignoruje modyfikacje danych One way: klient ma dostęp tylko do odczytu danych Two way: klient może odczytać i zmodyfikować dane także wyrażenia LINQ mogą być używane jako źródła danych Interfejs użytkownika zestaw wbudowanych kontrolek modyfikowalne wzorce kontrolek (wygląd i zachowanie kontrolek) aplikacja nie troszczy się o odrysowanie swojej zawartości Dokumenty obsługa dokumentów XPS (XML Paper Specification) obsługa stronicowanych dokumentów z wykorzystaniem Open Packaging Convention

Najważniejsze cechy WPF c.d. Tekst obsługa fontów OpenType, TrueType i OpenType CFF obsługa Unicode wbudowane cechy: sprawdzanie poprawności, automatyczne rozmieszczenie linii tekstu, podziały linii zależne od języka, dzielenie słów, wyrównywanie tekstu, efekty i transformacje graficzne (np. cienie, rozmycie, poświata, obrót, pochylenie itp.) obsługa animacji w tekstach (zarówno w definicji znaków jak i w pozycji, rozmiarze, kolorze i przezroczystości całości tekstu) Dostęp dla osób z upośledzeniami Microsoft UI Automation

Architektura PresentationFramework elementy prezentacji widoczne dla użytkownika (układ elementów, animacje, wiązanie danych i inne) PresentationCore wrapper dla MIL implementuje podstawowe usługi milcore Media Integration Layer bezpośrednio stykający się z DirectX komponent natywny

Podstawowe klasy Lecture 7-33 http://windowsclient.net

System.Threading.DispatcherObject Większość klas WPF dziedziczy z klasy DispatcherObject Ta klasa daje obsługę współbieżności i wielowątkowości WPF jest oparte o system komunikatów dla wywołań pomiędzy wątkami wykorzystywane są komunikaty User32 Wszystkie aplikacje WPF uruchamiane są z dwoma wątkami jednym obsługującym interfejs użytkownika i drugim obsługującym renderowanie i rysowanie

System.Windows.DependencyObject Jednym z podstawowych założeń było wykorzystanie właściwości zamiast metod i zdarzeń właściwości są deklaratywne, pozwalają na określanie celów zamiast akcji System właściwości zawarty w WPF jest bogatszy niż w CLR i jest oparty na klasie DependencyObject System właściwości WPF obsługuje powiadomienia o zmianie wartości

System.Windows.Media.Visual Klasa Visual pozwala na budowanie drzewa obiektów wizualnych, tzn. obiektów mogących zawierać instrukcje rysowania i metadane informujące w jaki sposób te instrukcje mają być wykonywane (np. transformacje) Ta klasa jest miejscem styku dwóch podsystemów zarządzanego API i natywnego milcore WPF wyświetla dane wykorzystując niezarządzane struktury danych obsługiwane przez milcore Całe drzewo elementów wizualnych i instrukcji rysujących może być trzymane w pamięci podręcznej Komponenty są rysowane "od tyłu", co pozwala na przezroczystość elementów nie jest wykorzystywane obcinanie

System.Windows.UIElement Klasa UIElement definiuje podstawowe podsystemy WPF, m.in. układ elementów, wejście od użytkownika i zdarzenia Układ elementów jest podstawowym pojęciem w WPF na poziomie UIElement obsługiwany jest model dwóch faz układu ustalenia rozmiaru i położenia elementów Wejście od użytkownika pochodzi ze sterowników urządzeń jest przesyłane do odpowiedniego procesu i wątku za pośrednictwem User32 w momencie otrzymania go przez aplikację WPF jest konwertowany to formatu WPF i wysyłany do obiektu dispatchera WPF pozwala na to, by na podstawie jednego otrzymanego sygnału było wywoływanych wiele zdarzeń

System.Windows.FrameworkElement Klasa umożliwiająca dostosowanie elementów do własnych potrzeb jej głównym zadaniem jest umożliwienie dowolności układu elementów w aplikacji Wprowadza dwa nowe podsystemy: wiązanie danych pozwala na powiązanie właściwości do danych WPF pozwala na wiązanie właściwości, transformacje i wiązanie danych w postaci listy wzorce danych pozwalają na deklaratywne określenie sposobu wizualizacji danych style (to także forma wiązania danych) pozwalają na powiązanie zbioru właściwości elementu z definicją wyglądu podaną dla klasy tego elementu

System.Windows.Controls.Control Najbardziej znaczącą cechą klasy Control jest możliwość stosowania wzorców wzorce pozwalają na określenie sposobu wizualizacji kontrolki w deklaratywny, opcjonalnie sparametryzowany sposób Content model dla przykładu zawartością przycisku może być zwykły tekst, złożony obiekt lub nawet drzewo elementów wzorzec danych jest wykorzystywany podczas wizualizacji kontrolki

XAML Extensible Application Markup Language (XAML) językiem znaczników (markup language) umożliwiającym programowanie deklaratywne programista lub grafik jest w stanie określić zachowanie, wygląd i integrację elementów bez konieczności programowania strukturalnego Pozwala na oddzielenie modelu od widoku Chociaż możliwe jest zaprogramowanie całości np. w C# Kod napisany w XAML może być skompilowany do zarządzanego assembly w taki sam sposób jak w przypadku innych języków.net Framework Wykorzystanie XAML nie jest ograniczone do WPF, chociaż został wprowadzony jako część składowa

Przykłady kodu XAML Lecture 7-41 <Application x:class="wpfapp.app" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="Window1.xaml"> <Application.Resources> </Application.Resources> </Application> <Window x:class="wpfapp.window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300"> <Grid> </Grid> </Window>

Lecture 7-42 Przestrzenie nazw XAML Przestrzenie nazw XML są deklarowane w postaci atrybutów atrybuty mogą być umieszczone w dowolnym elemencie XML rozpoczynającym tag, ale zwykle są w pierwszym tagu w dokumencie zadeklarowana przestrzeń nazw może być użyta w dowolnym miejscu dokumentu XAML wykorzystuje dwie podstawowe przestrzenie nazw: http://schemas.microsoft.com/winfx/2006/xaml zawiera różne pomocnicze cechy XAML domyślnie jest zmapowana do prefiksu x, który może być wykorzystany przy odwołaniu do elementu tej przestrzeni (<x:elementname>) http://schemas.microsoft.com/winfx/2006/xaml/presentation zawiera wszystkie klasy WPF jest domyślną przestrzenią nazw definiowaną bez prefiksu

Klasa Application Obiekt Application jest odpowiedzialny za zarządzanie całością aplikacji, włączając w to jej stan, utworzone okna (lub strony) i zasoby Początkiem aplikacji jest wywołanie metody Run using System; using System.Windows; namespace WpfApplication1 { static class Program { [STAThread] static void Main() { Application app = new Application(); Window w = new Window(); w.title = "Hello World"; w.show(); app.run();

Cykl życia aplikacji 1. Tworzony jest obiekt klasy Application 2. Wywoływana jest metoda Run 3. Zgłaszane jest zdarzenie Application.Startup obsługa tego zdarzenia jest najlepszym miejscem na inicjalizację aplikacji 4. Tworzone i używane są okna (lub strony) 5. Wywoływana jest metoda Application.Shutdown 6. Zgłaszane jest zdarzenie Application.Exit 7. Metoda Run kończy swoje działanie

Obsługa błędów Zdarzenie Application.DispatcherUnhandledException jest wywoływane dla każdego nieprzechwyconego wyjątku Flaga DispatcherUnhandledExceptionEventArgs.Handled oznacza, że wyjątek może być zignorowany i aplikacja może kontynuować pracę <Application [...] DispatcherUnhandledException="App_UnhandledException"> </Application> public partial class App : Application { private void App_UnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) { using (StreamWriter errorlog = new StreamWriter("c:\\error.log", true)) { errorlog.writeline("error @ " + DateTime.Now.ToString()); errorlog.writeline(e.exception.tostring()); e.handled = true;

Stan aplikacji Obiekt aplikacji jest dostępny jako statyczna właściwość Application.Current Właściwość Application.Properties udostępnia słownik, w którym mogą być przechowywane dowolne dane Application.Current.Properties["LastError"] = e.exception; object lasterror = Application.Current.Properties["LastError"]; if (lasterror!= null && lasterror is DivideByZeroException) {