.NET 8 中的 WPF File Dialog 改进

2023-09-22 00:23:44

作者:Dipesh Kumar
排版:Alan Wang

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

到目前为止,WPF 支持 Windows Vista 中引入的 Common Item Dialog API 以及在旧操作系统上运行时遗留的 GetOpenFileNameGetSaveFileName 函数。作为此更新的一部分,由于 .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 的人加入这个热情的社区并塑造其未来。

更多推荐

Android字体大小dp,sp,px系统设置字体大小变化表现

Android字体大小dp,sp,px系统设置字体大小变化表现<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://sc

.NET Framework 2023 年 8 月安全和质量汇总更新

作者:SaliniAgarwal排版:AlanWang今天,我们发布了针对.NETFramework的2023年8月安全和质量汇总更新。安全CVE-2023-36899–.NETFramework远程代码执行漏洞此安全更新修复了IIS上的应用程序存在的一个漏洞,该漏洞使用其父应用程序的应用程序池,可能导致权限升级或其他

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

目录前言一、技术栈二、系统功能介绍用户信息管理商品分类管理商品信息管理轮播图管理三、核心代码1、登录模块2、文件上传模块3、代码封装前言现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本ONLY在线商城系统就是在这样的大环境下诞生,其可以帮助管理者在

LuatOS-SOC接口文档(air780E)--errDump - 错误上报

示例--基本用法,10分钟上报一次,如果有的话iferrDumpthenerrDump.config(true,600)end--附开源服务器端:https://gitee.com/openLuat/luatos-devlogerrDump.dump(zbuff,type,isDelete)手动读取异常日志,主要用于用

AG35学习笔记(二):安装编译SDK、CMakeLists编译app、Scons编译server

目录一、概述二、安装SDK2.1网盘SDK-权限不够2.2bj41-需要交叉source2.3mullen-relocate_sdk.py路径有误三、编译SDK3.1/bin/sh:1:gcc:notfound3.2curses.h:Nosuchfileordirectory四、CMakeLists-编译app4.1c

前端面试手撕编程之ES+算法

目录ES6防抖节流防抖、节流应用改变thiscalltypeofthis!=='function'context=context||windowcontext._this=thisdeletecontext._thisbind:return_this.apply(context,[...arguments].slice

REASUNOS瑞森半导体-MOS管系列在服务器电源上的应用

一、前言服务器电源是指使用在服务器上的电源(POWER),它和PC电源一样,都是一种开关电源,指能够将交流电转换为服务器所需直流电的电源。服务器电源按照标准可以分为ATX电源和SSI电源等。ATX标准使用较为普遍,主要用于台式机、工作站和低端服务器;而SSI标准是随着服务器技术的发展而产生的,适用于各种档次的机架式服务

设计模式之迭代器模式

文章目录迭代器模式基本介绍迭代器模式的原理类图对原理类图的说明-即(迭代器模式的角色及职责)迭代器模式应用实例迭代器模式在JDK-ArrayList集合应用的源码分析迭代器模式的注意事项和细节优点缺点迭代器模式基本介绍迭代器模式(IteratorPattern)是常用的设计模式,属于行为型模式如果我们的集合元素是用不同

家居服务小程序发展指南

随着互联网的快速发展,越来越多的企业开始关注并投资于线上平台的建设,以满足用户的多样化需求。家居服务行业也不例外,通过打造小程序平台,可以更好地服务用户,提供更便捷的家居服务体验。首先,我们可以选择使用第三方制作平台,如【乔拓云】网,以便快速搭建家居服务小程序。登录乔拓云网后,点击【轻应用小程序】,即可进入设计小程序页

常见的服务器异常包括哪些?

服务器异常通常指服务器在执行其预期功能时遇到的问题或错误。这可能是由各种原因引起的,包括硬件故障、软件错误、网络问题、配置错误等。服务器异常可能导致服务器无法正常工作或提供预期的服务。这可能表现为服务器无法响应客户端请求、速度变慢、崩溃、数据丢失等问题。常见的服务器异常包括:500InternalServerError

rust枚举

一、定义枚举1.使用enum关键字定义枚举。语法格式如下enumenum_name{variant1,variant2,variant3}例如enumFruits{Banana,//香蕉Pear,//梨Mandarin,//橘子Eggplant//茄子}2.可以为枚举成员添加属性enumBook{Papery(u32)

热文推荐