.NET 8 中的 WPF File Dialog 改进

作者:Dipesh Kumar
排版:Alan Wang

我们很高兴宣布从 .NET 8 Preview 7 开始,对 WPF 中的通用文件对话框 API 进行了一系列新的改进。其中包括迄今为止存储库中投票最多的 API 建议 – 允许用户选择文件夹的 OpenFolderDialog 控件 – 以及文件对话框上支持新的用户场景的几个新属性,例如单独保存状态、限制文件夹导航等。

到目前为止,WPF 支持 Windows Vista 中引入的 Common Item Dialog API 以及在旧操作系统上运行时遗留的 GetOpenFileName 和 GetSaveFileName 函数。作为此更新的一部分,由于 .NET 支持的所有 Windows 版本都只使用较新的 API,因此对话框代码被清理,遗留函数的基础架构被删除。在兼容模式下运行的应用程序将继续工作,但它们将使用 Common Item Dialog API 来呈现通用对话框。

OpenFolderDialog

WPF 社区中用于选择文件夹的对话框是最受欢迎的功能之一。示例用例包括在 Visual Studio 或 Visual Studio Code 中打开文件夹、在 Outlook 中保存附件、将压缩文件解压到用户选择的文件夹中。到目前为止,开发人员必须使用 Windows Forms或依赖第三方库才能提供这种体验,这引入了不必要的依赖关系从而不适合现有的对话框模型。

从 .NET 8 开始,我们在 WPF 中提供了对此对话框的本机支持。社区中已经有很多关于如何将此功能集成到现有文件对话框模型中的讨论,试图平衡兼容性要求、简洁的架构设计和底层 API 结构。最终,我们决定在继承链中引入一个新的基类 CommonItemDialog,其中所有公共对话框属性都被移动:
在这里插入图片描述
这使我们能够保持与现有应用程序的向后兼容。有关设计和讨论的更多详细信息您可以在请求和 API 提案中找到。

使用 OpenFolderDialog 类似于使用 WPF 中现有的文件对话框:

var folderDialog = new OpenFolderDialog
{Title = "Select Folder",InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)
};if (folderDialog.ShowDialog() == true)
{var folderName = folderDialog.FolderName;MessageBox.Show($"You picked ${folderName}!");
}

其中 ShowDialog 方法打开对话框并等待用户输入:
在这里插入图片描述
您可以在 WPF-Samples 存储库中找到演示 OpenFolderDialog 和其他文件对话框用法的更多示例。

新对话框属性

我们还扩展了属性的数量来配置 WPF 中文件对话框的行为,尽可能多地涵盖当前的底层 API。以下强调了其中的一些:

  • ClientGuid 标识对话框的持久状态。这允许 Windows 记住对话框状态,例如窗口大小、每个对话框最后使用的文件夹,例如“Save”和“Save As”对话框。
  • AddToRecent 设置为 false 指示对话框不把打开或保存的文件或文件夹添加到 Windows 为用户维护的最新项目列表中。例如,这可以用于防止配置文件出现在“Start”菜单的“Recommended”部分中。
  • CreateTestFile 设置为 false 可防止 SaveFileDialog 通过创建和删除虚拟文件来验证用户是否有权访问所选位置。当访问该位置的成本预计很高时,这会很有用。但是,应用程序在创建文件本身时必须执行所有适当的错误处理。
  • RootDirectory 将对话框中的文件夹树限制为某个文件夹及其子文件夹。以下是将 RootDirectory 设置为用户的 Pictures 文件夹的示例:
    在这里插入图片描述

请检查请求或 API 提案中所有新属性的列表。我们诚邀您尝试新功能并向我们提供反馈。

File Dialogs 的下一步计划

关于文件对话框仍有改进的空间,例如支持虚拟文件、通过在用户界面中包含附加控件来自定义对话框。我们收到了来自社区提议实施文件对话框控件的请求,我们想邀请所有感兴趣的人参与制定此提案,并帮助我们确定对您和您的应用程序重要的功能的优先级。

社区亮点

特别感谢我们的社区贡献者 Jan Kučera 为保持对话框更新活跃而做出的不懈努力。他探索了不同的设计选项,准备了 API 提案,并全程参与实现了该功能。谢谢 Jan!

在这里插入图片描述

大家好,我是 Jan,一名研究员、开发人员,也是 WPF 的忠实粉丝!

自 Microsoft 开始公开谈论 WPF 至今已有 20 年了,当时它的代号是 Avalon(这方面的知识让我赢得了我的第一本 WinFX 书),它成为使用 .NET 时间最长的应用程序框架之一。虽然它启发了许多其他框架,但似乎没有一个能在功能和简单性方面与它相媲美,这就是为什么 WPF 一直是我的首选。我特别看重它的布局系统,允许应用程序适应其内容。

对我来说,编程最有趣的部分就是与现实世界互动。我作为与社区合作的 Core Team 成员参与了 .NET Micro Framework(它将 WPF UI 模型引入嵌入式设备)。在 Microsoft Research,我在 James Scott 和 Steve Hodges 的出色团队中负责 .NET Gadgeteer工作。在他们的指导下,我成为了人机交互领域的研究员。

我的大部分空闲时间都花在了 Unicode 志愿服务上,我是 Unicode’s Script Ad Hoc Group 和 Keyboard Subcommittee 的副主席。我对国际化(尤其是文本输入和输出)的热情使我能够为 DirectWrite 文本整形引擎和新键盘布局的设计做出贡献。这项工作使我能够帮助越来越多的社区实现数字化,我希望我们也能让 WPF 跟上他们的需求。

我很高兴看到人们对 WPF 持续的兴趣和发展,并可以推荐任何考虑加入 WPF 的人加入这个热情的社区并塑造其未来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/115551.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql数据库管理用户

Mysql数据库管理用户 一、管理用户1.1、用户创建1.2、 查看用户信息1.3 、重命名用户1.4、 删除用户1.5、 修改当前登录用户密码1.6、修改其他用户密码1.7、 忘记密码的解决办法 二、数据库用户授权2.1、 权限的授予2.2、 查看权限2.3、 撤销用户权限 一、管理用户 1.1、用户创…

如何设置代理ip服务器地址

在今天的互联网环境中,代理服务器在保护个人隐私和规避网络限制方面扮演着重要的角色。设置代理服务器地址的方式主要取决于你使用的具体软件或编程语言。在本文中,我们将分别介绍如何在Python和Java中使用HTTP代理服务器、SOCKS代理服务器以及代理池。 …

四、二叉树-上(Binary tree)

文章目录 一、算法核心思想二、算法模型(一)回溯1.[104.二叉树的最大深度](https://leetcode.cn/problems/maximum-depth-of-binary-tree/)(1)思路(2)代码(3)复杂度分析 2.[144.二叉…

39 | selenium基础架构,UI测试架构

什么是测试基础架构? 测试基础架构指的是,执行测试的过程中用到的所有基础硬件设施以及相关的软件设施。因此,我们也把测试基础架构称之为广义的测试执行环境。通常来讲,测试基础架构主要包括以下内容: 执行测试的机器…

进化的京东云DaaS:向大模型要解

通过新的DaaS大模型模式,京东云想要为企业提供的增长路径,恰是从最原始的“要数据”真正进阶到最终的“出效果”,将大模型和京东对增长的理解封装到整个产品矩阵中,帮助企业构建最适合AI时代的增长底盘。 作者|皮爷 出品|产业…

Xamarin.Android实现App内版本更新

目录 1、具体的效果2、代码实现2.1 基本原理2.2 开发环境2.3 具体代码2.3.1 基本设置2.3.2 系统的权限授予2.3.3 进度条的layout文件2.3.4 核心的升级文件 3、代码下载4、知识点5、参考文献 1、具体的效果 有事需要在程序内集成自动更新的功能,网上找了下&#xff…

【开发篇】二、属性绑定与校验

文章目录 1、ConfigurationProperties自定义Bean属性绑定2、EnableConfigurationProperties注解3、ConfigurationProperties第三方Bean属性绑定4、松散绑定5、常用计量单位6、数据校验7、yaml绑定值的坑--关于进制 1、ConfigurationProperties自定义Bean属性绑定 前面读取yaml…

链表的回文判断

思路: 找中间节点–>逆置->比较 代码: /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* middleNode(struct ListNode* head) { struct ListNode*slowhead; struct ListNode*f…

AI数字人:最强声音驱动面部表情模型VideoReTalking

目录 1 VideoReTalking论文解读 1.1 介绍 1.2 相关工作 1.2.1 视频编辑中的音频配音 1.2.2 基于音频的单图像面部动画 1.3 框架 1.3.1 语义引导重演网络 1.3.2 口型同步网络 1.3.3 身份感知增强网络 1.3.4 后期处理 1.4 训练 1.4.1 每个模块的训练 1.4.2 评估 1.…

8+单基因+细胞凋亡+WGCNA+单细胞+实验验证

今天给同学们分享一篇单基因细胞凋亡WGCNA实验验证的生信文章“RASGRP2 is a potential immune-related biomarker and regulates mitochondrial-dependent apoptosis in lung adenocarcinoma”,这篇文章于2023年2月3日发表在Front Immunol期刊上,影响因…

软件测试缺陷报告详解

【软件测试行业现状】2023年了你还敢学软件测试?未来已寄..测试人该何去何从?【自动化测试、测试开发、性能测试】 缺陷报告是描述软件缺陷现象和重现步骤地集合。软件缺陷报告Software Bug Report(SBR)或软件问题报告Software Pr…

【效率提升】maven 转 gradle 实战 | 京东云技术团队

一、灵魂三问 1、gradle 是什么? 一个打包工具, 是一个开源构建自动化工具,足够灵活,可以构建几乎任何类型的软件,高性能、可扩展、能洞察等。其中洞察,可以用于分析构建过程中数据,提供分析参…