.NET 8 中的 WPF File Dialog 改进

news/2024/2/27 22:54:27

作者: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.ppmy.cn/news/1119619.html

相关文章

算法 缺失的第一个正整数-(哈希)

牛客网: BM53 题目: 无重复元素数组中未出现的最小的正整数 思路: (1) 使用单独hash表记录每个元素出现的次数,从1开始递增查询出现次数直到次数为0停止返回 (2) 将原数组作为hash表使用,处理好负数与0,将绝对值在N范围内的每个元素的绝对…

UEFI 安装 Debian12 Linux 物理机虚拟机VMware通用

文章目录 前言⭐前置虚拟机物理机 安装流程选择安装方式语言及键盘选择网络选择创建用户系统磁盘分区新旧磁盘分区方式BOOT分区SWAP分区根分区 安装过程中其他选项选择软件包安装流程末 前言⭐ 物理机和虚拟机安装仅有设置UFFI引导的差别、这里前置为设置UEFI引导。安装步骤大…

关于ClickHouse的SQL操作

目录 clickhouse 和 mysql 的比较 5.1 create 5.2 Insert 1.标准 INSERT 2.从表到表的插入 5.3 Update 和 Delete 1.删除操作 2.修改操作 clickhouse 和 mysql 的比较 共同点: 都是关系型数据库,支持SQL查询语言;支持事务处理&#xff…

NSS [HNCTF 2022 Week1]Interesting_http

NSS [HNCTF 2022 Week1]Interesting_http POST:wantflagCookies:useradminX-Forwarded-For:127.0.0.1

c++ QT 十八位时间戳转换

先说一下UTC: 它是协调世界时间,又称世界统一时间、世界标准时间、国际协调时间,简称UTC UTC时间与本地时间关系:UTC 时间差本地时间 如果UTC时间是 2015-05-01 00:00:00 那么北京时间就是 2015-05-01 08:00:00 解释:…

智能热水器丨打造智能家居新体验

随着科学技术的不断发展,智能电器越来越被大众所采纳,如智能扫地机,智能洗衣机,智能微波炉等等,越来越智能的电器为人们的生活带来了许多便利。以往的热水器一般都是只有按键/机械的控制方式,没有其他无线控…

蓝桥杯每日一题2023.9.12

3491. 完全平方数 - AcWing题库 题目描述 分析 完全平方数的一个特点: 所有的质因子的个数为偶数。eg1.9的质因子为3,3的个数为2,得到了9(3*39) eg2.81的质因子为3,3的个数为4,得到81&#…

JeecgBoot v3.5.5 版本发布,性能大升级版本—开源免费的低代码开发平台

项目介绍 JeecgBoot是一款企业级的低代码平台!前后端分离架构 SpringBoot2.x,SpringCloud,Ant Design&Vue3,Mybatis-plus,Shiro,JWT 支持微服务。强大的代码生成器让前后端代码一键生成! JeecgBoot引领…

基于SpringBoot的在线商城系统设计与实现

目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 商品分类管理 商品信息管理 轮播图管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储&#xff…

使用GSAP创建惊艳的动画效果(一)

目录 GSAP简介GSAP的语法方法目标变量transform(变换)其它属性 vue中使用GSAP安装GSAP引用GSAP使用GSAP GSAP简介 GSAP是一个非常流行的js动画库,被广泛用于创建跨浏览器和跨平台的高性能动画。它的主要特点包括: 提供丰富的属性和方法,可用…

Video Caption / 视频字幕:常用指标(BELU-4,ROUGE-L,METEOR,CIDEr,SPICE)和数据集总结

本文作为入门Video Caption / 视频字幕 的随笔记录,用于查漏补缺和回顾,难免有疏漏和不足指出,烦请指出! 一、指标 Video Caption / 视频字幕常用的标准指标有四种:BLEU-1[1],BLEU-2[1],BLEU-3[1],BLEU-4[1],ROUGE-L[2],METEOR[3],CIDEr[4],SPICE[5],这些指标在论…

MyBatisPlus(五)配置表名前缀:table-prefix

说明 数据库中的表名,和项目中的实体类名,并不符合默认对应规则。所有表都有同样的前缀,而实体类名是和表名去掉前缀后的部分对应的。 解决方案 配置全局表名前缀,使实体类名对应的表名,自动加上一段前缀。 限制 …

@Autowire、@Recourse用啥?

在使用IDEA写Spring相关的项目的时候,在字段上使用Autowired注解时,总是会有一个波浪线提示:Field injection is not recommended. 这是为啥呢?今天就来一探究竟。 众所周知,在Spring里面有三种可选的注入方式&#xf…

IM6ULL学习第18章Linux 系统对中断的处理

栈 什么是栈 栈是一段内存空间。ARM处理器程序的运行过程 ARM芯片属于精简指令集(RISC:Reduced Instruction Set Computing) 特点: 1、对内存只有读和写两种指令, 2、所有的数据运算都是在CPU内部完成的。举例实现aab; CPU 先在内存中读…

OpenCV自学笔记十九:霍夫变换

目录 1、霍夫直线变换 2、霍夫圆环变换 1、霍夫直线变换 霍夫直线变换(Hough Line Transform)是一种用于在图像中检测直线的技术。它能够从图像中提取出直线的参数,例如直线的斜率和截距。 霍夫直线变换的基本原理是在参数空间中累加直线…

spring boot +vue 博客系统,开源的资源网站

spring boot vue 博客系统,开源的资源网站(Aurora前后端分离博客) 体验地址:http://blog.tlzcf.vip/ 相关技术 前端: 样式来自于:hexo的aurora主题基础框架:vue3(前台) vue2(后台)状态管理:…

华为云云耀云服务器L实例评测|华为云上安装监控服务Prometheus三件套安装

文章目录 华为云云耀云服务器L实例评测|华为云上试用监控服务Prometheus一、监控服务Prometheus三件套介绍二、华为云主机准备三、Prometheus安装四、Grafana安装五、alertmanager安装六、三个服务的启停管理1. Prometheus、Alertmanager 和 Grafana 启动顺序2. 使用…

SpringMVC自定义注解---[详细介绍]

一,对于SpringMVC自定义注解概念 是一种特殊的 Java 注解,它允许开发者在代码中添加自定义的元数据,并且可以在运行时使用反射机制来获取和处理这些信息。在 Spring MVC 中,自定义注解通常用于定义控制器、请求处理方法、参数或者…

贪心算法-金条切割问题

1、题目描述 一块金条切成两半,是需要花费和长度数值一样的铜板的。比如长度为20的金条,不管切成长度多大的两半,都要花费20个铜板。 问:一群人想整分整块金条,怎么分最省铜板? 例如,给定数组{1…

Vue之vue-cli搭建SPA项目

目录 ​编辑 前言 一、vue-cli简介 1. 什么是vue-cli 2. vue-cli的重要性 3. vue-cli的应用场景 二、Vue-cli搭建SPA项目 1. 构建前提(node.js安装完成) 2. 安装vue-cli 3. 使用脚手架vue-cli(2.X版)来构建项目 4. 分析创建spa项目的八个问题 …
最新文章