Я довел это до очень простого воспроизведения и не могу понять, что не так с этой формой. При запуске с разрешением 96 DPI / масштабом 100% все выглядит нормально:
Но при запуске с разрешением 144 DPI / масштабом 150% (или даже 96 DPI / масштабом 150%) масштабируется все, кроме высоты формы:
Первоначально я думал, что это проблема DPI, но после проверки того, что он воспроизводится с разрешением 96 DPI, я не уверен, что происходит.
В диалоговом окне или элементе управления не происходит ничего особенного, кроме конкретной настройки шрифта диалогового окна и установки AutoScaleMode в DPI. Форма находится внутри сборки, которая автоматически загружается приложением.
Я использую .NET 4.7.2 и Windows 10.
Вот код формы:
using System;
using System.Net;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace FormTestLib
{
partial class ValidatingSplash : Form
{
public ValidatingSplash()
{
InitializeComponent();
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
this.CenterToParent();
}
}
}
Вот файл конструктора:
namespace FormTestLib
{
public partial class ValidatingSplash
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ValidatingSplash));
this.lblValidating = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// lblValidating
//
this.lblValidating.Anchor = System.Windows.Forms.AnchorStyles.None;
this.lblValidating.AutoSize = true;
this.lblValidating.Location = new System.Drawing.Point(58, 45);
this.lblValidating.Name = "lblValidating";
this.lblValidating.Size = new System.Drawing.Size(166, 13);
this.lblValidating.TabIndex = 7;
this.lblValidating.Text = "Validating cached credentials...";
//
// ValidatingSplash
//
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.ClientSize = new System.Drawing.Size(274, 104);
this.ControlBox = false;
this.Controls.Add(this.lblValidating);
this.Font = new System.Drawing.Font("Segoe UI", 8.25F);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "ValidatingSplash";
this.Text = "Validating Credentials";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label lblValidating;
}
}
В app.config я устанавливаю DpiAwareness в соответствии с документами:
<System.Windows.Forms.ApplicationConfigurationSection>
<add key="DpiAwareness" value="PerMonitorV2"/>
</System.Windows.Forms.ApplicationConfigurationSection>
И в манифесте я устанавливаю совместимость:
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows 10 compatibility -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
</application>
</compatibility>
Все это согласно инструкции по поддержке высокого разрешения здесь.
Код приложения просто показывает диалог:
namespace TestApp
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
// set the visual styles
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(true);
ValidatingSplash Splash = new ValidatingSplash();
Splash.ShowDialog();
}
}
}
Может ли кто-нибудь увидеть, что я могу делать неправильно или что мне не хватает?
Заранее спасибо!
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
. Вы можете найти настройки dpiAwareness в файлеapp.manifest
. Даже если это больше не рекомендуется, попробуйте. Откомментируйте то, что вы предпочитаете. Сомневаюсь, что вы нашли это:Application.SetCompatibleTextRenderingDefault(true);
в Документах. - person Jimi   schedule 04.03.2019<add key="EnableWindowsFormsHighDpiAutoResizing" value="false" />
. При включении поддержки DPI в app.config также включаются все дополнительные функции. Вот почему я предложил использовать только манифест для установки конкретной настройкиdpiAwareness
или простоdpiAware = true
. Я думаю, что пропустил это: Форма находится внутри сборки, которая автоматически загружается приложением. Это также имеет последствия. Если что-то dpiAware, вам лучше иметь все, что работает таким образом. - person Jimi   schedule 04.03.2019this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
Если эту строчку закомментировать, то все работает как надо. Этот стиль границы не поддерживается, когда (или содержит ошибки, если) установлен определенный шрифт диалогового окна, а также включена поддержка DPI и масштабирование экрана. Может ли кто-нибудь подтвердить, действительно ли это ошибка или так задумано? Я не смог ничего найти в документах. - person Bill Brooks   schedule 04.03.2019