Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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.
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:
E agora, o mesmo texto renderizado no .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.
.NET Desktop feedback