Dela via


Nyheter i WPF för .NET 9

I den här artikeln beskrivs nyheter i Windows Presentation Foundation (WPF) för .NET 9. Huvudfokus för WPF i år var att förbättra wpf:s visuella funktioner och tillhandahålla ett nytt tema baserat på Fluent-designprinciperna för Windows 11.

Du kan förhandsgranska det nya temat genom att ladda ned appen WPF Gallery från Microsoft Store.

Fluent-tema

Ett nytt tema ingår i WPF som levererar en fräsch, modern Windows 11-estetik för WPF-appar. Den innehåller integrerade ljus- och mörka lägen och stöd för systemaccenterfärg.

  • Fluent-tema i ljust läge:

    En skärmbild av WPF-galleriappen som visar temat fluent i ljust läge.

  • Fluent-tema i mörkt läge:

    En skärmbild av WPF-galleriappen som visar temat fluent i mörkt läge

Tillämpa temat

Du kan använda Fluent-temat på två sätt, ställa in egenskapen ThemeMode eller referera till resursordlistan för Fluent-temat. Mer information om inställningen för temaläge finns i ThemeMode.

Ordlistan för resurser för Fluent-temat finns på följande paket URI: /PresentationFramework.Fluent;component/Themes/Fluent.xaml. Om du vill tillämpa resursen på programnivå läser du in resursen i appens resurser:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/PresentationFramework.Fluent;component/Themes/Fluent.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

Resursordlistan kan också tillämpas på en Window för att endast styla själva fönstret.

Temaläge

Ett nytt styling-API har lagts till i WPF, som är tillgänglig via egenskapen ThemeMode. Genom att använda den här egenskapen kan du använda Fluent-formatmallen utan att behöva referera till en formatresursordlista direkt.

Tillgängliga värden är:

  • Light– Använder light Fluent-temat.
  • Dark– Tillämpar det mörka Fluent-temat.
  • System– Använder antingen det ljusa eller mörka Fluent-temat baserat på användarens aktuella Windows-inställning.
  • None– (standard) Använder Aero2-temat.

Om du vill använda ett temaläge för hela programmet anger du egenskapen ThemeMode på den Application typen. Om du vill använda det i ett enda fönster anger du ThemeModeWindow typ.

Du kan till exempel formatera hela programmet baserat på det aktuella ljusa eller mörka temat som angetts av Windows:

<Application x:Class="MyWpfProject.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:MyWpfProject"
             StartupUri="MainWindow.xaml"
             ThemeMode="System">

Här är ett exempel på hur du tvingar fram ljustemat, oavsett vilket tema som har angetts av Windows:

<Window x:Class="MyWpfProject.LightWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:MyWpfProject"
        Title="LightWindow" Height="450" Width="800"
        ThemeMode="Light">

Om ThemeMode är inställt på något annat värde än None på programnivå kan None inte längre tillämpas på fönsternivå.

ThemeMode är utformat för att respektera de inställningar som anges av en Fluent Dictionary, så att du kan anpassa Fluent-temat.

Ange i kod

Stöd för att ändra inställningen av ThemeMode i kod är för närvarande en experimentell funktion. Åtkomst till egenskapen ThemeMode i kod genererar fel WPF0001, vilket förhindrar åtkomst till API:et. Ignorera felet för att få åtkomst till API:et.

Varning

Det här API:et är experimentellt och kan komma att ändras.

Lägg först till följande PropertyGroup element i projektfilen för att förhindra felet:

<PropertyGroup>
    <NoWarn>$(NoWarn);WPF0001</NoWarn>
</PropertyGroup>

Tips

Du kan använda #pragma warning disable WPF0001-direktivet för att förhindra felet där det inträffar i stället för att inaktivera det för hela projektet.

Ange sedan antingen egenskapen ThemeMode på programnivå eller fönsternivå:

// Set light mode at the application-level
Application.Current.ThemeMode = ThemeMode.Light;

// Set dark mode on the current window
this.ThemeMode = ThemeMode.Dark;

Stöd för Windows-dekorfärg

Windows 10 introducerade en användarvalbar dekorfärg som används för att ge en personlig touch eller framhäva ett specifikt visuellt element. WPF stöder nu den användarvalda accentfärgen.

Den visuella färgen är tillgänglig som en System.Windows.Media.Color, System.Windows.Media.SolidColorBrusheller System.Windows.ResourceKey. Tillsammans med själva färgen är ljusa och mörka nyanser av accentfärgen tillgängliga. Dessa nås via System.Windows.SystemColors:

Färg Färgresursnyckel Borste Penselresursnyckel
accentfärg AccentColor AccentColorKey AccentColorBrush AccentColorBrushKey
Ljus 1 AccentColorLight1 AccentColorLight1Key AccentColorLight1Brush AccentColorLight1BrushKey
Ljus 2 AccentColorLight2 AccentColorLight2Key AccentColorLight2Brush AccentColorLight2BrushKey
Ljus 3 AccentColorLight3 AccentColorLight3Key AccentColorLight3Brush AccentColorLight3BrushKey
Mörk 1 AccentColorDark1 AccentColorDark1Key AccentColorDark1Brush AccentColorDark1BrushKey
Mörk 2 AccentColorDark2 AccentColorDark2Key AccentColorDark2Brush AccentColorDark2BrushKey
Mörk 3 AccentColorDark3 AccentColorDark3Key AccentColorDark3Brush AccentColorDark3BrushKey

Viktig

Dekorfärger är tillgängliga med eller utan Fluent-temat.

När du skapar ett användargränssnitt som använder dekorfärgen omsluter du resursnyckeln i en dynamisk resurs. När en användare ändrar accentfärgen medan appen öppnas uppdateras färgen automatiskt i appen. Här är till exempel en TextBlock med förgrundsfärgen inställd på användarens valda dekorfärg:

<TextBlock Text="First Name:"
           Foreground="{DynamicResource {x:Static SystemColors.AccentColorBrushKey}}" />

Stöd för bindestrecksbaserad ligatur

WPF har aldrig stöd för bindestrecksbaserade ligaturer i användargränssnittskontroller som TextBlock. Den här långvariga gemenskapsfrågan lades till i .NET 9.

Här är en bild av ligaturerna som inte tillämpas på glyferna i .NET 8:

En skärmbild av en enkel WPF-app som har ett textblock som visar hur glyfer inte kombineras i ligaturer med .NET 8.

Och nu samma text som återges i .NET 9:

En skärmbild av en enkel WPF-app som har ett textblock som visar hur glyfer kombineras till ligaturer med .NET 9.

BinaryFormatter stöds inte längre

BinaryFormatter anses vara osäkert eftersom det är sårbart för deserialiseringsattacker, vilket kan leda till DoS (Denial of Service), avslöjande av information eller fjärrkörning av kod. Det implementerades innan sårbarheter för deserialisering förstods väl och dess design följer inte moderna rekommenderade säkerhetsmetoder.

Från och med .NET 9 har implementeringen tagits bort för att förhindra dessa säkerhetsrisker. När BinaryFormatter används utlöses PlatformNotSupportedException undantaget.

WPF använde BinaryFormatter i många scenarier, till exempel för att serialisera data för Urklipp och dra och släpp-operationer. Internt fortsätter WPF att använda en säkrare delmängd av BinaryFormatter för att hantera specifika användningsfall med en känd uppsättning typer.

Mer information om BinaryFormatterfinns i WPF-migreringsguide för BinaryFormatter.