gpt4 book ai didi

c# - 使用自定义 ImageListView 控件后出现表单收缩问题

转载 作者:太空宇宙 更新时间:2023-11-03 21:04:04 24 4
gpt4 key购买 nike

我正在使用以下控件在 winforms 中加载图像。

https://www.codeproject.com/Articles/43265/ImageListView

(或)

https://github.com/oozcitak/imagelistview

在 1080P 15"笔记本电脑上似乎存在一些与此控件相关的缩放问题,在 24"1080P 显示器上无法重现

我最近注意到表单缩放发生了一件奇怪的事情。它发生在直接从 GitHub 和我自己的应用程序中下载的主解决方案中。我的 PC 显示设置设置为将显示缩放到 125%(右键单击桌面 -> 显示设置 -> 更改文本、应用程序和...的大小)

当我开始调试时,表单加载 - 正确缩放。但是,只要我单击 TreeView 中包含图像的文件夹,就会加载图像,并且表单会缩小到 100%。因此整个窗体似乎立即缩小,而 Windows 的其余部分仍为 125%。

我不确定这是 Windows 还是 .Net Framework 的错误,或者只是控件的实现方式。或者可能有一个我不知道的属性需要更改?

如有任何帮助/建议,我们将不胜感激!

更新:

使用 DpiAware 选项后

enter image description here

不使用 DpiAware 选项

enter image description here

最佳答案

我已经能够重现这个问题,这有点奇怪。正如我所怀疑的那样,该应用程序未声明为 DPI 感知并将其设置为 DPI 感知解决了表单大小更改的问题。这可以通过向项目添加 list 文件来完成(项目菜单->添加新项->常规选项卡->选择“应用程序 list 文件”。然后将以下内容添加到文件中:

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

这解决了问题,但我很好奇为什么代码会以这种方式运行。该过程以 DPI 不感知开始,在关闭图像选择对话框后,它以某种方式切换为 DPI 感知过程。可以使用 SysInternal 的 Process Explorer 应用程序进行观察。我的第一个想法是搜索对 SetProcessDpiAwareness 的调用。 , 但没有产生任何结果。深入研究代码发现调用了 MetadataExtractor.cs 中的 InitViaWpf 方法。此方法和其他方法利用 System.Windows.Media.Imaging 命名空间中的类。看起来,这种 WPF 库的使用会导致应用程序变成 DPI 感知,就像 WPF 应用程序默认是 DPI 感知的一样。为名为 USEWICImageListView 项目声明了一个条件编译符号,它控制 WPF 类的这种用法。在项目的属性构建配置中删除此符号将阻止它们的使用,并且可以用作替代解决方案,并且可能比将 Winform 应用程序声明为 DPI 感知更可取,但我没有时间进一步研究这个库。


编辑:通过创建 BitmapFrame 的实例可以轻松复制此行为在未标记为 DPI 感知的 Winform 应用程序中。

using System.Windows.Forms;
using System.IO;
using System.Windows.Media.Imaging;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
using (Stream strm = File.OpenRead("someimage.jpg"))
{
BitmapFrame frame = BitmapFrame.Create(strm, BitmapCreateOptions.IgnoreColorProfile, BitmapCacheOption.None);
}

}
}
}

编辑 2:DPI 感知 winform 缩放程序。

第 1 步:在设计器中,将 AutoScaleMode 属性设置为 Inherit。我知道 None 有意义,但 Inherit 是真正的默认设置。

第 2 步:修改窗体的构造函数以使用 Dpi 或字体自动缩放。这样做是为了防止设计者记录不正确的 AutoScaleDimensions。

public Form1()
{
InitializeComponent();
// Select either Dpi or font scaling
this.AutoScaleDimensions = new SizeF(96, 96);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;

//this.AutoScaleDimensions = new System.Drawing.SizeF(6.0F, 13.0F);
//this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;

编辑 3:要在使用 WPF 库的 DPI 未知应用程序上维护 DPI 虚拟化(防止自动切换到 DPI 感知),请在 app.manifest 文件中包含 dpiAware 部分,但明确将其设置为 false。

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

关于c# - 使用自定义 ImageListView 控件后出现表单收缩问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42437903/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com