每个系统规模的WPF应用程序大小相同(与规模无关)

时间:2017-06-21 18:28:23

标签: c# wpf scale dpi

有没有办法让WPF应用程序在每个系统规模上都达到相同的大小?

当我在Windows系统设置中将更改文本,应用和其他项目的大小 125%(推荐)更改为 100%时全高清屏幕,我的WPF应用程序太小了。为了实现独立的系统规模应用程序,我写了一个这样的函数来将我的应用程序的缩放比例改回到125%:

private void ScaleTo125Percents()
{
    // Change scale of window content
    MainContainer.LayoutTransform = new ScaleTransform(1.25, 1.25, 0, 0);
    Width *= 1.25;
    Height *= 1.25;

    // Bring window center screen
    var screenHeight = System.Windows.SystemParameters.PrimaryScreenHeight;
    var screenWidth = System.Windows.SystemParameters.PrimaryScreenWidth;
    Top  = ( screenHeight - Height ) / 2;
    Left = ( screenWidth  - Width )  / 2;
}

但有条件可以调用此功能。屏幕的第一个必须是Full-HD(有检查这个的API),系统规模也必须是100%(没有.NET API来获得系统规模)。

我该怎么办?我是否采用标准方式使我的应用系统规模独立?

我见过的与比例无关的应用程序示例:

  • Visual Studio 2017安装程序
  • 电报桌面

1 个答案:

答案 0 :(得分:4)

终于找到了答案。首先使用以下选项之一获取系统DPI比例:

  • 从位于AppliedDPI的注册表Computer\HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics dword中读取。然后除以96.
  • 或者使用此代码段:

    double dpiFactor = System.Windows.PresentationSource.FromVisual(this).CompositionTarget.TransformToDevice.M11;
    

    返回介于1.0到2.5之间的值

然后创建一个包含应用程序设置的配置文件,并将dpiFactor设置为默认比例。如果用户首选自定义比例,请在窗口启动时调用此函数:

private void UserInterfaceCustomScale(double customScale)
{
    // Change scale of window content
    MainContainer.LayoutTransform = new ScaleTransform(customScale, customScale, 0, 0);
    Width *= customScale;
    Height *= customScale;

    // Bring window center screen
    var screenHeight = System.Windows.SystemParameters.PrimaryScreenHeight;
    var screenWidth = System.Windows.SystemParameters.PrimaryScreenWidth;
    Top  = ( screenHeight - Height ) / 2;
    Left = ( screenWidth  - Width )  / 2;
}