我有一个wpf应用程序(.Net 7)与DPI意识,但我有一些问题与大小的窗口标题栏与不同的DPI规模在不同的电脑。
我的两台电脑有Windows 11版本22H2。PC 1(台式机),带有两个1920x1080显示器,100%比例。PC 2(笔记本电脑)一台显示器为2880x1800,比例为175%,另一台显示器为1920x1080,比例为100%。
这是Windows的正常外观:
这是我的manifest字段:
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/PM</dpiAware>
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitor</dpiAwareness>
<!--<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2,PerMonitor</dpiAwareness>-->
<longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
</windowsSettings>
</application>
问题是在pc 1与PerMonitor
工作正常,但不与PerMonitorV2
。pc 2在PerMonitorV2
上工作正常,但在PerMonitor
上就不行了。
下面是一个例子:配备PerMonitorV2
的PC 1和显示器的比例为175%(使用PerMonitor
在每种比例的每台显示器上都运行良好):
配备PerMonitor
的PC 2和一台配备2880x1800(175%比例)的显示器以及另一台配备1920x1080(100%比例)的显示器(使用PerMonitorV2
可在每种比例的每台显示器中正常工作):
最初显示器1(主屏幕)中的应用程序:
把它移到显示器2:
最初显示器2中的应用程序(主要屏幕):
把它移到监视器1:
下面是我的代码OnDpiChanged
:
Protected Overrides Sub OnDpiChanged(oldValueDpi As DpiScale, newDpi As DpiScale)
Dim dpi = VisualTreeHelper.GetDpi(Me).PixelsPerDip
Dim screen As Forms.Screen = Forms.Screen.FromHandle(New WindowInteropHelper(Me).Handle)
If screen.Bounds.Width > screen.Bounds.Height Then
Me.Scrll.LayoutTransform = New ScaleTransform(1 / dpi * screen.Bounds.Width / 1920, 1 / dpi * screen.Bounds.Height / 1080)
Else 'in case the monitor is vertical
Me.Scrll.LayoutTransform = New ScaleTransform(1 / dpi, 1 / dpi)
End If
End Sub
1条答案
按热度按时间wnavrhmk1#
窗口标题栏称为非客户区,PerMonitor(V1)和PerMonitor或V2之间的差异之一是支持非客户区的自动缩放。PersimmorV2 supersimmPerMonitor(V1),一旦指定PersimmorV2,您就根本不需要自己设置缩放,除非您有一个需要特别注意的元素。
最后,我建议指定PercaseorV2并删除手动设置缩放的逻辑。