Compartilhar via


Novidades no WPF para .NET 9

Este artigo descreve as novidades no WPF (Windows Presentation Foundation) para .NET 9. A principal área de foco do WPF este ano foi melhorar os recursos visuais do WPF e fornecer um novo tema com base nos princípios de design fluente para Windows 11.

Você pode visualizar o novo tema baixando o aplicativo galeria do WPF da Microsoft Store.

Tema fluente

Um novo tema é incluído no WPF que oferece uma estética moderna e moderna do Windows 11 para aplicativos WPF. Ele inclui modos claros e escuros integrados e suporte a cores de destaque do sistema.

  • Tema fluente no modo de luz:

    Uma captura de tela do aplicativo WPF Gallery, demonstrando o tema fluente no modo claro.

  • Tema fluente no modo escuro:

    Uma captura de tela do aplicativo galeria do WPF, demonstrando o tema fluente no modo escuro

Aplicar o tema

Você pode aplicar o tema fluente de duas maneiras, definindo a ThemeMode propriedade ou fazendo referência ao dicionário de recursos de tema fluente. Para obter mais informações sobre a configuração do modo de tema, consulte ThemeMode.

O dicionário de recursos de tema fluente está disponível no seguinte URI do pacote: /PresentationFramework.Fluent;component/Themes/Fluent.xaml. Para aplicar o recurso no nível do aplicativo, carregue o recurso nos recursos do aplicativo:

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

O dicionário de recursos também pode ser aplicado diretamente a um Window para tematizar apenas a janela em si.

Modo de Tema

Uma nova API de estilo foi adicionada ao WPF, que é exposta por meio da ThemeMode propriedade. Usando essa propriedade, você pode aplicar o estilo fluente sem precisar referenciar um dicionário de recursos de estilo diretamente.

Os valores disponíveis são:

  • Light— Aplica o tema fluente leve.
  • Dark— Aplica o tema fluente escuro.
  • System— Aplica o tema fluente claro ou escuro, com base na configuração atual do Windows do usuário.
  • None—(padrão) Usa o tema Aero2.

Para aplicar o modo de tema em todo o aplicativo, defina a propriedade ThemeMode no tipo Application. Para aplicá-lo a uma única janela, defina ThemeMode no Window tipo.

Por exemplo, estilize todo o aplicativo com base no tema claro ou escuro atual definido pelo 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">

Aqui está um exemplo de forçar o tema claro, independentemente do tema definido pelo 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">

Se o valor de ThemeMode for definido como qualquer coisa diferente de None no nível do aplicativo, None não poderá mais ser aplicado no nível da janela.

ThemeMode foi projetado para respeitar as configurações definidas por um Fluent Dictionary, permitindo que você personalize o tema Fluent.

Configurado no código

O suporte para alterar a configuração do código ThemeMode no momento é um recurso experimental. Ao acessar a ThemeMode propriedade no código, gera o erro WPF0001, impedindo o acesso à API. Suprime o erro para acessar a API.

Aviso

Essa API é experimental e está sujeita a alterações.

Primeiro, adicione o seguinte PropertyGroup elemento ao arquivo de projeto para suprimir o erro:

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

Dica

Você pode usar a #pragma warning disable WPF0001 diretiva para suprimir o erro em que ela ocorre em vez de desabilitá-la para todo o projeto.

Em seguida, defina a ThemeMode propriedade no nível do aplicativo ou da janela:

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

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

Suporte para cor de destaque do Windows

O Windows 10 introduziu uma cor de destaque selecionável pelo usuário usada para fornecer um toque pessoal ou chamar um elemento visual específico. O WPF agora dá suporte à cor de destaque selecionada pelo usuário.

A cor visual está disponível como um System.Windows.Media.Color, System.Windows.Media.SolidColorBrush ou System.Windows.ResourceKey. Junto com a cor em si, tons claros e escuros da cor de destaque estão disponíveis. Eles são acessados por meio de System.Windows.SystemColors.

Cor Color Resource Key Escova Chave de Recurso de Pincel
Acento AccentColor AccentColorKey AccentColorBrush AccentColorBrushKey
Luz 1 AccentColorLight1 AccentColorLight1Key AccentColorLight1Brush AccentColorLight1BrushKey
Luz 2 AccentColorLight2 AccentColorLight2Key AccentColorLight2Brush AccentColorLight2BrushKey
Luz 3 AccentColorLight3 AccentColorLight3Key AccentColorLight3Brush AccentColorLight3BrushKey
Escuro 1 AccentColorDark1 AccentColorDark1Key AccentColorDark1Brush AccentColorDark1BrushKey
Escuro 2 AccentColorDark2 AccentColorDark2Key AccentColorDark2Brush AccentColorDark2BrushKey
Escuro 3 AccentColorDark3 AccentColorDark3Key AccentColorDark3Brush AccentColorDark3BrushKey

Importante

As cores de ênfase estão disponíveis com ou sem o tema Fluent.

Ao criar uma interface do usuário que usa a cor de ênfase, encapsule a chave de recurso em um recurso dinâmico. Quando um usuário altera a cor de ênfase enquanto o aplicativo é aberto, a cor é atualizada automaticamente no aplicativo. Por exemplo, aqui está um TextBlock com a cor de primeiro plano definida como a cor de destaque escolhida pelo usuário:

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

Suporte à ligatura baseada em hífen

O WPF nunca deu suporte a ligaturas baseadas em hífen em controles de interface do usuário, como o TextBlock. Esta pergunta de longa data da comunidade foi adicionada ao .NET 9.

Aqui está uma imagem das ligaturas que não estão sendo aplicadas aos glifos no .NET 8:

Uma captura de tela de um aplicativo WPF simples que tem um bloco de texto mostrando como os glifos não são combinados em ligaturas com o .NET 8.

E agora, o mesmo texto renderizado no .NET 9:

Uma captura de tela de um aplicativo WPF simples que tem um bloco de texto mostrando como os glifos são combinados em ligaturas com o .NET 9.

BinaryFormatter não é mais suportado

BinaryFormatter é considerado inseguro porque é vulnerável a ataques de desserialização, que podem levar à negação de serviço (DoS), divulgação de informações ou execução remota de código. Ele foi implementado antes que as vulnerabilidades de desserialização fossem bem compreendidas e seu design não segue as melhores práticas de segurança modernas.

A partir do .NET 9, sua implementação foi removida para evitar esses riscos de segurança. Quando BinaryFormatter é usado, a PlatformNotSupportedException exceção é lançada.

WPF usava BinaryFormatter em muitos cenários, como ao serializar dados para operações de área de transferência e arrastar e soltar. Internamente, o WPF continua a usar um subconjunto mais seguro de BinaryFormatter para lidar com casos de uso específicos através de um conjunto conhecido de tipos.

Para obter mais informações sobre BinaryFormatter, consulte o guia de migração do WPF para BinaryFormatter.