簡體   English   中英

在具有不同分辨率/縮放比例的顯示器之間拖動表單時,ContextMenuStrip 不會進行 DPI 縮放(WinForms、.NET 6.0、PerMonitorV2)

[英]ContextMenuStrip doesn't DPI scale when Form is dragged between monitors with different resolution/scaling (WinForms, .NET 6.0, PerMonitorV2)

當其父窗體在不同分辨率/縮放的監視器之間拖動時,ContextMenuStrip 不會縮放。 ContextMenuStrip 以正確的縮放比例正確顯示在它第一次顯示的任何屏幕上,但隨后它(錯誤地)在任何其他屏幕上顯示時保持相同的縮放比例(即使該其他屏幕需要不同的縮放比例)。

例如,第一次在 1920x1080/100% 縮放屏幕上顯示時,ContextMenuStrip 縮放是正確的:

具有正確縮放的 contextmenustrip 圖像

如果隨后將窗體移動到 4k/250% 縮放屏幕,則 ContextMenuStrip 以 1:1 縮放顯示,因此在高 DPI 屏幕上太小了:

縮放不正確的 contextmenustrip 圖像

這個問題的最佳解決方法是什么?

蠻力解決方案是在每次顯示ContextMenuStrip時重新生成它。 一個可能較低開銷但仍然不優雅的解決方案是在DpiChanged事件上重新生成ContextMenuStrip ,如下所示。 ContextMenuStrip上調用Refresh()、PerformLayout()Invalidate()似乎不足以強制它進行縮放。 但是即使沒有重新生成菜單項,生成一個新的ContextMenuStrip似乎也會強制重新縮放。

private void Form1_DpiChanged(object sender, DpiChangedEventArgs e)
    {
    this.ContextMenuStrip = new ContextMenuStrip(components);
    this.ContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
    this.menu1ToolStripMenuItem,
    this.menu2ToolStripMenuItem});
    }

有比這更清潔的解決方案嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM