Presentation Foundation
WPF
Programowanie w środowisku Windows
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
– W Microsoft powstaje zespół, którego zadaniem ma byd stworzenie nowej platformy prezentacji, która mogłaby zastąpid User32/GDI32, Visual Basic, DHTML i Windows Forms
• 2003
– Projekt o nazwie Avalon zostaje ogłoszony na konferencji PDC
• 2006
– Premiera WPF jako części składowej .NET Framework 3.0 – VS 2005 Extensions for .NET 3.0 (CTP)
• 2007
– WPF wbudowany w Windows Vista – .NET Framework 3.5
– Expression Blend 1.0
– VS 2008 & VS WPF Designer
• 2008
– WPF 3.5 SP1 (jako częśd .NET 3.5 SP1)
• 2010
– WPF 4 (.NET 4.0)
• 2012
Programowanie w środowisku Windows
Obsługiwane wersje Windows
WPF wraz z .NET Framework jest wbudowany w:
Windows Vista, Windows 7, Windows 8
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
Programowanie w środowisku Windows
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
Programowanie w środowisku Windows
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
Programowanie w środowisku Windows
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
Programowanie w środowisku Windows
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
Programowanie w środowisku Windows
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
Programowanie w środowisku Windows
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
Programowanie w środowisku Windows
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>
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
Programowanie w środowisku Windows
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
Programowanie w środowisku Windows
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
object lastError = Application.Current.Properties["LastError"];
if (lastError != null &&
lastError is DivideByZeroException) { }
Application.Current.Properties["LastError"] = e.Exception;