CommonOpenFileDialog 导致 Windows 窗体缩小

Posted

技术标签:

【中文标题】CommonOpenFileDialog 导致 Windows 窗体缩小【英文标题】:CommonOpenFileDialog cause Windows Form to shrink 【发布时间】:2017-08-15 23:06:01 【问题描述】:

我一直在开发 Windows 窗体应用程序,并且最近添加了一个简单的设置页面,允许用户选择一个文件夹来存放输出。 OpenFileDialog 很丑而且不好用,所以我在 WindowsAPICodePack 中添加了对CommonOpenFileDialog 的访问 - 都很好。

当我打开CommonOpenFileDialog 时,Windows 窗体应用程序会缩小到更小的尺寸,如附图所示。

左边是正常程序,右边是打开对话框:

我试过检查Form 前后的大小,但没有改变,所以我碰到了一点砖墙。任何信息都会很有用,如果需要,我可以提供更多详细信息。

打开对话框的代码是:

CommonOpenFileDialog dialog = new CommonOpenFileDialog();
dialog.DefaultDirectory = selectedFolderTextBox.Text;
dialog.IsFolderPicker = true;

if (dialog.ShowDialog() != CommonFileDialogResult.Ok) return;

selectedFolderTextBox.Text = dialog.FileName;

【问题讨论】:

考虑添加用于打开对话框的代码。这也是一个非常有趣的错误。 不能说我见过这种情况如果您制作一个新应用并打开相同的 commonopenfiledialog 会发生同样的情况吗? @BugFinder 我没想过要尝试,感谢您的建议。不幸的是,我刚刚创建了一个空白项目,它显示出相同的行为。 对,所以我刚刚检查了笔记本电脑上的一些设置,并找出了原因。我的笔记本电脑屏幕在“显示设置”下设置为主显示屏,“更改文本、应用程序和其他项目的大小”(DPI?)设置为 125%。我的第二台显示器设置为 100%。我刚刚将这些设置都更改为 100%,从而解决了这个问题。我还尝试将主显示器换到第二台显示器,并保持 DPI (?) 设置与以前一样(显示器上为 100%,笔记本电脑屏幕上为 125%),这也解决了问题。跨度> 我遇到了同样的问题——简单地显示CommonOpenFileDialog 会将整个窗口缩小到看起来好像我的比例是 100% 的样子。不幸的是,我的显示器是一个电视屏幕,将比例从 150% 减小到 100% 会使很多东西变得不可读。有没有找到可以在代码中完成的解决方案? 【参考方案1】:

当我将窗口 Settings->System 中的 Scale and layout 从 100% 更改为更高的值时,我会遇到这个问题。这可能与高 DPI 和 DPI 缩放有关。

我找到了几个解决方案:

解决方案 1:配置 Windows 窗体以支持高 DPI

此解决方案仅适用于 .NET Framework 4.7 或更高版本。

将此添加到 App.config 文件中。

<System.Windows.Forms.ApplicationConfigurationSection>
    <add key="DpiAwareness" value="PerMonitorV2" />
</System.Windows.Forms.ApplicationConfigurationSection> 

来源:Configuring your Windows Forms app for high DPI support:

在 app.config 文件中启用每个显示器的 DPI 感知。

Windows 窗体 介绍了一个新的 System.Windows.Forms.ApplicationConfigurationSection 元素到 支持从 .NET 开始添加的新功能和自定义 框架 4.7。利用支持高的新功能 DPI,将以下内容添加到您的应用程序配置文件中。

<System.Windows.Forms.ApplicationConfigurationSection>
    <add key="DpiAwareness" value="PerMonitorV2" />
</System.Windows.Forms.ApplicationConfigurationSection> 

重要

在以前版本的 .NET Framework 中,您使用清单来 添加高 DPI 支持。不再推荐这种方法,因为它 覆盖 app.config 文件中定义的设置。

解决方案 2:使用 Ookii.Dialogs.WinForms NuGet 包

使用Ookii.Dialogs.WinForms NuGet 包。它不存在缩水问题。它有一个VistaOpenFileDialog,类似于WindowsAPICodePack 的CommonFileDialog。它还有一个不错的文件夹浏览器VistaFolderBrowserDialog,就像CommonFileDialogIsFolderPicker 设置为true

解决方案 3:覆盖 .exe 文件的高 DPI 缩放行为

此解决方案需要手动更改每个应用程序 .exe 文件的兼容性设置,因此不是最佳解决方案。

为此,您需要右键单击 .exe 文件,选择属性->兼容性->更改高 DPI 设置并选中覆盖高 DPI 缩放行为并选择其中一个选项(请参阅:How to use DPI scaling in Windows 10 to fix blurry old apps)

【讨论】:

第二个解决方案在我的 Inspiron 7591 2n1 上非常适合我,它有点像 Surface Pro。我必须为客户使用 Visual Studio 2013,所以我必须使用 Visual Studio 2019 获取 Ookii .nupkg(因为 Ookii 需要 NuGet 3.3,而我无法使用 VS 2013),然后我引用了该文件夹/.dll在我的 VS2013 项目中。【参考方案2】:

通过添加 app.manifest 文件启用 dpi-aware,并取消注释此块。

<application xmlns="urn:schemas-microsoft-com:asm.v3">
    <windowsSettings>
    <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
    </windowsSettings>
</application>

这适用于我的 Surface Pro 4(dpi 缩放 200%)。

【讨论】:

完美!没想到会这么容易。谢谢! 完美运行。谢谢

以上是关于CommonOpenFileDialog 导致 Windows 窗体缩小的主要内容,如果未能解决你的问题,请参考以下文章

CustomCell 为空或导致 SIGABRT 错误 [W/Code]

kindeditor编辑区空格被隐藏,导致所见所得不一致的解决办法

UIPopoverController w/MonoTouch.Dialog 会导致不需要的弹出框大小调整

iverilog递归函数导致分段错误

grep中的数字导致一行

用R做logistic回归,定性自变量太多导致报错怎么办