© studiovin/shutterstock.com
Mit Windows 10 Controls Anwendungen modernisieren

XAML Islands: WPF und Windows Forms


Als XAML Islands wird eine mit Windows 10 Version 1903 eingeführte Technologie bezeichnet, mit der sich moderne UWP Controls mit Fluent Design in WPF- und Windows-Forms-Applikationen einbinden lassen. Damit ist es möglich, bestehende Anwendungen zu modernisieren, ohne dass diese gleich von Grund auf neu geschrieben werden müssen. In diesem Artikel erfahren Sie, wie Sie XAML Islands einsetzen und wie die Zukunft der Universal Windows Platform aussieht.

Viele Unternehmen haben zahlreiche .NET-Desktopanwendungen im Einsatz, die mit Windows Forms und WPF basierend auf dem .NET Framework entwickelt wurden. Mit .NET Core und XAML Islands lassen sich diese Anwendungen modernisieren. Bevor wir uns in diesem Artikel XAML Islands widmen, werfen wir einen kurzen Blick auf die Migration von .NET-Framework-Anwendungen nach .NET Core.

Migration nach .NET Core

Mit .NET Core 3.0 hat Microsoft sowohl Windows Forms [1] als auch WPF [2] auf .NET Core portiert und darüber hinaus auch den Quellcode auf GitHub veröffentlicht.

Um XAML Islands in einer WPF- oder Windows-Forms-App zu verwenden, ist eine Portierung der eigenen App auf .NET Core nicht zwingend erforderlich, aber als Teil der Modernisierung empfohlen. .NET Core unterstützt mit XAML Islands mehr Szenarien und hat darüber hinaus noch weitere Vorteile. Beispielsweise lassen sich nur mit .NET Core die neuesten, mit C# 8.0 eingeführten Sprachfeatures verwenden. Im .NET Framework stehen diese Sprachfeatures nicht zur Verfügung.

Um eine einfache WPF-Anwendung nach .NET Core zu portieren, ist lediglich eine Anpassung der .csproj-Datei notwendig. Üblicherweise kann der bestehende Inhalt komplett gelöscht und durch den Inhalt aus Listing 1 ersetzt werden.

Listing 1: .NET-Core-Projektdatei

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>netcoreapp3.0</TargetFramework> <UseWPF>true</UseWPF> </PropertyGroup> </Project>

Listing 1 enthält das sogenannte SDK-Style-Projektformat, das für ein .NET-Core-Projekt zwingend notwendig ist. Das SDK-Style-Projektformat ist daran zu erkennen, dass auf dem Project-Element, das die Wurzel des Dokuments darstellt, das Sdk-Attribut gesetzt ist. In der Projektdatei in Listung 1 wird mit diesem Sdk-Attribut das Windows Desktop SDK von .NET Core verwendet. Zudem ist in der Projektdatei in Listing 1 .NET Core 3 als TargetFramework angegeben. Mit dem UseWPF-Element werden in einem .NET-Core-Projekt die Referenzen für die WPF Assemblies hinzugefügt. Wäre es ein Windows-Forms-Projekt, wäre der einzige Unterschied in der Projektdatei, dass statt eines UseWPF-Elements eben ein UseWindowsForms-Element verwendet wird, um damit die Windows Forms Assemblies zu referenzieren.

Nach der Anpassung der .csproj-Datei auf das minimale, in Listing 1 dargestellte Format, müssen natürlich vorherige Projekt- und NuGet-Referenzen wieder hinzugefügt werden, was wie gewohnt über den Solution Explorer von Visual Studio gemacht werden kann. Damit ist die Migration von .NET Framework nach .NET Core abgeschlossen.

In diesem Artikel wird für XAML Islands eine .NET-Core-3.0-WPF-Anwendung verwendet. Bevor es losgeht, werfen wir einen Blick auf die XAML-Islands-Grundlagen.

XAML-Islands-Grundlagen

Mit Windows 10 Version 1903, dem sogenannten May 2019 Update, wurde das XAML Islands API eingeführt. Dabei handelt es sich um eine Windows-Schnittstelle. Mit ihr lässt sich das Aussehen und die Funktionalität einer WPF- oder Windows-Forms-App mit Windows-10-UI-Features erweitern. Die Windows-10-UI-Features werden in Form von UWP Controls bereitgestellt. Es lassen sich beliebige UWP Controls in der bestehenden .NET-Anwendung hosten, wie beispielsweise das Windows 10 MapControl zum Anzeigen von Landkarten oder das InkCanvas Control, um die Windows-10-Stifteingabe optimal in der eigenen .NET-Desktop-Anwendung zu unterstützen.

Prinzipiell lässt sich jedes UWP Control in einer WPF- oder Windows-Forms-Anwendung hosten, wenn es von der UWP-Basisklasse Windows.UI.Xaml.UIElement ableitet. Dabei werden folgende Szenarien unterstützt:

  1. das Hosten von 1st Party UWP Controls, die von Microsoft über das Windows SDK oder die sogenannte WinUI-Bibliothek bereitgestellt werden (mehr zur WinUI-Bibliothek erfahren Sie später in diesem Artikel, wenn es um die Zukunft der UWP geht)

  2. das Hosten von benutzerdefinierten UWP Controls, wie beispielsweise ein klassisches User Control, das Sie selbst mit UWP entwickelt haben

An dieser Stelle kommt ein Vorteil von .NET Core ins Spiel. Sowohl .NET Framework als auch .NET Core unterstützen das erste Szenario, das Hosten eines 1st Party UWP Control aus dem Hause Microsoft. Das zweite Szenario, das Hosten eines benutzerdefinierten UWP Control, wird ebenfalls von .NET Framework und .NET Core unterstützt, falls das UWP Control in C++ geschrieben wurde. Wurde im zweiten Szenario das UWP Control jedoch in C# geschrieben, so lässt es sich nur in .NET-Core-basierten WPF-/Windows-Forms-Apps einsetzen, nicht in .NET-Framework-Applikationen. Somit liegt der Unterschied zwischen .NET Framework und .NET Core bei 3rd-Party-Komponenten. Das ist in Tabelle 1 nochmals übersichtlich dargestellt. Da .NET Core somit mehr Szenarien als .NET Framework unterstützt, empfiehlt sich als Teil einer Modernisierung von WPF- und Windows-Forms-Applikationen im ersten Schritt eine Portierung auf .NET Core.

Desktop-App-Host

3rd-Party-C#-Komponente

3rd-Party-C++-Komponente

.NET Framework

Keine Unterstützung

Wird unterstützt

.NET Core

Wird unterstützt

Wird unterstützt

Tabelle 1: Unterstützung von 3rd-Party-Komponenten

XAML Islands einsetzen

Zum Hosten eines UWP Control in einer WPF-Anwendung ist ein Zugriff auf das XAML Islands API notwendig. Der direkte Zugriff auf diese auch als UWP XAML Hosting API bezeichnete Windows-Schnittstelle ist für C#-Entwickler nicht ganz trivial, da diverse Windows-Runtime-Klassen und COM-Interfaces zum Einsatz kommen. Um das Ganze für WPF- und Windows-Forms-Entwickler einfacher zu gestalten, stellt Microsoft mit dem Windows Community Toolkit [3] verschiedene .NET Controls zur Verfügung, die den Zugriff auf das XAML Islands API kapseln. Microsoft empfiehlt die Verwendung dieser .NET Controls für WPF- und Windows-Forms-Apps, in denen XAML Islands zum Einsatz kommen sollen, da diese .NET Controls eine deutlich komfortablere Entwicklung ermöglichen als ein direkter Zugriff auf das XAML Islands API.

Die Controls aus dem Toolkit

Mit dem Windows Community Toolkit werden zur Unterstützung von XAML Islands in Form von NuGet-Packages zwei Arten von Controls bereitgestellt:

  • Bereits vordefinierte Controls, die UWP Controls kapseln und die sich sofort in der eigenen Anwendung wie ein natives Control verwenden lassen; diese Controls werden auch als Wrapped Controls bezeichnet

  • Host Controls, mit denen sich sowohl UWP Controls von Microsoft als auch eigenentwickelte UWP Controls sehr einfach einbinden lassen

Falls ein sogenanntes Wrapped Control existiert, ist es zu bevorzugen, da es sich wie ein natives WPF oder Windows Forms Control verwenden lässt. Doch welche Controls werden als Wrapped Controls bereitgestellt?

Wrapped Controls

Microsoft stellt die in Tabelle 2 dargestellten UWP Controls als Wrapped Controls für WPF und Windows Forms zur Verfügung. Voraussetzung ist, dass die Anwendung unter Windows 10 Version 1903 läuft – das ist ja eine allgemeine Voraussetzung für XAML Islands.

Control

Beschreibung

InkCanvas und InkToolbar

Stellt das Canvas und die Toolbar bereit, um moderne Stifteingaben zu erlauben, die auf dem Windows 10 Ink API basieren

MediaPlayerElement

Streamt und rendert Medieninhalte

MapControl

Stellt eine interaktive Karte dar

Tabelle 2: Die Wrapped Controls

Die in Tabelle 2 dargestellten Controls lassen sich in einer WPF-Anwendung einfach verwenden, indem das NuGet-Package Microsoft.Toolkit.Wpf.UI.Controls hinzugefügt wird. Das ist alles, was notwendig ist. Während in der Vergangenheit noch weitere Schritte nötig waren, um beispielsweise bestimmte Windows 10 APIs in Form von Windows-Metadata-Dateien (.winmd) zu referenzieren, erledigt Microsoft ...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang