WPF窗口标题栏大小与Perperor V2或PerMonitor不同

nukf8bse  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(134)

我有一个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
wnavrhmk

wnavrhmk1#

窗口标题栏称为非客户区,PerMonitor(V1)和PerMonitor或V2之间的差异之一是支持非客户区的自动缩放。PersimmorV2 supersimmPerMonitor(V1),一旦指定PersimmorV2,您就根本不需要自己设置缩放,除非您有一个需要特别注意的元素。
最后,我建议指定PercaseorV2并删除手动设置缩放的逻辑。

相关问题