Neues in WPF Version 4.5What's New in WPF Version 4.5

Dieses Thema enthält Informationen zu neuen und verbesserten Features in Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) Version 4.5.This topic contains information about new and enhanced features in Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) version 4.5.

Dieses Thema enthält folgende Abschnitte:This topic contains the following sections:

MenübandsteuerungRibbon control

WPF 4.5 wird mit einer Ribbon-Steuerung ausgeliefert, die eine Symbolleiste für den Schnellzugriff, ein Anwendungsmenü und Registerkarten hostet.WPF 4.5 ships with a Ribbon control that hosts a Quick Access Toolbar, Application Menu, and tabs. Weitere Informationen finden Sie unter Übersicht über die Multifunktionsleiste.For more information, see the Ribbon Overview.

Verbesserte Leistung bei der Anzeige großer Mengen gruppierter DatenImproved performance when displaying large sets of grouped data

UI-Virtualisierung liegt vor, wenn eine Teilmenge von UI-Elementen aus einer größeren Anzahl von Datenelementen generiert wird, wobei berücksichtigt wird, welche Elemente auf dem Bildschirm angezeigt werden.UI virtualization occurs when a subset of user interface (UI) elements are generated from a larger number of data items based on which items are visible on the screen. Das VirtualizingPanel definiert die angefügte IsVirtualizingWhenGrouping-Eigenschaft, die die UI-Virtualisierung für gruppierte Daten ermöglicht.The VirtualizingPanel defines the IsVirtualizingWhenGrouping attached property that enables UI Virtualization for grouped data. Weitere Informationen zum Gruppieren von Daten finden Sie unter Vorgehensweise: Sortieren und Gruppieren von Daten mit einer Ansicht in XAML.For more information about grouping data, see How to: Sort and Group Data Using a View in XAML. Weitere Informationen zum Virtualisieren von gruppierten Daten finden Sie in der angefügten Eigenschaft IsVirtualizingWhenGrouping.For more information about virtualizing grouped data, see the IsVirtualizingWhenGrouping attached property.

Neue Funktionen für das VirtualizingPanelNew features for the VirtualizingPanel

  1. Sie können angeben, ob ein VirtualizingPanel wie z. B. das VirtualizingStackPanel abgeschnittene Elemente anzeigt; dazu dient die angefügte ScrollUnit-Eigenschaft.You can specify whether a VirtualizingPanel, such as the VirtualizingStackPanel, displays partial items by using the ScrollUnit attached property. Wenn ScrollUnit auf Item festgelegt ist, zeigt das VirtualizingPanel nur Elemente an, die vollständig sichtbar sind.If ScrollUnit is set to Item, the VirtualizingPanel will only display items that are completely visible. Wenn ScrollUnit auf Pixel festgelegt ist, kann das VirtualizingPanel teilweise sichtbare Elemente anzeigen.If ScrollUnit is set to Pixel, the VirtualizingPanel can display partially visible items.

  2. Sie können die Größe des Cache vor und nach dem Viewport während der Virtualisierung durch das VirtualizingPanel angeben; dazu dient die angefügte CacheLength-Eigenschaft.You can specify the size of the cache before and after the viewport when the VirtualizingPanel is virtualizing by using the CacheLength attached property. Der Cache ist der Platz über bzw. unter dem Viewport, in dem keine Elemente virtualisiert werden.The cache is the amount of space above or below the viewport in which items are not virtualized. 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.Using a cache to avoid generating UI elements as they’re scrolled into view can improve performance. Der Cache hat beim Auffüllen geringere Priorität; dadurch wird vermieden, dass die Anwendung während des Vorgangs nicht mehr reagiert.The cache is populated at a lower priority so that the application does not become unresponsive during the operation. Die VirtualizingPanel.CacheLengthUnit-Eigenschaft legt die von VirtualizingPanel.CacheLength verwendete Maßeinheit fest.The VirtualizingPanel.CacheLengthUnit property determines the unit of measurement that is used by VirtualizingPanel.CacheLength.

Bindung an statische EigenschaftenBinding to static properties

Sie können statische Eigenschaften als Quelle einer Datenbindung verwenden.You can use static properties as the source of a data binding. Die Datenbindungs-Engine erkennt es, wenn sich der Eigenschaftswert ändert, falls ein statisches Ereignis ausgelöst wird.The data binding engine recognizes when the property's value changes if a static event is raised. 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.For example, if the class SomeClass defines a static property called MyProperty, SomeClass can define a static event that is raised when the value of MyProperty changes. Das statische Ereignis kann eine der folgenden Signaturen verwenden.The static event can use either of the following signatures.

  • public static event EventHandler MyPropertyChanged;

  • public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged;

Beachten Sie, dass im ersten Fall ist die Klasse ein statisches Ereignis namens stellt PropertyName Changed übergibt EventArgs an den Ereignishandler.Note that in the first case, the class exposes a static event named PropertyNameChanged that passes EventArgs to the event handler. Im zweiten Fall macht die Klasse ein statisches Ereignis namens StaticPropertyChanged verfügbar, das den PropertyChangedEventArgs-Ereignishandler übergibt.In the second case, the class exposes a static event named StaticPropertyChanged that passes PropertyChangedEventArgs to the event handler. Eine Klasse, die die statische Eigenschaft implementiert, kann Benachrichtigungen über Eigenschaftsänderungen nach Wahl mit einer der beiden Methode auslösen.A class that implements the static property can choose to raise property-change notifications using either method.

Zugriff auf Auflistungen in Nicht-UI-ThreadsAccessing collections on non-UI Threads

Mit WPF können Sie auf Datensammlungen auf anderen Threads als dem, der die Auflistung erstellt hat, zugreifen und diese ändern.WPF enables you to access and modify data collections on threads other than the one that created the collection. 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.This enables you to use a background thread to receive data from an external source, such as a database, and display the data on the UI thread. Wenn Sie die Auflistung mit einem anderen Thread modifizieren, reagiert die Benutzeroberfläche weiterhin auf die Benutzerinteraktion.By using another thread to modify the collection, your user interface remains responsive to user interaction.

Synchrone und asynchrone Überprüfung von DatenSynchronously and Asynchronously validating data

Die INotifyDataErrorInfo-Schnittstelle ermöglicht es Datenentitätsklassen, benutzerdefinierte Validierungsregeln zu implementieren und Validierungsergebnisse asynchron verfügbar zu machen.The INotifyDataErrorInfo interface enables data entity classes to implement custom validation rules and expose validation results asynchronously. Diese Schnittstelle unterstützt auch benutzerdefinierte Fehlerobjekte, mehrere Fehler pro Eigenschaft, eigenschaftenübergreifende Fehler und Fehler auf Entitätsebene.This interface also supports custom error objects, multiple errors per property, cross-property errors, and entity-level errors. Weitere Informationen finden Sie unter INotifyDataErrorInfo.For more information, see INotifyDataErrorInfo.

Automatische Aktualisierung der Quelle einer DatenbindungAutomatically updating the source of a data binding

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.If you use a data binding to update a data source, you can use the Delay property to specify an amount of time to pass after the property changes on the target before the source updates. 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.For example, suppose that you have a Slider that has its Value property data two-way bound to a property of a data object and the UpdateSourceTrigger property is set to PropertyChanged. In diesem Beispiel wird, wenn der Benutzer Slider verschiebt, die Quelle für jedes Pixel aktualisiert, das Slider verschiebt.In this example, when the user moves the Slider, the source updates for each pixel that the Slider moves. Das Quellobjekt benötigt in der Regel den Wert des Schiebereglers nur, wenn sich der Value des Schiebereglers nicht mehr ändert.The source object typically needs the value of the slider only when the slider's Value stops changing. 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.To prevent updating the source too often, use Delay to specify that the source should not be updated until a certain amount of time elapses after the thumb stops moving.

Bindung an Typen, die ICustomTypeProvider implementierenBinding to types that Implement ICustomTypeProvider

WPF unterstützt die Datenbindung an Objekte, die ICustomTypeProvider implementieren, auch als benutzerdefinierte Typen bezeichnet.WPF supports data binding to objects that implement ICustomTypeProvider, also known as custom types. Sie können benutzerdefinierte Typen in den folgenden Fällen verwenden.You can use custom types in the following cases.

  1. Als PropertyPath in einer Datenbindung.As a PropertyPath in a data binding. Beispielsweise kann die Path-Eigenschaft von Binding auf eine Eigenschaft eines benutzerdefinierten Typs verweisen.For example, the Path property of a Binding can reference a property of a custom type.

  2. Als Wert der DataType-Eigenschaft.As the value of the DataType property.

  3. Als Typ, der die automatisch generierten Spalten in DataGrid festlegt.As a type that determines the automatically generated columns in a DataGrid.

Abrufen von Datenbindungsinformationen aus einem BindungsausdruckRetrieving data binding information from a binding expression

In bestimmten Situationen rufen Sie die BindingExpression von Binding ab und benötigen Informationen zu den Quell- und Zielobjekten der Bindung.In certain cases, you might get the BindingExpression of a Binding and need information about the source and target objects of the binding. Es wurden neue APIs hinzugefügt, damit Sie das Quell- oder Zielobjekt oder die zugeordnete Eigenschaft abrufen können.New APIs have been added to enable you to get the source or target object or the associated property. Wenn Sie über BindingExpression verfügen, verwenden Sie folgende APIs, um Informationen über das Ziel und die Quelle abzurufen.When you have a BindingExpression, use the following APIs to get information about the target and source.

Um diesen Wert der Bindung zu suchenTo find this value of the binding Verwenden Sie dieses APIUse this API
Das ZielobjektThe target object BindingExpressionBase.Target
Die ZieleigenschaftThe target property BindingExpressionBase.TargetProperty
Das QuellobjektThe source object BindingExpression.ResolvedSource
Die QuelleigenschaftThe source property BindingExpression.ResolvedSourcePropertyName
Ob die BindingExpression zu einer BindingGroup gehörtWhether the BindingExpression belongs to a BindingGroup BindingExpressionBase.BindingGroup
Der Besitzer einer BindingGroupThe owner of a BindingGroup Owner

Prüfen auf ein gültiges DataContext-ObjektChecking for a valid DataContext object

Es gibt Situationen, in denen der DataContext eines Elementcontainers in einem ItemsControl getrennt wird.There are cases where the DataContext of an item container in an ItemsControl becomes disconnected. Ein Elementcontainer ist das Benutzeroberflächenelement, das ein Element in einem ItemsControl anzeigt.An item container is the UI element that displays an item in an ItemsControl. Wenn ein ItemsControl an eine Auflistung datengebunden ist, wird ein Elementcontainer für jedes Element generiert.When an ItemsControl is data bound to a collection, an item container is generated for each item. In einigen Fällen werden Elementcontainer aus der visuellen Struktur entfernt.In some cases, item containers are removed from the visual tree. 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.Two typical cases where an item container is removed are when an item is removed from the underlying collection and when virtualization is enabled on the ItemsControl. In diesen Fällen wird die DataContext-Eigenschaft des Elementcontainers auf das Sentinelobjekt festgelegt, das von der statischen BindingOperations.DisconnectedSource-Eigenschaft zurückgegeben wird.In these cases, the DataContext property of the item container will be set to the sentinel object that is returned by the BindingOperations.DisconnectedSource static property. Sie sollten überprüfen, ob DataContext gleich dem DisconnectedSource-Objekt ist, bevor Sie auf den DataContext eines Elementcontainers zugreifen.You should check whether the DataContext is equal to the DisconnectedSource object before accessing the DataContext of an item container.

Neupositionierung von Daten bei Wertänderung (Live-Strukturierung)Repositioning data as the data's values change (Live shaping)

Eine Datenauflistung kann gruppiert, gefiltert oder sortiert werden.A collection of data can be grouped, sorted, or filtered. WPF 4.5 ermöglicht die Neuanordnung, wenn die Daten geändert werden.WPF 4.5 enables the data to be rearranged when the data is modified. Angenommen, eine Anwendung listet mit DataGrid die Aktien an einer Börse auf, und die Aktien werden nach Aktienwert sortiert.For example, suppose that an application uses a DataGrid to list stocks in a stock market and the stocks are sorted by stock value. 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.If live sorting is enabled on the stocks' CollectionView, a stock's position in the DataGrid moves when the value of the stock becomes greater or less than another stock's value. Weitere Informationen finden Sie unter der ICollectionViewLiveShaping-Schnittstelle.For more information, see the ICollectionViewLiveShaping interface.

Verbesserte Unterstützung für die Einrichtung eines schwachen Verweises auf ein EreignisImproved Support for Establishing a Weak Reference to an Event

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.Implementing the weak event pattern is now easier because subscribers to events can participate in it without implementing an extra interface. 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.The generic WeakEventManager class also enables subscribers to participate in the weak event pattern if a dedicated WeakEventManager does not exist for a certain event. Weitere Informationen finden Sie unter Schwache Ereignismuster.For more information, see Weak Event Patterns.

Neue Methoden für die VerteilerklasseNew methods for the Dispatcher class

Die Verteilerklasse definiert neue Methoden für synchrone und asynchrone Vorgänge.The Dispatcher class defines new methods for synchronous and asynchronous operations. Die synchrone Invoke-Methode definiert Überladungen, die einen Action- oder Func<TResult>-Parameter entgegennehmen.The synchronous Invoke method defines overloads that take an Action or Func<TResult> parameter. Die neue asynchrone Methode InvokeAsync nimmt ebenfalls Action oder Func<TResult> als Rückrufparameter entgegen und gibt DispatcherOperation oder DispatcherOperation<TResult> zurück.The new asynchronous method, InvokeAsync, also takes an Action or Func<TResult> as the callback parameter and returns a DispatcherOperation or DispatcherOperation<TResult>. Die DispatcherOperation- und DispatcherOperation<TResult>-Klassen definieren eine Task-Eigenschaft.The DispatcherOperation and DispatcherOperation<TResult> classes define a Task property. Wenn Sie InvokeAsync aufrufen, können Sie das Schlüsselwort await entweder mit DispatcherOperation oder mit dem zugehörigen Task verwenden.When you call InvokeAsync, you can use the await keyword with either the DispatcherOperation or the associated Task. Wenn Sie synchron auf das Task warten müssen, das von DispatcherOperation oder DispatcherOperation<TResult> zurückgegeben wird, rufen Sie die DispatcherOperationWait-Erweiterungsmethode auf.If you need to wait synchronously for the Task that is returned by a DispatcherOperation or DispatcherOperation<TResult>, call the DispatcherOperationWait extension method. Wenn Sie Task.Wait aufrufen, führt das zu einem Deadlock, wenn der Vorgang auf einem aufrufenden Thread in die Warteschlange gestellt wird.Calling Task.Wait will result in a deadlock if the operation is queued on a calling thread. Weitere Informationen zur Verwendung einer Task zum Ausführen von asynchroner Vorgängen finden Sie unter Aufgabenparallelität (Task Parallel Library).For more information about using a Task to perform asynchronous operations, see Task Parallelism (Task Parallel Library).

Markuperweiterungen für EreignisseMarkup Extensions for Events

WPF 4.5 unterstützt Markuperweiterungen für Ereignisse.WPF 4.5 supports markup extensions for events. WPF definiert zwar keine Markuperweiterung zur Verwendung für Ereignisse, diese können aber von Drittanbietern erstellt werden.While WPF does not define a markup extension to be used for events, third parties are able to create a markup extension that can be used with events.

Siehe auchSee also