【问题标题】:Dialog Resizing Under VS2017VS2017下的对话框调整大小
【发布时间】:2017-11-14 22:45:44
【问题描述】:

这很奇怪。我移植了一个在 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"); }
        }
    }
}

【问题讨论】:

  • 在 2012 年和 2017 年运行此代码,在任何一个版本中,表单都不会像您说的那样“调整大小”。
  • 抱歉,看起来这种情况并非在所有机器上都会发生,但在发生这种情况的机器上却非常一致。我会看看 Hans Passant 的提示是否能解决这个问题......

标签: c# visual-studio


【解决方案1】:

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

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

因此,避免该问题的最佳方法是确保您的应用在创建第一个窗口之前具有 dpiAware。按照链接了解如何修改清单。如果不希望成为 dpiAware,在 Winforms 中编写 dpiAware 代码不是那么直观,那么您可以通过粘贴此代码来禁用 PresentationCore 所做的:

[assembly:System.Windows.Media.DisableDpiAwareness]

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

【讨论】:

  • 我没有意识到 PresentationCore 是 WPF 特有的,并且在 WinForms 应用程序中使用时可能会产生令人不快的副作用。基于此信息,我找到了另一种获取我正在寻找的图像元数据的方法。因此,尽管我不会使用您的提示,但我会投票赞成您的答案,因为它解释了问题并指出了解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 2013-08-25
  • 1970-01-01
相关资源
最近更新 更多