WPF for .NET 9 中的新增功能
原文链接[1]:
https://learn.microsoft.com/zh-cn/dotnet/desktop/wpf/whats-new/net90?view=netdesktop-9.0
WPF for .NET 9 中的新增功能
本文介绍适用于 .NET 9
的 Windows Presentation Foundation (WPF)
中的新增功能。今年 WPF
的主要关注领域是改进 WPF
的视觉功能,并为 Windows 11
提供基于 Fluent
设计原则的新主题。
您可以通过从 Microsoft Store[2] 下载 WPF
库应用程序来预览新主题。
Fluent 主题
WPF
包含一个新主题,可为 WPF
应用程序提供新鲜、现代的 Windows 11
美感。它包括集成的明暗模式,以及系统强调色支持。
浅色模式下的
Fluent
主题:
深色模式下的
Fluent
主题:
应用主题
可以通过两种方式应用 Fluent
主题:设置属性或引用 Fluent
主题资源字典。有关主题模式设置的更多信息,请参阅 ThemeMode
。
请将 Fluent
资源加载到应用的资源中。
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/PresentationFramework.Fluent;component/Themes/Fluent.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
资源字典还可以应用于主题 Window
本身
ThemeMode
WPF
中添加了一个新的样式 API
,该 API
通过属性公开。通过使用此属性,您可以应用 Fluent
样式,而不必直接引用样式资源字典。
可用主题:
Light
应用浅色Fluent
主题。Dark
应用深色Fluent
主题。System
根据用户的当前Windows
设置应用浅色或深色Fluent
主题。None
(默认)使用Aero2
主题。
要将主题模式应用于整个应用程序,请在类型上设置属性。要将其应用于单个 Window
,请在类型上设置。
例如,根据 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">
以下是强制使用浅色主题的示例,无论 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
旨在尊重 Fluent Dictionary
设置的设置,允许您自定义 Fluent
主题。
在代码中设置
目前,支持在代码中更改设置是一项实验性功能。在代码中访问属性会产生错误 WPF0001
,从而阻止访问 API。请抑制该错误以访问 API
。
警告
首先,将以下元素添加到项目文件中以禁止显示错误:PropertyGroup
此API
是实验性的,可能会发生更改。
首先,将以下元素添加到项目文件中以禁止显示错误:PropertyGroup
<PropertyGroup>
<NoWarn>$(NoWarn);WPF0001</NoWarn>
</PropertyGroup>
提示
您可以使用该指令在发生错误的位置禁止显示错误,而不是为整个项目禁用该错误。#pragma warning disable WPF0001
接下来,在应用程序级别或窗口级别设置该属性:ThemeMode
// Set light mode at the application-level
Application.Current.ThemeMode = ThemeMode.Light;
// Set dark mode on the current window
this.ThemeMode = ThemeMode.Dark;
支持 Windows 强调色
Windows 10
引入了一种用户可选择的主题色,用于提供个人风格或调出特定的视觉元素。WPF
现在支持用户选择的主题色。
视觉颜色可用作 System.Windows.Media.Color
、System.Windows.Media.SolidColorBrush
或 System.Windows.ResourceKey
。除了颜色本身,还有强调色的浅色和深色可供选择。这些可通过 System.Windows.SystemColors
访问:
Color | Color Resource Key | Brush | Brush Resource Key | |
---|---|---|---|---|
Accent | AccentColor | AccentColorKey | AccentColorBrush | AccentColorBrushKey |
Light 1 | AccentColorLight1 | AccentColorLight1Key | AccentColorLight1Brush | AccentColorLight1BrushKey |
Light 2 | AccentColorLight2 | AccentColorLight2Key | AccentColorLight2Brush | AccentColorLight2BrushKey |
Light 3 | AccentColorLight3 | AccentColorLight3Key | AccentColorLight3Brush | AccentColorLight3BrushKey |
Dark 1 | AccentColorDark1 | AccentColorDark1Key | AccentColorDark1Brush | AccentColorDark1BrushKey |
Dark 2 | AccentColorDark2 | AccentColorDark2Key | AccentColorDark2Brush | AccentColorDark2BrushKey |
Dark 3 | AccentColorDark3 | AccentColorDark3Key | AccentColorDark3Brush | AccentColorDark3BrushKey |
重要
主题色可带或不带
Fluent
主题。
创建使用强调色的 UI
时,将资源键包装在动态资源中。当用户在打开应用时更改强调色时,应用中的颜色会自动更新。例如,以下是将前景色设置为用户选择的强调色的 UI
:TextBlock
<TextBlock Text="First Name:"
Foreground="{DynamicResource {x:Static SystemColors.AccentColorBrushKey}}" />
基于连字符的连字符支持
WPF
从未支持 UI
控件中的连字符,例如。这个长期存在的社区问题已添加到 .NET 9.TextBlock
这是一张未应用于 .NET 8
中的字形的连字符图像:
现在,在 .NET 9 中呈现的相同文本:
BinaryFormatter 不再受支持
BinaryFormatter
被认为不安全,因为它容易受到反序列化攻击,从而导致拒绝服务 (DoS)、信息泄露或远程代码执行。它是在反序列化漏洞被充分理解之前实现的,其设计不符合现代安全最佳实践。
从 .NET 9
开始,其实现已被删除,以防止这些安全风险。使用时,会引发异常。BinaryFormatterPlatformNotSupportedException
WPF
在许多场景中使用,例如在序列化剪贴板和拖放操作的数据时。在内部,WPF
继续使用更安全的子集来处理具有已知类型集的特定用例。BinaryFormatterBinaryFormatter
有关更多信息,请参阅 WPF migration guide for BinaryFormatter[3] 的 WPF
迁移指南。
下载 .NET 9[4]
NET 9 发布公告[5]
参考资料
原文链接: https://learn.microsoft.com/zh-cn/dotnet/desktop/wpf/whats-new/net90?view=netdesktop-9.0
[2]Microsoft Store: https://www.microsoft.com/store/productId/9NDLX60WX4KQ
[3]WPF migration guide for BinaryFormatter: /dotnet/standard/serialization/binaryformatter-migration-guide/wpf-applications
[4]下载 .NET 9: https://dotnet.microsoft.com/zh-cn/download/dotnet/9.0
[5]NET 9 发布公告: https://devblogs.microsoft.com/dotnet/announcing-dotnet-9/