问题描述
我有一个内置于 .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