Condividi tramite


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.

  • Tema Fluent in modalità leggera:

    Screenshot dell'app WPF Gallery, che illustra il tema fluente in modalità light.

  • Tema Fluent in modalità scura:

    Screenshot dell'app WPF Gallery, che illustra il tema Fluent in modalità scura

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.SolidColorBrusho 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 TextBlockutente, 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:

Screenshot di una semplice app WPF con un blocco di testo che mostra come i glifi non vengono combinati in legature con .NET 8.

E ora, lo stesso testo di cui è stato eseguito il rendering in .NET 9:

Screenshot di una semplice app WPF con un blocco di testo che mostra come i glifi vengono combinati in legature con .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.