gpt4 book ai didi

c# - VS2017下对话框调整大小

转载 作者:行者123 更新时间:2023-11-30 20:28:30 24 4
gpt4 key购买 nike

这很奇怪。我移植了一个在 VS2008 下运行良好的项目,但是当我用 VS2017 构建它时,一行的存在导致我的对话框调整大小——代码甚至不需要运行,它只需要出现在一个子例程中运行!我已经创建了我能想到的最简单的程序版本来展示这种行为。尝试在不同版本的 Visual Studio 下构建/运行。我很想解释为什么会发生这种情况以及如何解决它。谢谢。

using System;
using System.IO;
using System.Windows.Forms;
using System.Windows.Media.Imaging; // Need reference to PresentationCore

namespace Test2017
{
public class MainDlg : Form
{
[STAThread]
static void Main() { Application.Run(new MainDlg()); }

public MainDlg()
{
SuspendLayout();
var button = new Button { Location = new System.Drawing.Point(7, 56), Size = new System.Drawing.Size(263, 23), Text = "Note size before and after clicking" };
button.Click += Button_Click;
ClientSize = new System.Drawing.Size(282, 253);
Controls.Add(button);
ResumeLayout(false);
PerformLayout();
}

private void Button_Click(object sender, EventArgs e)
{
if (DateTime.Today.Year != 1234) return; // This will always return
try
{
// The following is never executed - but its very presence causes the dialog to shrink when running under VS2017
BitmapFrame.Create((FileStream)null); // Was using this to get metadata - that part works ok
MessageBox.Show("Success");
}
catch { MessageBox.Show("Exception"); }
}
}
}

最佳答案

BitmapFrame 是一个来自 PresentationCore 程序集的类,始终在 WPF 应用程序中使用。它有一个模块初始化程序,可以自动使程序成为 dpiAware。成为 dpiAware 对 WPF 应用程序非常重要。应该be a feature对于 Winforms 应用程序,但必须手动打开它。

C# 语言不支持 module initializers .它大致类似于静态构造函数,但在加载程序集时运行。程序集由即时编译器加载,这就是为什么它看起来只是存在语句就有所不同,而执行它并不重要。

因此,避免此问题的最佳方法是确保您的应用在创建其第一个窗口之前是 dpiAware。点击链接了解如何修改 list 。如果不想成为 dpiAware,在 Winforms 中编写 dpiAware 代码不是那么直观,那么您可以通过粘贴此代码来禁用 PresentationCore 的功能:

[assembly:System.Windows.Media.DisableDpiAwareness]

这需要添加对 WindowsBase 的引用。您可以将它放在任何您喜欢的地方,AssemblyInfo.cs 是一个非常合乎逻辑的地方。

关于c# - VS2017下对话框调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47296521/

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