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.
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 ThemeMode
på Window
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.SolidColorBrush
eller 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:
Och nu samma text som återges i .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 BinaryFormatter
finns i WPF-migreringsguide för BinaryFormatter.
.NET Desktop feedback