
WPF for .NET 9 中的新增功能 原文链接[1]: https://learn.microsoft.com/zh-cn/dotnet/desktop/wpf/whats-new/net90?view=netdesktop-9.0
本文介绍适用于 .NET 9 的 Windows Presentation Foundation (WPF) 中的新增功能。今年 WPF 的主要关注领域是改进 WPF 的视觉功能,并为 Windows 11 提供基于 Fluent 设计原则的新主题。
您可以通过从 Microsoft Store[2] 下载 WPF 库应用程序来预览新主题。
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 本身
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 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 被认为不安全,因为它容易受到反序列化攻击,从而导致拒绝服务 (DoS)、信息泄露或远程代码执行。它是在反序列化漏洞被充分理解之前实现的,其设计不符合现代安全最佳实践。
从 .NET 9 开始,其实现已被删除,以防止这些安全风险。使用时,会引发异常。BinaryFormatterPlatformNotSupportedException
WPF 在许多场景中使用,例如在序列化剪贴板和拖放操作的数据时。在内部,WPF 继续使用更安全的子集来处理具有已知类型集的特定用例。BinaryFormatterBinaryFormatter
有关更多信息,请参阅 WPF migration guide for BinaryFormatter[3] 的 WPF 迁移指南。
下载 .NET 9[4]
NET 9 发布公告[5]
[1]
原文链接: 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/