用C#/.NET(Windows窗体/.NET框架4.7.2)编写应用程序

当我在我的应用程序中调用一个SaveFileDialog表单时,它似乎支持系统的设置(当全局禁用暗模式时,一个亮对话框显示,当在系统范围内启用暗模式时,一个暗对话框显示).

在同一应用程序中,无论系统设置如何,OpenFileDialogFolderBrowserDialog总是显示在"灯光模式"中.

有没有办法迫使OpenFileDialogFolderBrowserDialog尊重系统的主题?

EDIT 1: 似乎SaveFileDialog控件调用系统的本机Save Dialog,而.NET中的OpenFileDialog(可能还有FolderBrowserDialog)控件是本机系统对话框的包装器.在这方面,一个可接受的"解决方案"是从.NET内部调用本机对话框(可能使用Windows API),假设本机对话框默认会遵守系统的黑暗模式设置.

一百零七 关于OpenFileDialog,在遇到this SO question后,其中一条 comments 表明启用ShowHelp会导致显示"较旧"的对话框版本,我设法使"现代"对话框显示出来.虽然我自己没有启用ShowHelp,但我确实启用了ShowReadOnly.禁用它起到了作用.我不确定这种行为是否记录在案,但肯定不是很明显.在这个问题上,OpenFileDialog问题现在解决了,FolderBrowserDialog问题仍然存在.

推荐答案

要使OpenFileDialog支持黑暗模式,请确保将其AutoUpgradeEnabled属性设置为True.还要确保将其ShowReadOnlyShowHelp属性设置为False.现代的对话框变体不支持这些UI元素.

FolderBrowserDialog也有一个AutoUpgradeEnabled,允许它支持黑暗模式,但只能从.Net Core开始..Net Framework4.8及更高版本不支持此功能.

只要您继续使用.Net Framekwork 4.x,就用其他组件替换FolderBrowserDialog.有很多FolderBrowserDialog的开源变体,或者OpenFileDialog的变体,它们只支持 Select 文件夹.

您也可以编写自己的OpenFileDialog版本,仅支持基于IFileDialog API的文件夹挑选.把FOS_PICKFOLDERS option调到.关于可能的实现,请参见例如Trying to open a file dialog using the new IFileDialog and IFileOpenDialog interfaces in C# with minimal codeShow detailed Folder Browser from a PropertyGrid.

Csharp相关问答推荐

在ASP.NET中为数据注释 Select 合适的语言

在C#中使用in修饰符

Microsoft. SQLServer. Types(106.1000.6)在try 从用户定义的类型检索值时引发异常

System. InvalidOperationException:无法将数据库中的字符串值i转换为映射的ItemType枚举中的任何值''''

编写DataAnnotations自定义验证器的多种方法

使用LayoutKind在C#中嵌套 struct .显式

实体核心框架--HasColumnType和HasPrecision有什么不同?

从应用程序图API调用访问所有者字段

查找表中的模式

取决于您的数据量的多个嵌套循环

单元测试:模拟返回空

BlockingCollection T引发意外InvalidOperationException

HttpClient SendAsync与多线程环境中的ArchiveZip

Blazor:搜索框在第一次搜索时不搜索

在.NET8中如何反序列化为私有字段?

将J数组转换为列表,只保留一个嵌套的JToken

C#Microsoft.CodeAnalysis.CSharp.Scriiting不等待并行.对于

C#如何获取字符串中引号之间的文本?

默认架构不存在EF核心迁移

将ValueTask发送给调用者