WPF for .NET 9 中的新增功能

科技   2024-11-14 08:01   广东  

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 9Windows 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

警告首先,将以下元素添加到项目文件中以禁止显示错误:PropertyGroupAPI 是实验性的,可能会发生更改。

首先,将以下元素添加到项目文件中以禁止显示错误: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.ColorSystem.Windows.Media.SolidColorBrushSystem.Windows.ResourceKey。除了颜色本身,还有强调色的浅色和深色可供选择。这些可通过 System.Windows.SystemColors 访问:


ColorColor Resource KeyBrushBrush Resource Key
AccentAccentColorAccentColorKeyAccentColorBrushAccentColorBrushKey
Light 1AccentColorLight1AccentColorLight1KeyAccentColorLight1BrushAccentColorLight1BrushKey
Light 2AccentColorLight2AccentColorLight2KeyAccentColorLight2BrushAccentColorLight2BrushKey
Light 3AccentColorLight3AccentColorLight3KeyAccentColorLight3BrushAccentColorLight3BrushKey
Dark 1AccentColorDark1AccentColorDark1KeyAccentColorDark1BrushAccentColorDark1BrushKey
Dark 2AccentColorDark2AccentColorDark2KeyAccentColorDark2BrushAccentColorDark2BrushKey
Dark 3AccentColorDark3AccentColorDark3KeyAccentColorDark3BrushAccentColorDark3BrushKey

重要

主题色可带或不带 Fluent 主题。

创建使用强调色的 UI 时,将资源键包装在动态资源中。当用户在打开应用时更改强调色时,应用中的颜色会自动更新。例如,以下是将前景色设置为用户选择的强调色的 UITextBlock

<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]

参考资料

[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/

推荐阅读:
今晚零点!一同相约 .NET Conf 2024
适用于 .NET 稳定的官方OpenAI库
.NET无侵入式对象池解决方案
相约 .NET 9!|共同关注 .NET Conf 2024 最新发布
在 .NET 中编写更好的配置文件
.NET Conf China 2024(智能 创新 开放)-- 启动智能时代新引擎

点击下方卡片关注DotNet NB

一起交流学习

▲ 点击上方卡片关注DotNet NB,一起交流学习

请在公众号后台

回复 【路线图】获取.NET 2024开发者路线
回复 【原创内容】获取公众号原创内容
回复 【峰会视频】获取.NET Conf大会视频
回复 【个人简介】获取作者个人简介
回复 【年终总结】获取作者年终回顾
回复 加群加入DotNet NB 交流学习群

长按识别下方二维码,或点击阅读原文。和我一起,交流学习,分享心得。

DotNet NB
.NET 技术学习分享,社区热点分享,专注为 .NET 社区做贡献,愿我们互相交流学习,共同推动社区发展
 最新文章