Einführung in Windows Presentation Foundation
Aktualisiert: November 2007
Windows Presentation Foundation (WPF) ist ein Präsentationssystem der nächsten Generation zum Erstellen von Windows-Clientanwendungen mit einem visuell herausragenden Benutzererlebnis. Mit WPF kann ein breites Spektrum an eigenständigen oder in einem Browser gehosteten Anwendungen erstellt werden. Zu den Beispielen zählen Yahoo! Messenger und New York Times Reader sowie die Beispielanwendung Contoso Healthcare, die in der folgenden Abbildung dargestellt wird.
Der Kern von WPF ist ein von der Auflösung unabhängiges vektorbasiertes Renderingmodul, das für die optimale Ausnutzung moderner Grafikhardware entwickelt wurde. WPF erweitert den Kern um umfassende Features für die Anwendungsentwicklung. Dazu zählen Extensible Application Markup Language (XAML), Steuerelemente, Datenbindung, Layout, 2D- und 3D-Grafiken, Animation, Stile, Vorlagen, Dokumente, Medien, Text sowie Typografie. WPF ist in Microsoft .NET Framework enthalten, sodass Anwendungen erstellt werden können, in denen andere Elemente der .NET Framework-Klassenbibliothek integriert sind.
Diese Übersicht ist für Einsteiger gedacht und beschreibt die wichtigsten Funktionen und Begriffe von WPF. Sie ist möglicherweise auch für erfahrene WPF-Entwickler geeignet, die einen Überblick über WPF erhalten möchten.
Tipp
Neue und aktualisierte WPF-Features von .NET Framework 3.5 finden Sie unter Neues in Windows Presentation Foundation Version 3.5.
Dieses Thema enthält folgende Abschnitte.
- Programmieren mit WPF
- Markup und Code-Behind
- Anwendungen
- Steuerelemente
- Eingabe und Befehle
- Layout
- Datenbindung
- Grafiken
- Animation
- Medien
- Text und Typografie
- Dokumente
- Anpassen von WPF-Anwendungen
- Bewährte Methoden für WPF
- Zusammenfassung
- Empfohlene Übersichten und Beispiele
- Verwandte Abschnitte
Programmieren mit WPF
WPF existiert als Teilmenge von .NET Framework-Typen, die sich zum größten Teil im System.Windows-Namespace befinden. Wenn Sie zuvor Anwendungen mit .NET Framework unter Verwendung verwalteter Technologien wie ASP.NET und Windows Forms erstellt haben, sollten Ihnen die Grundlagen der WPF-Programmierung vertraut sein. Es werden Klassen instanziiert, Eigenschaften festgelegt, Methoden aufgerufen, Ereignisse behandelt, und das alles mit Ihrer bevorzugten .NET Framework-Programmiersprache, wie z. B. C# oder Visual Basic.
Zur Unterstützung einiger fortgeschrittener WPF-Funktionen und zur Vereinfachung des Programmierens enthält WPF zusätzliche Programmierkonstrukte, die Eigenschaften und Ereignisse optimieren: Abhängigkeitseigenschaften und Routingereignisse. Weitere Informationen über Abhängigkeitseigenschaften finden Sie unter Übersicht über Abhängigkeitseigenschaften. Weitere Informationen über Routingereignisse finden Sie unter Übersicht über Routingereignisse.
Markup und Code-Behind
WPF bietet zusätzliche Programmiererweiterungen zur Entwicklung von Windows-Clientanwendungen. Eine maßgebliche Verbesserung ist die Möglichkeit, eine Anwendung sowohl mit Markup als auch mit Code-Behind zu entwickeln, eine Erfahrung, mit der ASP.NET-Entwickler vertraut sein sollten. Im Allgemeinen wird mithilfe von Extensible Application Markup Language (XAML)-Markup die Darstellung einer Anwendung implementiert und mithilfe von verwalteten Programmiersprachen (Code-Behind) das entsprechende Verhalten. Diese Trennung von Darstellung und Verhalten bietet folgende Vorteile:
Entwicklungs- und Wartungskosten werden reduziert, da darstellungsspezifisches Markup und verhaltensspezifischer Code nicht eng aneinander gekoppelt sind.
Die Entwicklung ist effizienter, da Designer und Entwickler parallel die Darstellung einer Anwendung und das Verhalten der Anwendung implementieren können.
Mithilfe mehrerer Entwurfstools kann XAML-Markup implementiert und freigegeben werden, um die Anforderungen der beteiligten Anwendungsentwickler zu erfüllen. Microsoft Expression Blend ist auf Designer zugeschnitten, während sich Visual Studio 2005 an Entwickler richtet.
Die Globalisierung und Lokalisierung für WPF-Anwendungen wird stark vereinfacht (siehe Übersicht über WPF-Globalisierung und -Lokalisierung).
Nachfolgend erhalten Sie eine kurze Einführung in WPF-Markup und Code-Behind. Weitere Informationen über dieses Programmiermodell finden Sie unter Übersicht über XAML und unter Code-Behind und XAML.
Markup
XAML ist eine auf XML basierende Markupsprache, mit der die Darstellung einer Anwendung deklarativ implementiert werden kann. Sie wird üblicherweise dazu verwendet, Fenster, Dialogfelder, Seiten und Benutzersteuerungen zu erstellen und diese mit Steuerelementen, Formen und Grafiken zu füllen.
Im folgenden Beispiel wird XAML verwendet, um die Darstellung eines Fensters zu implementieren, das eine einzelne Schaltfläche enthält.
<Window
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
Title="Window with Button"
Width="250" Height="100">
<!-- Add button to window -->
<Button Name="button">Click Me!</Button>
</Window>
Insbesondere werden dabei durch XAML ein Fenster und eine Schaltfläche mithilfe der Elemente Window bzw. Button definiert. Jedes Element wird mit Attributen konfiguriert, wie z. B. bei dem Window-Element, durch dessen Title-Attribut der Text in der Titelleiste des Fensters festgelegt wird. Zur Laufzeit werden die in Markup definierten Elemente und Attribute von WPF in Instanzen von WPF-Klassen konvertiert. Beispielsweise wird das Window-Element in eine Instanz der Window-Klasse konvertiert, deren Title-Eigenschaft dem Wert des Title-Attributs entspricht.
In der folgenden Abbildung wird die Benutzeroberfläche (user interface, UI) dargestellt, die im vorherigen Beispiel mithilfe von XAML definiert wurde.
Weitere Informationen finden Sie unter Übersicht über XAML.
Da XAML auf XML basiert, wird die damit erstellte Benutzeroberfläche in einer Hierarchie geschachtelter Elemente erstellt. Diese wird als Elementstruktur bezeichnet. Mithilfe der Elementstruktur können UIs auf logische und intuitive Weise erstellt und verwaltet werden. Weitere Informationen finden Sie unter Strukturen in WPF.
Code-Behind
Das hauptsächliche Verhalten einer Anwendung liegt darin, die Funktionalität zu implementieren, mit der auf die Interaktionen des Benutzers reagiert wird. Dazu zählen das Behandeln von Ereignissen (z. B. Klicken auf Menüs, Symbolleisten oder Schaltflächen) sowie das Aufrufen von Geschäftslogik und Datenzugriffslogik in Reaktion darauf. In WPF wird dieses Verhalten im Allgemeinen in Code implementiert, der mit Markup verknüpft ist. Diese Art von Code wird als Code-Behind bezeichnet. Im folgenden Beispiel werden Code-Behind und aktualisiertes Markup aus dem vorherigen Beispiel dargestellt.
<Window
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.AWindow"
Title="Window with Button"
Width="250" Height="100">
<!-- Add button to window -->
<Button Name="button" Click="button_Click">Click Me!</Button>
</Window>
Namespace SDKSample
Partial Public Class AWindow
Inherits System.Windows.Window
Public Sub New()
' InitializeComponent call is required to merge the UI
' that is defined in markup with this class, including
' setting properties and registering event handlers
InitializeComponent()
End Sub
Private Sub button_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
' Show message box when button is clicked
MessageBox.Show("Hello, Windows Presentation Foundation!")
End Sub
End Class
End Namespace
using System.Windows; // Window, RoutedEventArgs, MessageBox
namespace SDKSample
{
public partial class AWindow : Window
{
public AWindow()
{
// InitializeComponent call is required to merge the UI
// that is defined in markup with this class, including
// setting properties and registering event handlers
InitializeComponent();
}
void button_Click(object sender, RoutedEventArgs e)
{
// Show message box when button is clicked
MessageBox.Show("Hello, Windows Presentation Foundation!");
}
}
}
In diesem Beispiel wird durch Code-Behind eine Klasse implementiert, die von der Window-Klasse abgeleitet wird. Mithilfe des x:Class-Attributs wird das Markup mit der Code-Behind-Klasse verknüpft. InitializeComponent wird vom Konstruktor der Code-Behind-Klasse aufgerufen, um die in Markup definierte Benutzeroberfläche mit der Code-Behind-Klasse zusammenzuführen. ((InitializeComponent wird bei der Erstellung der Anwendung automatisch generiert, eine manuelle Implementierung ist daher nicht notwendig.) Mit der Kombination von x:Class und InitializeComponent wird sichergestellt, dass die Implementierung bei der Erstellung immer ordnungsgemäß initialisiert wird. Von der Code-Behind-Klasse wird außerdem ein Ereignishandler für das Click-Ereignis der Schaltfläche implementiert. Beim Klicken auf die Schaltfläche wird vom Ereignishandler durch Aufrufen der MessageBox.Show-Methode ein Meldungsfeld angezeigt.
In der folgenden Abbildung wird das Ergebnis nach dem Klicken auf die Schaltfläche dargestellt.
Weitere Informationen finden Sie unter Code-Behind und XAML.
Anwendungen
.NET Framework, System.Windows sowie Markup und Code-Behind bilden die Grundlage für die Anwendungsentwicklung mit WPF. Darüber hinaus verfügt WPF über umfassende Features zum Erstellen von Benutzererlebnissen mit umfangreichen Inhalten. Um diese Inhalte zu verpacken und für Benutzer als "Anwendungen" bereitzustellen, bietet WPF Typen und Dienste, die zusammengefasst als Anwendungsmodell bezeichnet werden. Das Anwendungsmodell unterstützt die Entwicklung von eigenständigen und im Browser gehosteten Anwendungen.
Eigenständige Anwendungen
Für eigenständige Anwendungen können Sie die Window-Klasse verwenden, um Fenster und Dialogfelder zu erstellen, auf die über Menüleisten und Symbolleisten zugegriffen werden kann. Die folgende Abbildung zeigt eine eigenständige Anwendung mit einem Hauptfenster und einem Dialogfeld.
Darüber hinaus können Sie die folgenden WPF-Dialogfelder verwenden: MessageBox, OpenFileDialog, SaveFileDialog, und PrintDialog.
Weitere Informationen finden Sie unter Übersicht über WPF-Fenster.
Im Browser gehostete Anwendungen
Für im Browser gehostete Anwendungen, als XAML-Browseranwendungen (XBAPs) bezeichnet, können Sie Seiten (Page) und Seitenfunktionen (PageFunction<T>) erstellen, zwischen denen Sie mit Hyperlinks (Hyperlink-Klassen) navigieren können. Die folgende Abbildung zeigt eine Seite in XBAP, die in Internet Explorer 7 gehostet wird.
WPF-Anwendungen können sowohl in Microsoft Internet Explorer 6 als auch in Internet Explorer 7 gehostet werden. WPF bietet die beiden folgenden Optionen für alternative Navigationshosts:
Frame zum Hosten von Inseln navigierbarer Inhalte in Seiten oder Fenstern.
NavigationWindow zum Hosten navigierbarer Inhalte in einem gesamten Fenster.
Weitere Informationen finden Sie unter Übersicht über die Navigation.
Die Application-Klasse
XBAPs und eigenständige Anwendungen sind häufig so komplex, dass zusätzliche anwendungsspezifische Dienste erforderlich sind, wie z. B. Start- und Lebensdauerverwaltung sowie freigegebene Eigenschaften und Ressourcen. Diese und andere Dienste sind in der Application-Klasse gekapselt, die einfach mit XAML implementiert werden kann, wie im folgenden Beispiel gezeigt wird.
<Application
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
StartupUri="MainWindow.xaml" />
Dieser Markupcode ist die Anwendungsdefinition für eine eigenständige Anwendung. Er weist WPF an, ein Application-Objekt zu erstellen, durch das MainWindow beim Start der Anwendung automatisch geöffnet wird.
Als wichtiger Aspekt sollte verstanden werden, dass Application eine allgemeine Plattform zur Unterstützung von eigenständigen oder im Browser gehostete Anwendungen bereitstellt. Beispielsweise könnte das vorangehende XAML von einer im Browser gehosteten Anwendung verwendet werden, um automatisch zu einer Seite zu navigieren, wenn ein XBAP gestartet wird, wie im folgenden Beispiel gezeigt wird.
<Application
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
StartupUri="HomePage.xaml" />
Weitere Informationen finden Sie unter Übersicht über die Anwendungsverwaltung.
Sicherheit
Da XBAPs-Anwendungen in einem Browser gehostet werden, spielt Sicherheit eine wichtige Rolle. XBAPs-Anwendungen verwenden eine teilweise vertrauenswürdige Sandbox für die Sicherheit, um Beschränkungen zu erzwingen, die geringer oder gleichwertig mit den Beschränkungen sind, die für HTML-basierte Anwendungen gelten. Außerdem wurde jedes HTML-Feature, das in teilweiser Vertrauenswürdigkeit von XBAPs sicher ausgeführt werden kann, unter Verwendung eines umfassenden Sicherheitsprozesses getestet. Ausführliche Informationen dazu finden Sie unter Windows Presentation Foundation-Sicherheitsstrategie - Sicherheitsentwicklung.
Über XBAPs kann immer noch ein Großteil der WPF-Features sicher ausgeführt werden, wie unter Windows Presentation Foundation - Sicherheit bei teilweiser Vertrauenswürdigkeit beschrieben.
Steuerelemente
Dem Benutzer werden mithilfe des Anwendungsmodells konstruierte Steuerelemente bereitgestellt. In WPF ist "Steuerelement" ein Sammelbegriff, der sich auf eine Kategorie von WPF-Klassen bezieht, die in einem Fenster oder auf einer Seite gehostet werden, über eine Benutzeroberfläche (user interface, UI) verfügen und ein bestimmtes Verhalten implementieren.
Weitere Informationen finden Sie unter Übersicht über Steuerelemente. Einführende Beispiele finden Sie unter Beispiele der Steuerelementbibliothek.
WPF-Steuerelementrollenaufruf
Die integrierten WPF-Steuerelemente sind hier aufgeführt.
Schaltflächen: Button und RepeatButton.
Dialogfelder: OpenFileDialog, PrintDialog und SaveFileDialog.
Freihandeingaben: InkCanvas und InkPresenter.
Dokumente: DocumentViewer, FlowDocumentPageViewer, FlowDocumentReader, FlowDocumentScrollViewer und StickyNoteControl.
Eingabe: TextBox, RichTextBox und PasswordBox.
Layout: Border, BulletDecorator, Canvas, DockPanel, Expander, Grid, GridView, GridSplitter, GroupBox, Panel, ResizeGrip, Separator, ScrollBar, ScrollViewer, StackPanel, Thumb, Viewbox, VirtualizingStackPanel, Window und WrapPanel.
Medien: Image, MediaElement und SoundPlayerAction.
Menüs: ContextMenu, Menu und ToolBar.
Navigation: Frame, Hyperlink, Page, NavigationWindow und TabControl.
Auswahl: CheckBox, ComboBox, ListBox, TreeView und RadioButton, Slider.
Benutzerinformationen: AccessText, Label, Popup, ProgressBar, StatusBar, TextBlock und ToolTip.
Eingabe und Befehle
Steuerelemente reagieren hauptsächlich auf Benutzereingaben. Das WPF-Eingabesystem verwendet sowohl direkte Ereignisse als auch Routingereignisse für die Unterstützung der Texteingabe, Fokusverwaltung und Mauspositionierung. Weitere Informationen finden Sie unter Übersicht über die Eingabe.
Anwendungen haben oft komplexe Eingabeanforderungen. WPF bietet ein Befehlssystem, bei dem die Eingabeaktionen des Benutzers von dem Code, der auf diese Aktionen reagiert, getrennt sind. Weitere Informationen finden Sie unter Befehlsübersicht.
Layout
Beim Erstellen einer Benutzeroberfläche werden die Steuerelemente durch Position und Größe zu einem Layout angeordnet. Eine der wichtigsten Anforderungen eines Layouts ist die Fähigkeit, sich an Änderungen von Fenstergröße und Anzeigeeinstellungen anzupassen. WPF bietet ein erstklassiges erweiterbares Layoutsystem, sodass kein zusätzlicher Code zum Anpassen des Layouts in diesen Fällen geschrieben werden muss.
Das Layoutsystem basiert auf relativer Positionierung, wodurch die Fähigkeit zur Anpassung an geänderte Fenster- und Anzeigebedingungen verbessert wird. Das Layoutsystem verwaltet außerdem die Aushandlung zwischen Steuerelementen zur Festlegung des Layouts. Die Aushandlung findet in zwei Schritten statt: Zuerst teilt ein Steuerelement dem übergeordneten Element mit, welche Position und Größe es benötigt. Anschließend teilt das übergeordnete Element dem Steuerelement mit, welcher Raum zur Verfügung steht.
Das Layoutsystem wird den untergeordneten Steuerelementen durch WPF-Basisklassen verfügbar gemacht. Für allgemeine Layouts wie Raster, Stapeln und Andocken enthält WPF mehrere Layout-Steuerelemente:
Canvas: Untergeordnete Steuerelemente stellen ihr eigenes Layout bereit.
DockPanel: Untergeordnete Steuerelemente werden an den Rändern des Bereichs ausgerichtet.
Grid: Untergeordnete Steuerelemente werden anhand von Zeilen und Spalten positioniert.
StackPanel: Untergeordnete Steuerelemente werden entweder vertikal oder horizontal gestapelt.
VirtualizingStackPanel: Untergeordnete Steuerelemente werden virtualisiert und auf einer einzelnen Linie angeordnet, die horizontal oder vertikal verläuft.
WrapPanel: Untergeordnete Steuerelemente werden der Reihenfolge nach von links nach rechts angeordnet. Wenn sich in der jeweiligen Zeile mehr Steuerelemente befinden als der Raum zulässt, wird ein Zeilenumbruch durchgeführt.
Im folgenden Beispiel wird ein DockPanel verwendet, um ein Layout aus mehreren TextBox-Steuerelementen zu erstellen.
<Window
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.LayoutWindow"
Title="Layout with the DockPanel" Height="143" Width="319">
<!--DockPanel to layout four text boxes-->
<DockPanel>
<TextBox DockPanel.Dock="Top">Dock = "Top"</TextBox>
<TextBox DockPanel.Dock="Bottom">Dock = "Bottom"</TextBox>
<TextBox DockPanel.Dock="Left">Dock = "Left"</TextBox>
<TextBox Background="White">This TextBox "fills" the remaining space.</TextBox>
</DockPanel>
</Window>
DockPanel ermöglicht den untergeordneten TextBox-Steuerelementen, Informationen über deren Anordnung bereitzustellen. Dazu wird von DockPanel eine Dock-Eigenschaft implementiert, die für untergeordnete Steuerelemente verfügbar gemacht wird, damit von diesen eine jeweilige Andockart festgelegt werden kann.
Tipp
Eine Eigenschaft, die von einem übergeordneten Steuerelement zur Verwendung durch untergeordnete Steuerelemente implementiert wird, ist ein WPF-Konstrukt, das als angefügte Eigenschaft bezeichnet wird (siehe Übersicht über angefügte Eigenschaften).
Die folgende Abbildung zeigt das Ergebnis des XAML-Markups im vorangehenden Beispiel.
Weitere Informationen finden Sie unter Das Layoutsystem. Ein einführendes Beispiel finden Sie unter Beispiel für einen WPF-Layoutkatalog.
Datenbindung
Die meisten Anwendungen werden erstellt, um Benutzern Mittel zum Anzeigen und Bearbeiten von Daten bereitzustellen. Bei WPF-Anwendungen wird die Arbeit zum Speichern und Zugreifen auf Daten von Technologien wie Microsoft SQL Server und ADO.NET übernommen. Nach dem Zugriff und Laden der Daten in die verwalteten Objekte einer Anwendung beginnt die aufwändige Arbeit für WPF-Anwendungen. Dies schließt im Wesentlichen zwei Dinge ein:
Kopieren der Daten aus den verwalteten Objekten in Steuerelemente, wo die Daten angezeigt und bearbeitet werden können.
Sicherstellen, dass mithilfe der Steuerelemente vorgenommene Änderungen an den Daten zurück in die verwalteten Objekte kopiert werden.
Um die Entwicklung von Anwendungen zu vereinfachen, bietet WPF ein Datenbindungsmodul zur automatischen Durchführung dieser Schritte. Die Kerneinheit des Datenbindungsmoduls ist die Binding-Klasse, die die Aufgabe hat, ein Steuerelement (Bindungsziel) an ein Datenobjekt (Bindungsquelle) zu binden. Diese Beziehung wird in der folgenden Abbildung verdeutlicht.
Im folgenden Beispiel wird gezeigt, wie eine TextBox an eine Instanz eines benutzerdefinierten Person-Objekts gebunden wird. Die Person-Implementierung wird im folgenden Code dargestellt.
Namespace SDKSample
Class Person
Private _name As String = "No Name"
Public Property Name() As String
Get
Return _name
End Get
Set(ByVal value As String)
_name = value
End Set
End Property
End Class
End Namespace
namespace SDKSample
{
class Person
{
string name = "No Name";
public string Name
{
get { return name; }
set { name = value; }
}
}
}
Mit dem folgenden Markup wird TextBox an eine Instanz eines benutzerdefinierten Person-Objekts gebunden.
<Window
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.DataBindingWindow">
...
<!-- Bind the TextBox to the data source (TextBox.Text to Person.Name) -->
<TextBox Name="personNameTextBox" Text="{Binding Path=Name}" />
...
</Window>
Imports System.Windows ' Window
Namespace SDKSample
Partial Public Class DataBindingWindow
Inherits Window
Public Sub New()
InitializeComponent()
' Create Person data source
Dim person As Person = New Person()
' Make data source available for binding
Me.DataContext = person
End Sub
End Class
End Namespace
using System.Windows; // Window
namespace SDKSample
{
public partial class DataBindingWindow : Window
{
public DataBindingWindow()
{
InitializeComponent();
// Create Person data source
Person person = new Person();
// Make data source available for binding
this.DataContext = person;
}
}
}
In diesem Beispiel wird die Person-Klasse in Code-Behind instanziiert und als Datenkontext für DataBindingWindow festgelegt. Im Markup ist die Text-Eigenschaft von TextBox an die Person.Name -Eigenschaft gebunden (mithilfe der "{Binding ... }" XAML -Syntax). Dieser XAML-Code weist WPF an, das TextBox-Steuerelement an das Person-Objekt zu binden, das in der DataContext-Eigenschaft des Fensters gespeichert ist.
Das Datenbindungsmodul von WPF bietet zusätzliche Unterstützung wie Überprüfung, Sortierung, Filterung und Gruppierung. Außerdem werden von der Datenbindung Datenvorlagen zum Erstellen einer benutzerdefinierten Benutzeroberfläche für gebundene Daten unterstützt, wenn die von den WPF-Standardsteuerelementen angezeigte Benutzeroberfläche nicht ausreichend ist.
Weitere Informationen finden Sie unter Übersicht über Datenbindung. Ein einführendes Beispiel finden Sie unter Demo für die Datenbindung.
Grafiken
Mit WPF wird ein umfangreicher, skalierbarer und flexibler Satz von Grafikfeatures mit den folgenden Vorteilen eingeführt:
Auflösungsunabhängige und geräteunabhängige Grafiken. Die grundlegende Maßeinheit im WPF-Grafiksystem ist das geräteunabhängige Pixel, was 1/96 Zoll entspricht, unabhängig von der jeweiligen Bildschirmauflösung. Sie bildet die Grundlage für ein von Auflösung und Geräten unabhängiges Rendering. Jedes geräteunabhängige Pixel wird automatisch skaliert, um mit der DPI-Einstellung (Dots Per Inch) der Anzeige des jeweiligen Systems übereinzustimmen.
Höhere Genauigkeit. Das WPF-Koordinatensystem wird mit Gleitkommazahlen in doppelter Genauigkeit gemessen. Transformationen und Durchlässigkeitswerte werden ebenfalls mit doppelter Genauigkeit ausgedrückt. WPF unterstützt auch eine breite Farbskala (scRGB) und bietet integrierte Unterstützung für die Verwaltung von Eingaben aus unterschiedlichen Farbräumen.
Erweiterte Unterstützung für Grafiken und Animationen. WPF vereinfacht die Grafikprogrammierung durch die automatische Verwaltung von Animationsszenen. Szenenverarbeitung, Renderingschleifen und bilineare Interpolation können problemlos angewendet werden. Darüber hinaus unterstützt WPF eine Trefferüberprüfung und bietet vollständige Alpha-Compositing-Unterstützung.
Hardwarebeschleunigung. Das Grafiksystem von WPF schöpft die Grafikhardware aus, um die CPU-Last zu verringern.
2D-Formen
WPF enthält eine Bibliothek allgemeiner vektorbasierter 2D-Formen wie Rechtecke und Ellipsen, die in der folgenden Abbildung dargestellt sind.
Eine interessante Eigenschaft von Formen ist, dass diese nicht nur der Anzeige dienen, sondern mit ihnen auch viele Features implementiert werden können, die Sie von Steuerelementen erwarten, wie z. B. Tastatur- und Mauseingaben. Im folgenden Beispiel wird die Behandlung des MouseUp-Ereignisses einer Ellipse gezeigt.
<Window
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.EllipseEventHandlingWindow"
Title="Click the Ellipse">
<Ellipse Name="clickableEllipse" Fill="Blue" MouseUp="clickableEllipse_MouseUp" />
</Window>
Imports System.Windows ' Window, MessageBox
Imports System.Windows.Input ' MouseButtonEventArgs
Namespace SDKSample
Public Class EllipseEventHandlingWindow
Inherits Window
Public Sub New()
InitializeComponent()
End Sub
Private Sub clickableEllipse_MouseUp(ByVal sender As Object, ByVal e As MouseButtonEventArgs)
MessageBox.Show("You clicked the ellipse!")
End Sub
End Class
End Namespace
using System.Windows; // Window, MessageBox
using System.Windows.Input; // MouseButtonEventHandler
namespace SDKSample
{
public partial class EllipseEventHandlingWindow : Window
{
public EllipseEventHandlingWindow()
{
InitializeComponent();
}
void clickableEllipse_MouseUp(object sender, MouseButtonEventArgs e)
{
// Display a message
MessageBox.Show("You clicked the ellipse!");
}
}
}
In der folgenden Abbildung wird das Ergebnis des vorangehenden Codes dargestellt.
Weitere Informationen finden Sie unter Übersicht über Formen und die grundlegenden Funktionen zum Zeichnen in WPF. Ein einführendes Beispiel finden Sie unter Beispiel für Formelemente.
2D-Geometrien
Die von WPF bereitgestellten 2D-Formen decken den Standardsatz von grundlegenden Formen ab. Möglicherweise müssen jedoch benutzerdefinierte Formen erstellt werden, um die Darstellung einer benutzerdefinierten Benutzeroberfläche zu optimieren. Für diesen Zweck stellt WPF Geometrien bereit. In der folgenden Abbildung wird die Verwendung von Geometrien zur Erstellung einer benutzerdefinierten Form veranschaulicht. Diese kann direkt gezeichnet, als Pinsel oder zum Ausschneiden anderer Formen und Steuerelemente verwendet werden.
Mithilfe von Path-Objekten können geschlossene oder offene Formen, Mehrfachformen und sogar gekrümmte Formen gezeichnet werden.
Geometry-Objekte können zum Ausschneiden, zur Trefferüberprüfung sowie zum Rendern von 2D-Grafikdaten verwendet werden.
Weitere Informationen finden Sie unter Übersicht über die Geometrie. Ein einführendes Beispiel finden Sie unter Beispiele zu Geometrie.
2D-Effekte
Eine Untermenge der 2D-Funktionen von WPF enthält visuelle Effekte wie Farbverläufe, Bitmaps, Zeichnungen, Zeichnen mit Videos, Drehung, Skalierung und Neigung. Diese werden mithilfe von Pinseln erzielt. In der folgenden Abbildung werden einige Beispiele gezeigt.
Weitere Informationen finden Sie unter Übersicht über WPF-Pinsel. Ein einführendes Beispiel finden Sie unter Beispiel für Pinsel.
3D-Rendering
WPF enthält zusätzlich 3D-Renderingfunktionen, die in 2D-Grafiken integriert sind, um noch ansprechendere und interessantere UIs erstellen zu können. Als Beispiel werden in der folgenden Abbildung 2D-Bilder dargestellt, die auf 3D-Formen gerendert wurden.
Weitere Informationen finden Sie unter Übersicht über 3D-Grafiken. Ein einführendes Beispiel finden Sie unter Beispiel zu 3D-Festkörpern.
Animation
Durch die Unterstützung von WPF für Animationen können Sie Steuerelemente wachsen, bewegen, drehen sowie ein- und ausblenden lassen, um z. B. interessante Seitenübergänge zu erzeugen. Die meisten WPF-Klassen und sogar benutzerdefinierte Klassen können animiert werden. In der folgenden Abbildung wird eine einfache Animation in Aktion gezeigt.
Weitere Informationen finden Sie unter Übersicht über Animationen. Ein einführendes Beispiel finden Sie unter Beispielsammlung zu Animationen.
Medien
Eine Möglichkeit, Inhalte interessant zu vermitteln, ist die Verwendung audiovisueller Medien. WPF bietet spezielle Unterstützung für Bilder, Video und Audio.
Bilder
Die meisten Anwendungen enthalten Bilder, und WPF bietet mehrere Möglichkeiten ihrer Verwendung. Die folgende Abbildung zeigt eine Benutzeroberfläche mit einem Listenfeld, das Miniaturbilder enthält. Bei Auswahl einer Miniaturansicht wird das Bild in voller Größe angezeigt.
Weitere Informationen finden Sie unter Übersicht über die Bildverarbeitung. Ein einführendes Beispiel finden Sie unter Demo für WPF-Fotoviewer.
Video und Audio
Mit dem MediaElement-Steuerelement kann sowohl Video als auch Audio wiedergegeben werden. Es ist flexibel genug, um als Grundlage für einen benutzerdefinierten Media Player verwendet zu werden. Mit dem folgenden XAML-Markup wird ein Media Player implementiert.
<MediaElement
Name="myMediaElement"
Source="media/wpf.wmv"
LoadedBehavior="Manual"
Width="350" Height="250" />
Das Fenster in der folgenden Abbildung zeigt das MediaElement-Steuerelement in Aktion.
Weitere Informationen finden Sie unter Übersicht über WPF-Grafiken, Animation und Medien. Ein einführendes Beispiel finden Sie unter Medienkatalog.
Text und Typografie
Um ein hochwertiges Textrendering zu ermöglichen, bietet WPF die folgenden Features:
OpenType-Schriftartunterstützung
ClearType-Optimierungen
Hohe Leistungsfähigkeit durch Nutzung von Hardwarebeschleunigung
Einbinden von Text in Medien, Grafiken und Animationen
Internationale Schriftartunterstützung und Fallbackmechanismen
Zur Demonstration der Texteinbindung in Grafiken wird in der folgenden Abbildung die Anwendung von Textdekorationen veranschaulicht.
Weitere Informationen finden Sie unter Typografie in Windows Presentation Foundation. Einführende Beispiele finden Sie unter Typografiebeispiele.
Dokumente
WPF bietet systemeigene Unterstützung für das Arbeiten mit drei Typen von Dokumenten: Flussdokumente, einheitlich dargestellte Dokumente und XML Paper Specification (XPS)-Dokumente. WPF stellt außerdem die Dienste zum Erstellen, Anzeigen, Verwalten, Verpacken und Drucken von Dokumenten sowie zum Hinzufügen von Anmerkungen bereit.
Flussdokumente
Bei Flussdokumenten werden Anzeige und Lesbarkeit optimiert, indem Inhalte bei Änderungen der Fenstergröße oder Anzeigeeinstellungen dynamisch angepasst und neu aufgebaut werden. Das folgende XAML-Markup enthält die Definition eines FlowDocument.
<FlowDocument xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Paragraph FontSize="18" FontWeight="Bold">Flow Document</Paragraph>
<Paragraph>
Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy
nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi
enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis
nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure.
</Paragraph>
...
</FlowDocument>
Im folgenden Beispiel wird gezeigt, wie ein Flussdokument zum Anzeigen, Durchsuchen und Drucken in einen FlowDocumentReader geladen wird.
<Window
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.FlowDocumentReaderWindow"
Title="Flow Document Reader">
<FlowDocumentReader Name="flowDocumentReader" />
</Window>
Imports System.Windows 'Window
Imports System.Windows.Documents 'FlowDocument
Imports System.IO 'FileStream, FileMode
Imports System.Windows.Markup 'XamlReader
Namespace SDKSample
Public Class FlowDocumentReaderWindow
Inherits Window
Public Sub New()
Me.InitializeComponent()
Using stream1 As FileStream = New FileStream("AFlowDocument.xaml", _
FileMode.Open, FileAccess.Read)
Dim document1 As FlowDocument = _
TryCast(XamlReader.Load(stream1), FlowDocument)
Me.flowDocumentReader.Document = document1
End Using
End Sub
End Class
End Namespace
using System.Windows; // Window
using System.Windows.Documents; // FlowDocument
using System.IO; // FileStream, FileMode
using System.Windows.Markup; // XamlReader
namespace SDKSample
{
public partial class FlowDocumentReaderWindow : System.Windows.Window
{
public FlowDocumentReaderWindow()
{
InitializeComponent();
// Open the file that contains the FlowDocument
using (FileStream xamlFile = new FileStream("AFlowDocument.xaml",
FileMode.Open, FileAccess.Read))
{
// Parse the file with the XamlReader.Load method
FlowDocument content = XamlReader.Load(xamlFile) as FlowDocument;
// Set the Document property to the parsed FlowDocument object
this.flowDocumentReader.Document = content;
}
}
}
}
Im folgenden Beispiel wird das Ergebnis dargestellt.
Weitere Informationen finden Sie unter Übersicht über Flussdokumente. Ein einführendes Beispiel finden Sie unter Beispiel für FlowDocument-Eigenschaften.
Einheitlich dargestellte Dokumente
Einheitlich dargestellte Dokumente sind für Anwendungen geeignet, bei denen eine präzise WYSIWYG-Präsentation ("What you see is what you get") erforderlich ist, besonders im Hinblick auf das Ausdrucken. Zu den typischen Verwendungsformen von einheitlich dargestellten Dokumenten zählen Desktopveröffentlichung, Wortverarbeitung und Formularlayout, wo die Beibehaltung der ursprünglichen Seitendarstellung wichtig ist.
In einheitlich dargestellten Dokumenten wird die genaue Anordnung der Inhalte unabhängig vom jeweiligen Gerät aufrechterhalten. Beispielsweise wird ein einheitlich dargestelltes Dokument, das mit 96 DPI (Dots Per Inch) auf einem Bildschirm angezeigt wird, auf dieselbe Weise dargestellt, wenn es auf einem Laserdrucker mit 600 DPI oder auf einem Fotodrucker mit 4800 DPI gedruckt wird. Das Layout bleibt in allen Fällen gleich, auch wenn die Qualität des Dokuments je nach Eigenschaften des jeweiligen Geräts variiert.
Weitere Informationen finden Sie unter Dokumente in Windows Presentation Foundation.
XPS-Dokumente
XML Paper Specification (XPS)-Dokumente basieren auf einheitlich dargestellten Dokumenten von WPF. XPS-Dokumente werden mithilfe eines XML-basierten Schemas beschrieben. Dabei handelt es sich im Wesentlichen um eine in Seiten aufgeteilte Darstellung von elektronischem Papier. XPS ist ein offenes, plattformübergreifendes Format für Dokumente, mit dem das Erstellen, Freigeben, Drucken und Archivieren mehrseitiger Dokumente erleichtert werden soll. Die XPS-Technologie bietet u. a. folgende wichtige Features:
Das Verpacken von XPS-Dokumenten als ZipPackage-Dateien, die den Open Packaging Conventions (OPC) entsprechen
Das Hosten in eigenständigen und browserbasierten Anwendungen
Das manuelle Erstellen und Bearbeiten von XPS-Dokumenten in WPF-Anwendungen
Hochwertiges Rendering durch Erzielen der maximalen Qualität des Ausgabegeräts
Windows Vista-Druckwarteschlangen
Direktes Routing von Dokumenten zu XPS-kompatiblen Druckern
Benutzeroberfläche-Einbindung in DocumentViewer
Die folgende Abbildung zeigt ein XPS-Dokument, das von einem DocumentViewer angezeigt wird.
Mithilfe von DocumentViewer können Benutzer XPS-Dokumente auch durchsuchen, drucken und deren Ansicht ändern.
Weitere Informationen finden Sie unter Dokumente in Windows Presentation Foundation. Ein einführendes Beispiel finden Sie unter Beispiel zum Erstellen eines XPS-Dokuments.
Anmerkungen
Anmerkungen sind Notizen oder Kommentare, die Dokumenten zur Information oder Kennzeichnung hinzugefügt werden. Im Gegensatz zum Schreiben von Notizen auf gedruckte Dokumente ist das "Schreiben" von Notizen auf elektronische Dokumente oft eingeschränkt oder nicht möglich. Dagegen ist in WPF ein System für Anmerkungen zur Unterstützung von Kurznotizen und Kennzeichnungen enthalten. Diese Anmerkungen können außerdem auf im DocumentViewer-Steuerelement gehostete Dokumente angewendet werden, wie in der folgenden Abbildung veranschaulicht wird.
Weitere Informationen finden Sie unter Übersicht über Anmerkungen. Ein einführendes Beispiel finden Sie unter Beispiel für die Dokumentserialisierung.
Verpacken
Mit WPFSystem.IO.Packaging APIs können Daten, Inhalte und Ressourcen Ihrer Anwendungen in einzelnen, portablen, leicht verteilbaren und leicht zugreifbaren ZIP-Dokumenten organisiert werden. Digitale Signaturen können eingebunden werden, um in einem Paket enthaltene Elemente zu authentifizieren und um sicherzustellen, dass diese Elemente nicht manipuliert oder bearbeitet wurden. Sie können Pakete mithilfe der Rechteverwaltung auch verschlüsseln, um den Zugriff auf geschützte Informationen einzuschränken.
Weitere Informationen finden Sie unter Dokumente in Windows Presentation Foundation. Beispiele finden Sie unter Beispiele für das Verpacken.
.NET Framework umfasst ein Subsystem für das Drucken, das von WPF durch die Unterstützung für eine verbesserte Drucksystemsteuerung ergänzt wird. Folgende Verbesserungen gibt es im Druckbereich:
Echtzeitinstallation von Remote-Druckservern und Warteschlangen
Dynamische Erkennung von Druckerfunktionen
Dynamische Einstellung von Druckeroptionen
Wiederholtes Routing und Festlegen der Priorität von Druckaufträgen
XPS-Dokumente verfügen außerdem über eine grundlegende Verbesserung bezüglich der Leistung. Der vorliegende Microsoft Windows Graphics Device Interface (GDI)-Druckpfad erfordert üblicherweise zwei Konvertierungen:
Zuerst wird das Dokument in ein Druckprozessorformat wie Erweiterte Metadatei (Enhanced Metafile, EMF) konvertiert.
Anschließend wird eine Konvertierung in die Seitenbeschreibungssprache des Druckers durchgeführt, wie z. B. PCL (Printer Control Language) oder PostScript.
Bei XPS-Dokumenten werden diese Konvertierungen umgangen, da eine Komponente des XPS-Dateiformats eine Druckprozessorsprache und eine Seitenbeschreibungssprache ist. Dadurch werden die Größe von Spooldateien und die Auslastung von Netzwerkdruckern verringert.
Weitere Informationen finden Sie unter Übersicht über das Drucken. Ein einführendes Beispiel finden Sie unter Drucken eines XPS-Dokuments.
Anpassen von WPF-Anwendungen
Sie haben bis jetzt die Bausteine von WPF zur Entwicklung von Anwendungen kennen gelernt. Das Anwendungsmodell wird zum Hosten und Bereitstellen von Anwendungsinhalten verwendet, die hauptsächlich aus Steuerelementen bestehen. Das WPF-Layoutsystem wird verwendet, um die Anordnung von Steuerelementen in einer Benutzeroberfläche zu vereinfachen und sicherzustellen, dass die Anordnung bei Änderungen von Fenstergröße und Anzeigeeinstellungen erhalten bleibt. Da die meisten Anwendungen die Interaktion von Benutzern mit Daten ermöglichen, wird Datenbindung verwendet, um die Arbeit zur Einbindung der Daten in die Benutzeroberfläche zu verringern. Zur Optimierung der visuellen Darstellung Ihrer Anwendung verwenden Sie das umfangreiche Funktionsspektrum für Grafik, Animation und Medien von WPF. Wenn Ihre Anwendung mit Text und Dokumenten umgeht, können Sie die WPF-Funktionen für Text, Typografie, Dokumente, Anmerkungen, Verpackung und Druck verwenden.
Oft reichen die Grundlagen jedoch nicht aus, um ein wirklich herausragendes und visuell eindrucksvolles Benutzererlebnis zu kreieren. Die Standardsteuerelemente von WPF passen möglicherweise nicht zum gewünschten Erscheinungsbild Ihrer Anwendung. Daten können vielleicht nicht auf die bestmögliche Art angezeigt werden. Der Gesamteindruck Ihrer Anwendung passt eventuell nicht zum Standardaussehen und Verhalten der Windows-Designs. Präsentationstechnologien erfordern auf viele Arten Erweiterbarkeit, so auch beim visuellen Aspekt.
Aus diesem Grund bietet WPF eine Vielzahl von Mechanismen zum Erzeugen einzigartiger Benutzererlebnisse, wie z. B. ein umfangreiches Inhaltsmodell für Steuerelemente, Trigger, Steuerelement- und Datenvorlagen, Stile, Benutzeroberfläche-Ressourcen und Designs.
Inhaltsmodell
Die meisten WPF-Steuerelemente haben hauptsächlich die Aufgabe, Inhalte anzuzeigen. In WPF werden Typ und Anzahl der Elemente, die den Inhalt eines Steuerelements ausmachen, als das Inhaltsmodell des Steuerelements bezeichnet. Einige Steuerelemente können ein einziges Element und einen Typ enthalten. Beispielsweise ist der Inhalt eines TextBox-Steuerelements ein Zeichenfolgenwert, der der Text-Eigenschaft zugewiesen ist. Im folgenden Beispiel wird der Inhalt eines TextBox-Steuerelements festgelegt.
<Window
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.TextBoxContentWindow"
Title="TextBox Content">
...
<TextBox Text="This is the content of a TextBox." />
...
</Window>
In der folgenden Abbildung wird das Ergebnis dargestellt.
Andere Steuerelemente können jedoch mehrere Elemente verschiedener Inhaltstypen enthalten. Der Inhalt einer Button, der durch die Content-Eigenschaft festgelegt ist, kann beispielsweise aus einer Vielzahl von Steuerelementen wie Layout-Steuerelementen, Text, Bildern und Formen bestehen. Das folgende Beispiel zeigt ein Button-Steuerelement mit Inhalten, zu denen DockPanel, Label, Border und MediaElement zählen.
<Window
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.ButtonContentWindow"
Title="Button Content">
...
<Button Margin="20">
<!-- Button Content -->
<DockPanel Width="200" Height="180">
<Label DockPanel.Dock="Top" HorizontalAlignment="Center">Click Me!</Label>
<Border Background="Black" BorderBrush="Yellow" BorderThickness="2"
CornerRadius="2" Margin="5">
<MediaElement Source="media/wpf.wmv" Stretch="Fill" />
</Border>
</DockPanel>
</Button>
...
</Window>
In der folgenden Abbildung wird der Inhalt dieser Schaltfläche dargestellt.
Weitere Informationen zu den Inhaltstypen, die von den verschiedenen Steuerelementen unterstützt werden, finden Sie unter WPF-Inhaltsmodell.
Trigger
Obwohl die Hauptaufgabe von Extensible Application Markup Language (XAML)-Markup die Implementierung der Darstellung einer Anwendung ist, können Sie mit Extensible Application Markup Language (XAML) auch einige Aspekte des Verhaltens einer Anwendung implementieren. Ein Beispiel ist die Verwendung von Triggern, um die Darstellung einer Anwendung aufgrund von Benutzerinteraktionen zu ändern. Weitere Informationen finden Sie unter "Trigger" in Erstellen von Formaten und Vorlagen.
Steuerelementvorlagen
Die standardmäßigen UIs für WPF-Steuerelemente werden üblicherweise mithilfe anderer Steuerelemente und Formen erstellt. Beispielsweise besteht ein Button-Steuerelement aus den Steuerelementen ButtonChrome und ContentPresenter. Vom ButtonChrome-Steuerelement wird die Standarddarstellung der Schaltfläche bereitgestellt, während mit dem ContentPresenter-Steuerelement der Inhalt der Schaltfläche angezeigt wird, der durch die Content-Eigenschaft angegeben wird.
Nicht immer passt die Standarddarstellung eines Steuerelements zur Gesamtdarstellung einer Anwendung. In diesem Fall können Sie ControlTemplate verwenden, um die Darstellung der Benutzeroberfläche des Steuerelements anzupassen, ohne Inhalte und Verhalten zu ändern.
Im folgenden Beispiel wird gezeigt, wie die Darstellung eines Button-Steuerelements mithilfe von ControlTemplate geändert wird.
<Window
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.ControlTemplateButtonWindow"
Title="Button with Control Template" Height="158" Width="290">
<!-- Button using an ellipse -->
<Button Content="Click Me!" Click="button_Click">
<Button.Template>
<ControlTemplate TargetType="{x:Type Button}">
<Grid Margin="5">
<Ellipse Stroke="DarkBlue" StrokeThickness="2">
<Ellipse.Fill>
<RadialGradientBrush Center="0.3,0.2" RadiusX="0.5" RadiusY="0.5">
<GradientStop Color="Azure" Offset="0.1" />
<GradientStop Color="CornflowerBlue" Offset="1.1" />
</RadialGradientBrush>
</Ellipse.Fill>
</Ellipse>
<ContentPresenter Name="content" HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</Grid>
</ControlTemplate>
</Button.Template>
</Button>
</Window>
Imports System.Windows ' Window, RoutedEventArgs, MessageBox
Namespace SDKSample
Public Class ControlTemplateButtonWindow
Inherits Window
Public Sub New()
InitializeComponent()
End Sub
Private Sub button_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
MessageBox.Show("Hello, Windows Presentation Foundation!")
End Sub
End Class
End Namespace
using System.Windows; // Window, RoutedEventArgs, MessageBox
namespace SDKSample
{
public partial class ControlTemplateButtonWindow : Window
{
public ControlTemplateButtonWindow()
{
InitializeComponent();
}
void button_Click(object sender, RoutedEventArgs e)
{
// Show message box when button is clicked
MessageBox.Show("Hello, Windows Presentation Foundation!");
}
}
}
In diesem Beispiel wurde Benutzeroberfläche der Standardschaltfläche durch ein Ellipse-Steuerelement mit dunkelblauem Rand ersetzt und mit einem RadialGradientBrush gefüllt. Das ContentPresenter-Steuerelement zeigt den Inhalt des Button-Steuerelements an: "Click Me!". Beim Klicken auf das Button-Steuerelement wird das Click-Ereignis als Teil des Standardverhaltens des Button-Steuerelements weiterhin ausgelöst. Das Ergebnis wird in der folgenden Abbildung dargestellt.
Weitere Informationen finden Sie unter ControlTemplate. Ein einführendes Beispiel finden Sie unter Beispiel zum Formatieren mit ControlTemplates.
Datenvorlagen
Während mit einer Steuerelementvorlage die Darstellung eines Steuerelements festgelegt wird, kann mit einer Datenvorlage die Darstellung des Inhalts eines Steuerelements festgelegt werden. Datenvorlagen werden häufig verwendet, um die Anzeige gebundener Daten zu verbessern. Die folgende Abbildung zeigt die Standarddarstellung für ein ListBox-Steuerelement, das an eine Auflistung von Task-Objekten gebunden ist, bei der jede Aufgabe über einen Namen, eine Beschreibung und eine Priorität verfügt.
Die Standarddarstellung entspricht dem, was von einem ListBox-Steuerelement zu erwarten ist. Die Standarddarstellung der einzelnen Aufgaben enthält jedoch nur den Aufgabennamen. Um den Aufgabennamen, die Beschreibung und die Priorität anzuzeigen, muss die Standarddarstellung der gebundenen Listenelemente des ListBox-Steuerelements mithilfe eines DataTemplate geändert werden. Mit dem folgenden XAML-Code wird eine solche DataTemplate-Vorlage definiert, die mithilfe des ItemTemplate-Attributs auf die einzelnen Aufgaben angewendet wird.
<Window
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.DataTemplateWindow"
Title="With a Data Template">
...
<!-- Data Template (applied to each bound task item in the task collection) -->
<DataTemplate x:Key="myTaskTemplate">
<Border Name="border" BorderBrush="DarkSlateBlue" BorderThickness="2"
CornerRadius="2" Padding="5" Margin="5">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Padding="0,0,5,0" Text="Task Name:"/>
<TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Path=TaskName}"/>
<TextBlock Grid.Row="1" Grid.Column="0" Padding="0,0,5,0" Text="Description:"/>
<TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Path=Description}"/>
<TextBlock Grid.Row="2" Grid.Column="0" Padding="0,0,5,0" Text="Priority:"/>
<TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding Path=Priority}"/>
</Grid>
</Border>
</DataTemplate>
...
<!-- Data template is specified by the ItemTemplate attribute -->
<ListBox
ItemsSource="{Binding}"
ItemTemplate="{StaticResource myTaskTemplate}"
HorizontalContentAlignment="Stretch"
IsSynchronizedWithCurrentItem="True"
Margin="5,0,5,5" />
...
</Window>
Die folgende Abbildung zeigt das Ergebnis dieses Codes.
Beachten Sie, dass das Verhalten und die Gesamtdarstellung des ListBox-Steuerelements beibehalten wurden. Lediglich die Darstellung der vom Listenfeld angezeigten Inhalte wurde geändert.
Weitere Informationen finden Sie unter Übersicht über Datenvorlagen. Ein einführendes Beispiel finden Sie unter Einführung in das Beispiel für Datenvorlagen.
Formate
Stile ermöglichen Entwicklern und Designern die Standardisierung auf ein bestimmtes Erscheinungsbild ihres Produkts. WPF stellt ein solides Formatmodell bereit, dessen Grundlage das Style-Element ist. Im folgenden Beispiel wird ein Stil erstellt, mit dem die Hintergrundfarbe für jedes Button-Steuerelement in einem Fenster auf Orange festgelegt wird.
<Window
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.StyleWindow"
Title="Styles">
...
<!-- Style that will be applied to all buttons -->
<Style TargetType="{x:Type Button}">
<Setter Property="Background" Value="Orange" />
<Setter Property="BorderBrush" Value="Crimson" />
<Setter Property="FontSize" Value="20" />
<Setter Property="FontWeight" Value="Bold" />
<Setter Property="Margin" Value="5" />
</Style>
...
<!-- This button will have the style applied to it -->
<Button>Click Me!</Button>
<!-- This labe will not have the style applied to it -->
<Label>Don't Click Me!</Label>
<!-- This button will have the style applied to it -->
<Button>Click Me!</Button>
...
</Window>
Da sich dieses Format auf alle Button-Steuerelemente bezieht, wird es automatisch auf alle Schaltflächen im Fenster angewendet, wie in der folgenden Abbildung veranschaulicht wird.
Weitere Informationen finden Sie unter Erstellen von Formaten und Vorlagen. Ein einführendes Beispiel finden Sie unter Einführung zum Beispiel zu Stilen und Vorlagen.
Ressourcen
Die Steuerelemente in einer Anwendung sollten die gleiche Darstellung haben. Dies kann sich beispielsweise auf Schriftarten, Hintergrundfarben, Steuerelementvorlagen, Datenvorlagen und Formate beziehen. Mithilfe der WPF-Unterstützung für Benutzeroberfläche (user interface, UI)-Ressourcen können diese Ressourcen zur erneuten Verwendung an einem einzigen Speicherort gekapselt werden.
Im folgenden Beispiel wird eine allgemeine Hintergrundfarbe festgelegt, die von Button und Label gemeinsam verwendet wird.
<Window
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.ResourcesWindow"
Title="Resources Window">
<!-- Define window-scoped background color resource -->
<Window.Resources>
<SolidColorBrush x:Key="defaultBackground" Color="Red" />
</Window.Resources>
...
<!-- Button background is defined by window-scoped resource -->
<Button Background="{StaticResource defaultBackground}">One Button</Button>
<!-- Label background is defined by window-scoped resource -->
<Label Background="{StaticResource defaultBackground}">One Label</Label>
...
</Window>
In diesem Beispiel wird mithilfe des Window.Resources-Eigenschaftenelements eine Ressource für die Hintergrundfarbe implementiert. Diese Ressource ist für alle untergeordneten Elemente von Window verfügbar. Es gibt eine Vielzahl von Ressourcenbereichen, von denen einige nachfolgend in der Reihenfolge aufgeführt sind, in der sie aufgelöst werden:
Ein einzelnes Steuerelement (mithilfe der geerbten FrameworkElement.Resources-Eigenschaft).
Window oder Page (ebenfalls mithilfe der geerbten FrameworkElement.Resources-Eigenschaft).
Application (mithilfe der Application.Resources-Eigenschaft).
Durch die Vielzahl an Bereichen erhalten Sie Flexibilität in Bezug auf die Art, mit der Sie die Ressourcen definieren und freigeben.
Anstatt die Ressourcen direkt mit einem bestimmten Bereich zu verknüpfen, können Sie eine oder mehrere Ressourcen mithilfe eines separaten ResourceDictionary verpacken, auf das in anderen Teilen einer Anwendung verwiesen werden kann. Im folgenden Beispiel wird eine Standardhintergrundfarbe in einem Ressourcenwörterbuch definiert.
<ResourceDictionary
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml">
<!-- Define background color resource -->
<SolidColorBrush x:Key="defaultBackground" Color="Red" />
<!-- Define other resources -->
...
</ResourceDictionary>
Im folgenden Beispiel wir auf das Ressourcenwörterbuch verwiesen, das im vorherigen Beispiel definiert wurde, sodass es innerhalb einer Anwendung gemeinsam verwendet wird.
<Application
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.App">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="BackgroundColorResources.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
...
</Application>
Ressourcen und Ressourcenwörterbücher bilden die Grundlage der -Unterstützung für Designs.
Weitere Informationen finden Sie unter Übersicht über Ressourcen. Ein einführendes Beispiel finden Sie unter Beispiel für Anwendungsressourcen.
Designs
Unter visuellem Aspekt wird mit einem Design die globale Darstellung von Windows und den darin ausgeführten Anwendungen definiert. Windows enthält mehrere Designs. Zum Beispiel bietet Microsoft Windows XP die Designs "Windows XP" und "Windows – klassisch", während Windows Vista die Designs "Windows Vista" und "Windows – klassisch" enthält. Mit der Darstellung, die durch ein Design definiert wird, wird die Standarddarstellung für eine WPF-Anwendung festgelegt. WPF ist jedoch nicht direkt in die Windows-Designs eingebunden. Da die Darstellung von WPF durch Vorlagen definiert wird, enthält WPF eine Vorlage für jedes der bekannten Windows-Designs, inklusive Aero (Windows Vista), Classic (Microsoft Windows 2000), Luna (Microsoft Windows XP) und Royale (Microsoft Windows XP Media Center Edition 2005). Diese Designs werden als Ressourcenwörterbücher verpackt, die aufgelöst werden, wenn Ressourcen in einer Anwendung nicht gefunden werden. Die visuelle Darstellung vieler Anwendungen basiert auf diesen Designs. Durch die Einheitlichkeit mit der Windows-Darstellung gewöhnen sich Benutzer leichter an neue Anwendungen.
Auf der anderen Seite basiert das Benutzererlebnis bei einigen Anwendungen nicht unbedingt auf den Standarddesigns. Beispielsweise basiert Microsoft Windows Media Player auf Audio- und Videodaten betrieben und gewinnt durch einen abweichenden Stil des Benutzererlebnisses. Bei solchen UIs-Anwendungen werden eher benutzerdefinierte, anwendungsspezifische Designs verwendet. Anwendungen mit solchen Designs bieten dem Benutzer oft die Möglichkeit, verschiedene Aspekte des Designs anzupassen. Microsoft Windows Media Player bietet voreingestellte Designs sowie einen Host für Designs von Drittanbietern.
Die Designs in WPF werden am einfachsten mit Ressourcenwörterbüchern definiert. Im folgenden Beispiel werden Beispieldefinitionen für Designs gezeigt.
<!-- Blue Skin -->
<ResourceDictionary
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:SDKSample">
<Style TargetType="{x:Type Button}">
<Setter Property="Background" Value="Blue" />
</Style>
...
</ResourceDictionary>
<!-- Blue Skin -->
<ResourceDictionary
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:SDKSample">
<Style TargetType="{x:Type Button}">
<Setter Property="Background" Value="Blue" />
</Style>
...
</ResourceDictionary>
<!-- Yellow Skin -->
<ResourceDictionary
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:SDKSample">
<Style TargetType="{x:Type Button}">
<Setter Property="Background" Value="Yellow" />
</Style>
...
</ResourceDictionary>
<!-- Yellow Skin -->
<ResourceDictionary
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:SDKSample">
<Style TargetType="{x:Type Button}">
<Setter Property="Background" Value="Yellow" />
</Style>
...
</ResourceDictionary>
Weitere Informationen finden Sie in "Gemeinsam genutzte Ressourcen und Designs" unter Erstellen von Formaten und Vorlagen. Ein einführendes Beispiel finden Sie unter Beispiel zu Anwendungen mit Designs.
Benutzerdefinierte Steuerelemente
Obwohl WPF einen Host zur Unterstützung der Anpassung bereitstellt, können Situationen auftreten, in denen vorhandene WPF-Steuerelemente nicht den Ansprüchen der Anwendung oder der Benutzer entsprechen. Dies kann in folgenden Situationen der Fall sein:
Die gewünschte Benutzeroberfläche kann nicht durch Anpassung des Aussehens und Verhaltens vorhandener WPF-Implementierungen erzeugt werden.
Das gewünschte Verhalten wird von vorhandenen WPF-Implementierungen nicht unterstützt (oder ist umständlich zu erreichen).
An diesem Punkt können Sie jedoch eines der drei WPF-Modelle zum Erstellen eines neuen Steuerelements nutzen. Jedes Modell bezieht sich auf ein bestimmtes Szenario. Dabei muss das benutzerdefinierte Steuerelement von einer bestimmten WPF-Basisklasse abgeleitet werden. Die drei Modelle sind hier aufgeführt:
Benutzersteuerelementmodell. Ein benutzerdefiniertes Steuerelement wird von UserControl abgeleitet und besteht aus einem oder mehreren anderen Steuerelementen.
Steuerelementmodell. Ein benutzerdefiniertes Steuerelement wird von Control abgeleitet und dazu verwendet, Implementierungen zu erstellen, deren Verhalten mittels Vorlagen von ihrer Darstellung getrennt wird, so wie beim Großteil der WPF-Steuerelemente. Durch das Ableiten von Control erhalten Sie mehr Freiheit beim Erstellen einer benutzerdefinierten Benutzeroberfläche als mit Benutzersteuerelementen. Der Aufwand kann jedoch höher sein.
Frameworkelementmodell. Ein benutzerdefiniertes Steuerelement wird von FrameworkElement abgeleitet, wenn seine Darstellung durch benutzerdefinierte Renderinglogik (nicht durch Vorlagen) definiert wird.
Im folgenden Beispiel wird ein benutzerdefiniertes numerisches "nach oben/nach unten"-Steuerelement gezeigt, das von UserControl abgeleitet wird.
<UserControl
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.NumericUpDown">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<!-- Value text box -->
<Border BorderThickness="1" BorderBrush="Gray" Margin="2" Grid.RowSpan="2"
VerticalAlignment="Center" HorizontalAlignment="Stretch">
<TextBlock Name="valueText" Width="60" TextAlignment="Right" Padding="5"/>
</Border>
<!-- Up/Down buttons -->
<RepeatButton Name="upButton" Click="upButton_Click" Grid.Column="1"
Grid.Row="0">Up</RepeatButton>
<RepeatButton Name="downButton" Click="downButton_Click" Grid.Column="1"
Grid.Row="1">Down</RepeatButton>
</Grid>
</UserControl>
imports System 'EventArgs
imports System.Windows 'DependencyObject, DependencyPropertyChangedEventArgs,
' FrameworkPropertyMetadata, PropertyChangedCallback,
' RoutedPropertyChangedEventArgs
imports System.Windows.Controls 'UserControl
Namespace SDKSample
' Interaction logic for NumericUpDown.xaml
Partial Public Class NumericUpDown
Inherits System.Windows.Controls.UserControl
'NumericUpDown user control implementation
...
End Class
End Namespace
using System; // EventArgs
using System.Windows; // DependencyObject, DependencyPropertyChangedEventArgs,
// FrameworkPropertyMetadata, PropertyChangedCallback,
// RoutedPropertyChangedEventArgs
using System.Windows.Controls; // UserControl
namespace SDKSample
{
public partial class NumericUpDown : UserControl
{
// NumericUpDown user control implementation
...
}
}
Im nächsten Beispiel wird der XAML-Code dargestellt, mit dem das Benutzersteuerelement in Window integriert wird.
<Window
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.UserControlWindow"
xmlns:local="clr-namespace:SDKSample"
Title="User Control Window">
...
<!-- Numeric Up/Down user control -->
<local:NumericUpDown />
...
</Window>
Die folgende Abbildung zeigt das NumericUpDown-Steuerelement, das in einem Window gehostet wird.
Weitere Informationen zu benutzerdefinierten Steuerelementen finden Sie unter Übersicht über das Erstellen von Steuerelementen. Einführende Beispiele finden Sie unter Beispiele für das Anpassen von Steuerelementen.
Bewährte Methoden für WPF
Wie bei allen Entwicklungsplattformen kann mit WPF das gewünschte Ergebnis auf verschiedene Arten erreicht werden. Um sichergehen zu können, dass Ihre WPF-Anwendungen das angestrebte Benutzererlebnis liefern und die Ansprüche der Zielgruppe allgemein erfüllt werden, gibt es empfohlene bewährte Methoden bezüglich Eingabehilfen, Globalisierung, Lokalisierung und Leistung. Nachfolgend erhalten Sie weitere Informationen:
Zusammenfassung
WPF ist eine umfangreiche Präsentationstechnologie zum Erstellen eines breiten Spektrums von visuell herausragenden Clientanwendungen. Diese Einführung gab einen Einblick in die wichtigsten Features von WPF.
Der nächste Schritt ist, WPF-Anwendungen zu erstellen!
Beim Erstellen dieser Anwendungen können Sie auf diese Einführung zurückgreifen, um sich einen Überblick über die wichtigsten Features zu verschaffen sowie Verweise auf ausführlichere Informationen zu diesen Features zu erhalten.
Empfohlene Übersichten und Beispiele
Die folgenden Übersichten und Beispiele wurden in dieser Einführung erwähnt.