Novità di WPF per .NET 9
Questo articolo descrive le novità di Windows Presentation Foundation (WPF) per .NET 9. L'area principale di interesse per WPF quest'anno è stata migliorando le funzionalità visive di WPF e fornendo un nuovo tema basato sui principi di progettazione Fluent per Windows 11.
È possibile visualizzare in anteprima il nuovo tema scaricando l'app WPF Gallery da Microsoft Store.
Tema Fluent
Un nuovo tema è incluso in WPF che offre un'estetica nuova e moderna di Windows 11 per le app WPF. Include modalità chiaro e scuro integrate e un supporto per il colore principale del sistema.
Applicare il tema
È possibile applicare il tema Fluent in due modi, impostando la ThemeMode
proprietà o facendo riferimento al dizionario risorse del tema Fluent. Per altre informazioni sull'impostazione della modalità tema, vedere ThemeMode.
Il dizionario risorse del tema Fluent è disponibile nell'URI pack seguente: /PresentationFramework.Fluent;component/Themes/Fluent.xaml
. Per applicare la risorsa a livello di applicazione, caricare la risorsa nelle risorse dell'app:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/PresentationFramework.Fluent;component/Themes/Fluent.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
Il dizionario risorse può anche essere applicato a un Window
tema solo la finestra stessa.
ThemeMode
È stata aggiunta una nuova API di stile a WPF, esposta tramite la ThemeMode
proprietà . Usando questa proprietà, è possibile applicare lo stile Fluent senza dover fare riferimento direttamente a un dizionario risorse di stile.
I valori disponibili sono:
-
Light
- Applica il tema Fluent chiaro. -
Dark
- Applica il tema Fluent scuro. -
System
- Applica il tema Fluent chiaro o scuro, in base all'impostazione corrente di Windows dell'utente. -
None
—(impostazione predefinita) Usa il tema Aero2.
Per applicare una modalità tema per l'intera applicazione, impostare la ThemeMode
proprietà sul Application
tipo. Per applicarlo a una singola finestra, impostare ThemeMode
sul Window
tipo .
Ad esempio, applicare uno stile all'intera applicazione in base al tema chiaro o scuro corrente impostato da 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">
Ecco un esempio di forzatura del tema chiaro, indipendentemente dal tema impostato da 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">
ThemeMode
Se è impostato su qualsiasi valore diverso None
da a livello di applicazione, None
non può più essere applicato a livello di finestra.
ThemeMode
è progettato per rispettare le impostazioni impostate da un Fluent Dictionary, consentendo di personalizzare il tema Fluent.
Impostare nel codice
Il supporto per la modifica dell'impostazione nel ThemeMode
codice è attualmente una funzionalità sperimentale. L'accesso alla ThemeMode
proprietà nel codice genera un errore WPF0001, impedendo l'accesso all'API. Eliminare l'errore di accesso all'API.
Avviso
Questa API è sperimentale e soggetta a modifiche.
Aggiungere prima di tutto l'elemento seguente PropertyGroup
al file di progetto per eliminare l'errore:
<PropertyGroup>
<NoWarn>$(NoWarn);WPF0001</NoWarn>
</PropertyGroup>
Suggerimento
È possibile usare la #pragma warning disable WPF0001
direttiva per eliminare l'errore in cui si verifica anziché disabilitarlo per l'intero progetto.
Impostare quindi la ThemeMode
proprietà a livello di applicazione o a livello di finestra:
// Set light mode at the application-level
Application.Current.ThemeMode = ThemeMode.Light;
// Set dark mode on the current window
this.ThemeMode = ThemeMode.Dark;
Supporto per il colore principale di Windows
Windows 10 ha introdotto un colore principale selezionabile dall'utente usato per fornire un tocco personale o chiamare un elemento visivo specifico. WPF supporta ora il colore principale selezionato dall'utente.
Il colore visivo è disponibile come System.Windows.Media.Color
, System.Windows.Media.SolidColorBrush
o System.Windows.ResourceKey
. Insieme al colore stesso, sono disponibili sfumature chiare e scure del colore principale. Questi sono accessibili tramite System.Windows.SystemColors
:
Color | Chiave risorsa colore | Brush | Chiave risorsa pennello | |
---|---|---|---|---|
Accento | AccentColor |
AccentColorKey |
AccentColorBrush |
AccentColorBrushKey |
Chiaro 1 | AccentColorLight1 |
AccentColorLight1Key |
AccentColorLight1Brush |
AccentColorLight1BrushKey |
Chiaro 2 | AccentColorLight2 |
AccentColorLight2Key |
AccentColorLight2Brush |
AccentColorLight2BrushKey |
Chiaro 3 | AccentColorLight3 |
AccentColorLight3Key |
AccentColorLight3Brush |
AccentColorLight3BrushKey |
Scuro 1 | AccentColorDark1 |
AccentColorDark1Key |
AccentColorDark1Brush |
AccentColorDark1BrushKey |
Scuro 2 | AccentColorDark2 |
AccentColorDark2Key |
AccentColorDark2Brush |
AccentColorDark2BrushKey |
Scuro 3 | AccentColorDark3 |
AccentColorDark3Key |
AccentColorDark3Brush |
AccentColorDark3BrushKey |
Importante
I colori accentati sono disponibili con o senza il tema Fluent.
Quando si crea un'interfaccia utente che usa il colore principale, eseguire il wrapping della chiave di risorsa in una risorsa dinamica. Quando un utente modifica il colore principale durante l'apertura dell'app, il colore viene aggiornato automaticamente nell'app. Ad esempio, ecco un TextBlock
oggetto con il colore di primo piano impostato sul colore principale scelto dall'utente:
<TextBlock Text="First Name:"
Foreground="{DynamicResource {x:Static SystemColors.AccentColorBrushKey}}" />
Supporto della legatura basata su trattino
WPF non ha mai supportato legature basate su trattini nei controlli dell'interfaccia TextBlock
utente, ad esempio . Questa richiesta della community di lunga data è stata aggiunta in .NET 9.
Ecco un'immagine delle legature non applicate ai glifi in .NET 8:
E ora, lo stesso testo di cui è stato eseguito il rendering in .NET 9:
BinaryFormatter non più supportato
BinaryFormatter
è considerato non sicuro perché è vulnerabile agli attacchi di deserializzazione, che possono causare denial of service (DoS), divulgazione di informazioni o esecuzione di codice remoto. È stato implementato prima della deserializzazione delle vulnerabilità ben comprensibili e la progettazione non segue le procedure consigliate per la sicurezza moderna.
A partire da .NET 9, l'implementazione è stata rimossa per evitare questi rischi per la sicurezza. Quando BinaryFormatter
viene utilizzata, viene generata l'eccezione PlatformNotSupportedException
.
WPF usato BinaryFormatter
in molti scenari, ad esempio durante la serializzazione dei dati per gli Appunti e le operazioni di trascinamento della selezione. Internamente, WPF continua a usare un subset più sicuro di BinaryFormatter
per gestire casi d'uso specifici con un set noto di tipi.
Per altre informazioni su BinaryFormatter
, vedere Guida alla migrazione WPF per BinaryFormatter.
.NET Desktop feedback