Neues in WPF Version 4.5

Dieses Thema enthält Informationen über neue und verbesserte Features in der WPF-Version 4.5 (Windows Presentation Foundation).

Dieses Thema enthält folgende Abschnitte:

Menübandsteuerung

WPF 4.5 wird mit einer Ribbon-Steuerung ausgeliefert, die eine Symbolleiste für den Schnellzugriff, ein Anwendungsmenü und Registerkarten hostet. Weitere Informationen finden Sie unter Übersicht über die Multifunktionsleiste.

Verbesserte Leistung bei der Anzeige großer Mengen gruppierter Daten

Benutzeroberflächenvirtualisierung liegt vor, wenn eine Teilmenge von Benutzeroberflächenelementen aus einer größeren Anzahl von Datenelementen generiert wird, wobei berücksichtigt wird, welche Elemente auf dem Bildschirm angezeigt werden. Das VirtualizingPanel definiert die angefügte IsVirtualizingWhenGrouping-Eigenschaft, die die UI-Virtualisierung für gruppierte Daten ermöglicht. Weitere Informationen zum Gruppieren von Daten finden Sie in der Anleitung zum Sortieren und Gruppieren von Daten mit einer Ansicht in XAML. Weitere Informationen zum Virtualisieren von gruppierten Daten finden Sie in der angefügten Eigenschaft IsVirtualizingWhenGrouping.

Neue Funktionen für das VirtualizingPanel

  1. Sie können angeben, ob ein VirtualizingPanel wie z. B. das VirtualizingStackPanel abgeschnittene Elemente anzeigt; dazu dient die angefügte ScrollUnit-Eigenschaft. Wenn ScrollUnit auf Item festgelegt ist, zeigt das VirtualizingPanel nur Elemente an, die vollständig sichtbar sind. Wenn ScrollUnit auf Pixel festgelegt ist, kann das VirtualizingPanel teilweise sichtbare Elemente anzeigen.

  2. Sie können die Größe des Caches vor und nach dem Viewport während der Virtualisierung durch das VirtualizingPanel angeben. Dazu dient die angefügte CacheLength-Eigenschaft. Der Cache ist der Platz über bzw. unter dem Viewport, in dem keine Elemente virtualisiert werden. Wenn Sie mit einem Cache die Erstellung von UI-Elementen unterdrücken, während sie in die Ansicht rücken, kann dadurch die Leistung verbessert werden. Der Cache hat beim Auffüllen geringere Priorität; dadurch wird vermieden, dass die Anwendung während des Vorgangs nicht mehr reagiert. Die VirtualizingPanel.CacheLengthUnit-Eigenschaft legt die von VirtualizingPanel.CacheLength verwendete Maßeinheit fest.

Bindung an statische Eigenschaften

Sie können statische Eigenschaften als Quelle einer Datenbindung verwenden. Die Datenbindungs-Engine erkennt es, wenn sich der Eigenschaftswert ändert, falls ein statisches Ereignis ausgelöst wird. Wenn beispielsweise die SomeClass-Klasse eine statische Eigenschaft namens MyProperty definiert, kann SomeClass ein statisches Ereignis definieren, das ausgelöst wird, wenn sich der Wert von MyProperty ändert. Das statische Ereignis kann eine der folgenden Signaturen verwenden.

  • public static event EventHandler MyPropertyChanged;

  • public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged;

Beachten Sie im ersten Fall, dass die Klasse ein statisches Ereignis namens PropertyNameChanged verfügbar macht, das EventArgs an den Ereignishandler übergibt. Im zweiten Fall macht die Klasse ein statisches Ereignis namens StaticPropertyChanged verfügbar, das den PropertyChangedEventArgs-Ereignishandler übergibt. Eine Klasse, die die statische Eigenschaft implementiert, kann Benachrichtigungen über Eigenschaftsänderungen nach Wahl mit einer der beiden Methode auslösen.

Zugriff auf Auflistungen in Nicht-UI-Threads

Mit WPF können Sie auf Datensammlungen auf anderen Threads als dem, der die Auflistung erstellt hat, zugreifen und diese ändern. Dadurch können Sie mit einem Hintergrundthread Daten aus einer externen Quelle, z. B. aus einer Datenbank, empfangen und die Daten im UI-Thread anzeigen. Wenn Sie die Auflistung mit einem anderen Thread modifizieren, reagiert die Benutzeroberfläche weiterhin auf die Benutzerinteraktion.

Synchrone und asynchrone Überprüfung von Daten

Die INotifyDataErrorInfo-Schnittstelle ermöglicht es Datenentitätsklassen, benutzerdefinierte Validierungsregeln zu implementieren und Validierungsergebnisse asynchron verfügbar zu machen. Diese Schnittstelle unterstützt auch benutzerdefinierte Fehlerobjekte, mehrere Fehler pro Eigenschaft, eigenschaftenübergreifende Fehler und Fehler auf Entitätsebene. Weitere Informationen finden Sie unter INotifyDataErrorInfo.

Automatische Aktualisierung der Quelle einer Datenbindung

Wenn Sie eine Datenquelle mit einer Datenbindung aktualisieren, können Sie mit der Eigenschaft Delay angeben, wie viel Zeit nach der Änderung der Eigenschaft am Ziel vergehen soll, bevor die Quelle aktualisiert wird. Angenommen, Sie haben ein Slider, das seine Value-Eigenschaftendaten in beide Richtungen an eine Eigenschaft eines Datenobjekts gebunden hat, und die UpdateSourceTrigger-Eigenschaft ist auf PropertyChanged festgelegt. In diesem Beispiel wird, wenn der Benutzer Slider verschiebt, die Quelle für jedes Pixel aktualisiert, das Slider verschiebt. Das Quellobjekt benötigt in der Regel den Wert des Schiebereglers nur, wenn sich der Value des Schiebereglers nicht mehr ändert. Um zu verhindern, dass sich die Quelle zu oft aktualisiert, geben Sie mit Delay an, dass die Quelle nicht aktualisiert werden soll, bis nach abgeschlossener Bewegung ein bestimmter Zeitraum vergangen ist.

Bindung an Typen, die ICustomTypeProvider implementieren

WPF unterstützt die Datenbindung an Objekte, die ICustomTypeProvider implementieren, auch als benutzerdefinierte Typen bezeichnet. Sie können benutzerdefinierte Typen in den folgenden Fällen verwenden.

  1. Als PropertyPath in einer Datenbindung. Beispielsweise kann die Path-Eigenschaft von Binding auf eine Eigenschaft eines benutzerdefinierten Typs verweisen.

  2. Als Wert der DataType-Eigenschaft.

  3. Als Typ, der die automatisch generierten Spalten in DataGrid festlegt.

Abrufen von Datenbindungsinformationen aus einem Bindungsausdruck

In bestimmten Situationen rufen Sie die BindingExpression von Binding ab und benötigen Informationen zu den Quell- und Zielobjekten der Bindung. Es wurden neue APIs hinzugefügt, damit Sie das Quell- oder Zielobjekt oder die zugeordnete Eigenschaft abrufen können. Wenn Sie über BindingExpression verfügen, verwenden Sie folgende APIs, um Informationen über das Ziel und die Quelle abzurufen.

Um diesen Wert der Bindung zu suchen Verwenden Sie dieses API
Das Zielobjekt BindingExpressionBase.Target
Die Zieleigenschaft BindingExpressionBase.TargetProperty
Das Quellobjekt BindingExpression.ResolvedSource
Die Quelleigenschaft BindingExpression.ResolvedSourcePropertyName
Ob die BindingExpression zu einer BindingGroup gehört BindingExpressionBase.BindingGroup
Der Besitzer einer BindingGroup Owner

Prüfen auf ein gültiges DataContext-Objekt

Es gibt Situationen, in denen der DataContext eines Elementcontainers in einem ItemsControl getrennt wird. Ein Elementcontainer ist das Benutzeroberflächenelement, das ein Element in einem ItemsControl anzeigt. Wenn ein ItemsControl an eine Auflistung datengebunden ist, wird ein Elementcontainer für jedes Element generiert. In einigen Fällen werden Elementcontainer aus der visuellen Struktur entfernt. Zwei typische Situationen, in denen ein Elementcontainer entfernt wird, sind folgende: Wenn ein Element aus der zugrunde liegenden Auflistung entfernt wird, und wenn Virtualisierung auf ItemsControl aktiviert wird. In diesen Fällen wird die DataContext-Eigenschaft des Elementcontainers auf das Sentinelobjekt festgelegt, das von der statischen BindingOperations.DisconnectedSource-Eigenschaft zurückgegeben wird. Sie sollten überprüfen, ob DataContext gleich dem DisconnectedSource-Objekt ist, bevor Sie auf den DataContext eines Elementcontainers zugreifen.

Neupositionierung von Daten bei Wertänderung (Live-Strukturierung)

Eine Datenauflistung kann gruppiert, gefiltert oder sortiert werden. WPF 4.5 ermöglicht die Neuanordnung, wenn die Daten geändert werden. Angenommen, eine Anwendung listet mit DataGrid die Aktien an einer Börse auf, und die Aktien werden nach Aktienwert sortiert. Wenn die Livesortierung in der CollectionView der Aktien aktiviert ist, ändert sich die Position einer Aktie in DataGrid, wenn der Wert der Aktie über oder unter den Wert einer anderen Aktie steigt oder sinkt. Weitere Informationen finden Sie unter der ICollectionViewLiveShaping-Schnittstelle.

Verbesserte Unterstützung für die Einrichtung eines schwachen Verweises auf ein Ereignis

Die Implementierung des schwachen Ereignismusters ist jetzt einfacher, da Abonnenten der Ereignisse daran beteiligt sein können, ohne eine zusätzliche Schnittstelle implementieren zu müssen. Die generische WeakEventManager-Klasse ermöglicht es Abonnenten außerdem, am schwachen Ereignismuster teilzunehmen, wenn für ein bestimmtes Ereignis kein dedizierter WeakEventManager vorhanden ist. Weitere Informationen finden Sie unter Schwache Ereignismuster.

Neue Methoden für die Verteilerklasse

Die Verteilerklasse definiert neue Methoden für synchrone und asynchrone Vorgänge. Die synchrone Invoke-Methode definiert Überladungen, die einen Action- oder Func<TResult>-Parameter entgegennehmen. Die neue asynchrone Methode InvokeAsync nimmt ebenfalls Action oder Func<TResult> als Rückrufparameter entgegen und gibt DispatcherOperation oder DispatcherOperation<TResult> zurück. Die DispatcherOperation- und DispatcherOperation<TResult>-Klassen definieren eine Task-Eigenschaft. Wenn Sie InvokeAsync aufrufen, können Sie das Schlüsselwort await entweder mit DispatcherOperation oder mit dem zugehörigen Task verwenden. Wenn Sie synchron auf das Task warten müssen, das von DispatcherOperation oder DispatcherOperation<TResult> zurückgegeben wird, rufen Sie die DispatcherOperationWait-Erweiterungsmethode auf. Wenn Sie Task.Wait aufrufen, führt das zu einem Deadlock, wenn der Vorgang auf einem aufrufenden Thread in die Warteschlange gestellt wird. Weitere Informationen zur Durchführung asynchroner Vorgänge mit Task finden Sie unter Aufgabenbasiertes asynchrones Programmieren.

Markuperweiterungen für Ereignisse

WPF 4.5 unterstützt Markuperweiterungen für Ereignisse. WPF definiert zwar keine Markuperweiterung zur Verwendung für Ereignisse, diese können aber von Drittanbietern erstellt werden.

Weitere Informationen