Windows Presentation Foundation (WPF)

Eintrag zuletzt aktualisiert am: 26.06.2019
 siehe auch Avalon

Die Windows Presentation Foundation (WPF, Codename "Avalon") ist eine Klassenbibliothek zur Entwicklung von graphischen Benutzeroberflächen (üblicherweise GUI Framework genannt). WPF unterstützt verschiedene Arten von GUIs in einer durchgängigen Bibliothek, insbesondere:
  • Klassische Desktop-Fenster ("Windows")
  • 3D-Grafiken (vgl. DirectX)
  • Dokumente (vgl. Postscript und PDF)
  • Browser-basierte Anwendungen (XAML Browser Application - XBAP, vgl. Browser-Plug-ins wie Macromedia Flash)
  • Videos

Windows Presentation Foundation (WPF) ist der leistungsfähigere Nachfolger der Windows Forms. Windows Forms wird von Microsoft nicht aus .NET entfernt, sodass Windows Forms-Anwendungen auchin der Zukunft noch lauffähig sein werden.

Versionsgeschichte

Die erste Version trug die Versionsnummer 3.0 und erschien im Rahmen von .NET Framework 3.0 im November 2006.
Zweite Version: 3.5 in .NET 3.5: Dezember 2007
Erweiterungen in 3.5 SP1 in .NET 3.5 SP1: August 2008
Erweiterungen (Steuerelemente) im Rahmen des WPF Toolkits: Oktober 2008
Seit .NET 4.0 ist jeweils mit dem .NET Framework eine neue WPF-Version mit (z.T. nur kleineren) Änderungen erschienen.
Am 23.9.2019 erscheint WPF auch im Rahmen von .NET Core 3.0, läuft aber trotz der grundsätzlichen Plattformunabhängigkeit von .NET Core nur auf Windows. Nicht mehr möglich dort ist aber WPF im Browser (XBAP).

Eigenschaften von WPF

  • Oberflächen können wahlweise in Programmcode (wie in Windows Forms) oder – bevorzugt – durch die XML-basierte Extensible Application Markup Language (XAML) definiert werden.
  • XAML fördert eine Trennung von Code und Gestaltung. In Windows Forms wurde die Benutzerober-fläche durch Code beschrieben, der – auch wenn in einer eigenen "Designer-Datei" getrennt – doch sehr eng mit dem Programmcode verzahnt war. In WPF kann man durch XAML viele Dinge ausdrücken (z.B. Datenbindung), die in Windows Forms nicht in der Designer-Datei untergebracht werden konnten. Für Windows Forms gab es als einziges Gestaltungswerkzeug den in Visual Studio eingebauten Desig-ner. Für WPF gibt es eigene Produkte für die Oberflächengestalter, z.B. Microsoft Expression Blend. Dadurch können Benutzeroberflächen von Anwendungen einfacher von ausgebildeten Gestaltern er-stellt werden. Bisher werden Benutzeroberflächen oft von Softwareentwicklern erstellt, denen es an ei-ner Ausbildung im Bereich Ästhetik und Benutzerfreundlichkeit fehlt.
  • WPF-Oberflächen laufen als eigenständige Windows-Fenster, im Fenster eines Webbrowsers oder in speziellen Ansichtswerkzeugen.
  • WPF-Anwendungen können als clientseitige Browser-Anwendungen laufen, verwenden dann jedoch kein HTML, sondern setzen WPF auf dem Client voraus. Hier gibt es zwei Alternativen: Vollständiges WPF als XML Browser Application (XBAP) setzt ein vollständiges .NET Framework auf dem Client voraus. Silverlight bietet hingegen einen reduzierten Umfang von WPF und .NET und läuft auf mehr Plattformen.
  • Die Darstellung erfolgt intern über DirectX.
  • Die Anzeige ist vektorbasiert und bietet daher eine gute Darstellung unabhängig von der Größe des Anzeigegeräts. (Um eine gute Darstellung auf allen Bildschirmgrößen und -auflösungen zu erzielen, verwendet WPF als Einheit sogenannte geräteunabhängige Pixel, die dem 96. Teil eines Inch entsprechen.)
  • Unterstützung für an die Fenstergröße anpassbare Anordnung der visuellen Elemente
  • Steuerelemente können sich der Größe ihres Inhalts anpassen.
  • Beliebige Komposition: Elemente lassen sich beliebige kombinieren, z.B. Kann ein Kontrollkästchen Teil einer Auswahlfeldes sein oder ein Video Hintergrund für eine Eingabefeld.
  • WPF bietet gegenüber Windows Forms ein wesentlich ausgeprägteres Ereignissystem und eine Abs-traktion bei der Bindung von Oberflächenelemente an Befehle, durch das im aktuellen Kontext nicht verfügbare Elemente sofort ausgeblendet werden.
  • Unterstützung für 2-D- und 3-D-Grafiken
  • Unterstützung für Navigationsanwendungen (Hyperlinks und Vor / Zurück im Stil einer Webanwen-dung)
  • Unterstützung für fest und flexibel umbrechende Dokumente (ohne Programmcode)
  • Deklarative Datenbindung für alle Eigenschaften
  • Abspielen von Musik und Videos
  • Transformationen und Animation von Oberflächenelementen
  • Definition von wieder verwendbaren Formatvorlagen (Styles): Durch die Definition wiederverwendba-ren Formatvorlagen lassen sich einheitliche Gestaltungsmerkmale auf visuelle Elemente anwenden. Durch den Austausch der Formatvorlagen sind schnell gestalterische Anpassungen möglich – wie man es von Cascading Style Sheets im Web kennt.
  • Definition von eigenen, wiederverwendbaren Steuerelementen (User Controls)
  • Installation über Xcopy-Deployment, klassische Installationsroutinen (inklusive Microsoft Windows Installer - MSI) oder automatischen Download (einschließlich Click-Once-Deployment)
  • WPF bietet eingebaute Interoperabilität zu Win32- und Windows Forms-Benutzerschnittstellen, d. H., WPF-Anwendungen können Windows Forms- oder Win32-Steuerelemente enthalten. Umgekehrt ist ein WPF-Steuerelement in Win32- oder Windows Forms-Fenster einbindbar.

Herausforderungen/Probleme/Kritik bei WPF

Hardware-Anforderungen: Moderne Grafikkarte, RAM-Bedarf
Software-Anforderungen: Betriebssystem nicht älter als Windows XP
Einbußen bei Terminal Services (RAM-Bedarf auf Server + Netzwerklast)
Leistungsprobleme bei großen Anzahl von Controls im UI
Fehlende "Business"-Steuerelemente (nur Drittanbieter oder Codeplex)
Nicht ausgereifte Designer in VS (aus der Sicht eines Softwareentwicklers)
Lokalisierung schlechter als bei Windows Forms (Toolproblem)
Hoher Lernaufwand ("steile Lernkurve")
Schlechtere Produktivität (verglichen mit Windows Forms)

Ausführlicher Text

Die Windows Presentation Foundation (WPF) ist ein Framework zur Entwicklung grafischer Benutzerschnittstellen für Desktop-Anwendungen und damit ein Ersatz für die mit .NET 1.x eingeführte Windows Forms-Bibliothek. Im Gegensatz zu Windows Forms kann bei WPF die Beschreibung der Oberfläche durch XML-Elemente erfolgen. Microsoft hat dafür eine XML-Sprache mit Namen Extensible Application Markup Language (XAML) entwickelt.

XAML ist eine XML-basierte Sprache mit der einzelne .NET-Objekte und ganze Objektbäume in XML-Form ausdrückbar sind. Innerhalb von WPF wird dies zur Beschreibung von Oberflächenelemente wie <TextBlock>, <TextBox>, <Button>, <ListBox>, <ToolTip>, <Line>, <Polygon>, <MediaElement> u.v.m. Verwendet. Elemente sind Teile von Containern, die die Anordnung bestimmen, z.B. <Canvas>, <Grid>, <DockPanel> und <Frame>. Zu jedem XAML-Element existiert eine gleichnamige .NET-Klasse in der .NET 3.0-Klassenbibliothek im Namensraum System.Windows in .NET-Assemblies PresentationCore.dll und PresentationFramework.dll. Dabei darf man diesen neuen Namensraum nicht mit dem bereits im Jahre 2002 eingeführten Namensraum System.Windows.Forms aus der .NET-Klassenbibliothek für Windows Forms verwechseln. Es wäre sicherlich geschickter, die WPF-Klassen besser von den Windows Forms-Klassen zu trennen.

Die Abbildbarkeit der XAML-Elemente in Klassen ermöglicht sowohl die Kompilierung von XAML-Anwendungen als auch die komplette Erstellung von WPF-Anwendungen durch Programmcode. Die Abbildbarkeit der XAML-Elemente in Klassen ermöglicht sowohl die Kompilierung von XAML-Anwendungen als auch die komplette Erstellung von WPF-Anwendungen durch Programmcode. Der Einsatz von XML bietet den Vorteil einer klaren Trennung zwischen Code und Layout.

Microsoft hat diese Steuerelementarchitektur aus ASP.NET-Webanwendungen übernommen. Tagbasierte Windows-Anwendungen waren bisher nur durch so genannte HTA (HTML Applications) möglich, die jedoch kaum Verwendung fanden. Die Steuerelementnamen von HTML/ASP.NET und XAML sind aber so verschieden, dass weiterhin ein Austausch von grafischen Oberflächen zwischen Windows und Web nicht einfach fällt. Ebenso fehlt in WPF die Option, eine XAML-Anwendung per Doppelklick auf eine .xaml-Datei automatisch zu kompilieren.

Eine herausragende Eigenschaft von WPF ist, dass die Darstellung komplett vektorbasiert ist. Daher lassen sich sehr einfach Anwendungen mit Vergrößerungsfunktionen (Zoom) erstellen bzw. Anwendungen, die auf unterschiedlichen Monitorgrößen nutzbar sind.

WPF-Anwendungen können entweder auf dem Zielsystem installiert werden oder im Internet Explorer als herunterladbare Anwendung (Web Browser Application – WBA) ablaufen. Dies sind aber keine echten Webanwendungen, denn eine WBA erfordert das .NET Framework 3.0 auf dem Client. Unter dem Namen Silverlight gibt es inzwischen eine stark reduzierte Version von WPF, die nur eine kleines Browser-Plug-In benötigt und dann auch ohne .NET Framework XAML-basierte Oberflächen im Browser anzeigen kann.
WPF bietet eingebaute Interoperabilität zu Win32- und Windows Forms-Benutzerschnittstellen, d.h. WPF-Anwendungen können Windows Forms oder Win32-Steuerelemente enthalten. Umgekehrt ist ein WPF-Steuerelement in Win32- oder Windows Forms-Fenster einbindbar.

Kritik an WPF ist hinsichtlich der verfügbaren Steuerelemente zu üben. WPF besitzt weder in .NET 3.0 noch in .NET 3.5 Steuerelemente zur Darstellung von Daten in Tabelle (Datagrid) oder ein Auswahlfeld für Datum/Uhrzeit (Datetimepicker). Diese Steuerelemente muss man entweder selbst entwickeln oder von Drittanbietern hinzukaufen. Microsoft hat erst für den späteren Verlauf des Jahres 2008 hier einen Nachtrag angekündigt [SG01]. Für Visual Studio 2005 gab es keine nennenswerte Designer-Unterstützung für WPF, in Visual Studio 2008 ist sie ebenfalls noch unbefriedigend.

[SG01] Scott Guthrie: .NET 3.5 Client Product Roadmap
http://weblogs.asp.net/scottgu/archive/2008/02/19/net-3-5-client-product-roadmap.aspx

Ein Beispiel zu WPF

Den Startpunkt einer Anwendung markieren ein <Application>-Element und das StartingUp-Ereignis der gleichnamigen Klassen. Neben klassischen Windows-Fenstern kann der Entwickler mit WPF auch mehrseitige Navigationsanwendungen (vergleichbar mit der Bedienung von Web-Anwendungen) sowie Dokumente (ohne Programmcode) definieren. WPF-Dokumente sind ein Bestandteil von XPS-Paketen (zu XPS siehe Hauptext).

Die Gestaltung von Oberflächen erfolgt in XAML durch so genannte Panel-Elemente. Es gibt verschiedene Typen von Panel-Elementen (z.B. StackPanel, DockPanel, Grid, Canvas, TabPanel), die ineinander verschachtelt sein können. Um eine gute Darstellung auf allen Bildschirmgrößen und -auflösungen zu erzielen, verwendet WPF als Einheit so genannte geräteunabhängigen Pixel, die dem 96. Teil eines Inches entsprechen. Durch Formatvorlagen (Styles) kann der Entwickler Panel und Steuerelemente auf einfache Weise einheitlich formatieren. Wie Listing 3 zeigt, können Styles durch Trigger an Ereignisse gebunden sein, sodass die Gestaltung sich bei Benutzeraktionen ändert, ohne dass der Entwickler dazu Programmcode schreiben muss. XAML gestattet auch die deklarative Erstellung von Animationen (Listing 4).

Listing 1: XAML-Code für eine einfache WPF-Anwendung

<Window x:Class="Hauptfenster"
xmlns="http://schemas.microsoft.com/winfx/avalon/2005"
xmlns:x="http://schemas.microsoft.com/winfx/xaml/2005"
Text="WPF-Demo von Dr. Holger Schwichtenberg / www.IT-Visions.de" Width="600" Height="180"
>
<StackPanel>
<TextBlock FontSize="18" Foreground="Red" >Dies ist ein Beispiel für eine einfache Avalon-Anwendung</TextBlock>
<TextBlock>Bitte geben Sie in die Textbox ihren Namen ein:</TextBlock>
<TextBox Name="C_Name" Width="300" HorizontalAlignment="Left" Margin="0,10,10,10" ToolTip="Ihren Namen bitte hier eingeben!" Text="Holger Schwichtenberg">

</TextBox>
<StackPanel Name="Schaltflaechen" Orientation="Horizontal">
<Button Name="C_Start" VerticalAlignment="Top">
Start
</Button>
<Button Name="C_Ende" VerticalAlignment="Top" Width="100">
Ende
</Button>
</StackPanel>
</StackPanel>
</Window>

Listing 2: Programmcode für die WPF-Anwendung aus Listing 1

Partial Public Class Hauptfenster
Inherits Window

Private Sub OnLoaded(ByVal sender As Object, ByVal e As RoutedEventArgs) Handles Me.Loaded
End Sub

Private Sub ButtonClick1(ByVal sender As Object, ByVal e As RoutedEventArgs) Handles C_Start.Click
Me.C_Start.RenderTransform = New System.Windows.Media.RotateTransform(10)
MsgBox("Hallo " & Me.C_Name.Text & "!")
Me.C_Start.RenderTransform = New System.Windows.Media.RotateTransform(0)
End Sub

Private Sub ButtonClick2(ByVal sender As Object, ByVal e As RoutedEventArgs) Handles C_Ende.Click
Me.Close()
End Sub
End Class

Listing 3: Anwendungsweite Formatvorlagen sorgen für eine einheitliche Gestaltung

<Application x:Class="MyApp"
xmlns="http://schemas.microsoft.com/winfx/avalon/2005"
xmlns:x="http://schemas.microsoft.com/winfx/xaml/2005"
>
<Application.Resources>
<Style TargetType="{x:Type Button}">
<Setter Property="Control.Foreground" Value="Red"/>
<Setter Property="Control.Background" Value="Yellow"/>
<Style.Triggers>
<Trigger Property="Button.IsMouseOver" Value="true">
<Setter Property = "Background" Value="Red"/>
<Setter Property="Control.Foreground" Value="Yellow"/>
</Trigger>
</Style.Triggers>
</Style>
</Application.Resources>
</Application>


Listing 4: Die Ende-Schaltfläche soll zur Hervorhebung laufend Ihre Größe zwischen 50 und 100 Pixeln ändern.

<!-- Fortlaufende Animation für die Ende-Schaltfläche -->
<Window.Storyboards>
<SetterTimeline TargetName="C_Ende" Path="(Button.Width)">
<DoubleAnimation From="50" To="100" Duration="0:0:5" AutoReverse="True" RepeatBehavior="Forever" />
</SetterTimeline>
</Window.Storyboards>