如何在WPF中获取屏幕的正确DPI?

时间:2019-02-12 22:51:03

标签: c# wpf dpi

这听起来像是重复的问题,但我保证不是。我已经查看了其他问题中提供的答案,例如以下链接中的答案:

How can I get the DPI in WPF?

问题在于,它们不是返回正确的DPI。

我知道我的显示器(Dell U3415W)的DPI为109 ppi。分辨率为3440x1440。

在WPF中,我尝试了以下方法来获取屏幕的DPI:

//Method 1
var dpi_scale = VisualTreeHelper.GetDpi(this);
double dpiX = dpi_scale.PixelsPerInchX;
double dpiY = dpi_scale.PixelsPerInchY;

//Method 2
using (System.Drawing.Graphics g = System.Drawing.Graphics.FromHwnd(IntPtr.Zero))
{
    double dpiX = g.DpiX;
    double dpiY = g.DpiY;
}

//Method 3
PresentationSource source = PresentationSource.FromVisual(this);
double dpiX, dpiY;
if (source != null)
{
    dpiX = 96.0 * source.CompositionTarget.TransformToDevice.M11;
    dpiY = 96.0 * source.CompositionTarget.TransformToDevice.M22;
}

上述所有三个方法都返回 192 作为我的DPI(方法#1和#3中返回的比例因子是2)。

我正在编写代码,我需要在其中可靠地显示屏幕上某些对象之间的距离(以厘米为单位),并且该代码不仅会在我的屏幕上运行,所以我不能只硬编码“ 109“。

在相关说明中,我似乎似乎是WPF的实例,它使用实际像素而不是与设备无关的像素。

我有以下XAML声明一个带有简单网格和网格内部矩形的窗口:

<Window x:Class="MyTestWindow.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Height="768" 
        Width="1024">
    <Grid x:Name="MainObjectLocationGrid">
        <Rectangle x:Name="MainObjectLocationRectangle" HorizontalAlignment="Left" VerticalAlignment="Top" />
    </Grid> 
</Window>

在后面的代码中,我有一些代码可以在该矩形上设置一些属性:

MainObjectLocationRectangle.Width = 189.5625;
MainObjectLocationRectangle.Height = 146.4;
MainObjectLocationRectangle.Fill = new SolidColorBrush(Colors.White);
MainObjectLocationRectangle.Stroke = new SolidColorBrush(Colors.Transparent);
MainObjectLocationRectangle.StrokeThickness = 0;
MainObjectLocationRectangle.Margin = new Thickness(0, 0, 0, 0);

当我的矩形出现在屏幕上时,该矩形的尺寸为 4.4cm x 3.4cm 。 WPF表示1个与设备无关的像素为1/96英寸,所以我假设96倾斜为1英寸(即2.54厘米)。因此189.5625倾角应为1.9746英寸(或5.01厘米)。但是,在这种情况下,似乎没有使用dip。如果将显示器的实际分辨率(109 dpi)插入方程式,我们将得到所显示矩形的实际尺寸:

189.5625像素/ 109 dpi = 1.7391英寸(或4.4厘米)

但是在WPF文档中,它指出Width和Height属性使用与设备无关的像素:

https://docs.microsoft.com/en-us/dotnet/api/system.windows.frameworkelement.width?view=netframework-4.7.2#System_Windows_FrameworkElement_Width

所以,总结一下:

(1)为什么所有公认的查询DPI的方法都没有向我返回正确的DPI?

(2)为什么在设置矩形的大小时会以像素为单位而不是与设备无关的像素来解释该大小?

感谢您的帮助!

0 个答案:

没有答案