.NET WinForms 高 DPI 缩放 - 如何在显示设置更改后强制表单正确显示?

问题描述

我有一个内置于 .NET Core 3.1 的 WinForms 应用程序,它在高 DPI 显示器上运行良好。我的问题是每当在 Windows 中添加删除新的显示时,表单就会再次变得模糊。重新启动应用程序可以解决这个问题,但我想在发生这种情况时适当地重新绘制表单。

我想我已经找到了要订阅的适当系统事件,但我就是无法使表单正确地重绘/重绘。

像这样订阅 Windows 事件 displaySettingsChanged:

using Microsoft.Win32;
(...)
SystemEvents.displaySettingsChanged += new EventHandler(UpdateDpiOnopenForms);

然后添加我无法工作的事件处理程序方法

public static void UpdateDpiOnopenForms(object sender,EventArgs e)
{
    foreach (Form f in Application.OpenForms) 
    { 
        //What would the correct command be here?
    }
}

如何强制所有打开的表单使用新的认高 DPI 设置重绘/重绘,就像它们在应用程序启动后所做的那样?

解决方法

使用 Control.Invalidate() 方法。

"使控件的指定区域无效(将其添加到控件的更新区域,该区域将在下一次绘制操作时重新绘制),并导致向控件发送绘制消息。可选地,无效分配给控件的子控件。"

https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.control.invalidate?view=net-5.0

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...