WPF SkiaSharp画布单击鼠标位置

时间:2020-09-02 04:07:51

标签: c# wpf skiasharp

注意:这是C#SkiaSharp WPF应用程序。

当我重新绘制Update qr set ruid = pr.UID from dbo.QRScanInfo as qr inner join [dbo].[Rosters] as pr on pr.Parent1cellphone = qr.UserPhoneNumber left join dbo.Sites2 as s2 on s2.site = pr.school inner join dbo.qrscaninfo qr2 on cast (s2.[Week 1] as date) = cast (qr2.created as date) where pr.UID = '8498665' (即我的应用程序的整个宽度)时,我记录了宽度和高度。现在忽略身高。在4K显示器上,宽度正确记录为3840像素(最大化)。

当我单击最左侧的画布时,记录的鼠标X位置几乎达到了预期的零。

但是,当我单击画布2552的最右边时,它的位置为X,不是我预期的3840附近吗?

这是我用来单击时获取鼠标位置的代码。

SKCanvas

和我的XAML:

private void MyCanvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    var pixelPosition = e.GetPosition(sender as SKElement);
    // ...
}

我还在<skia:SKElement Name="MyCanvas" PaintSurface="MyCanvas_PaintSurface" MouseLeftButtonDown="MyCanvas_MouseLeftButtonDown" /> 的{​​{1}}事件中检查了宽度/高度,它也不报告3840,而是报告2552作为宽度?

有什么想法为什么报告的宽度为2552而实际宽度为3840?

1 个答案:

答案 0 :(得分:1)

正如@Leandro指出的那样,您的DPI缩放比例为150%。您可以使用VisualTreeHelper的{​​{3}}方法在 .NET Framework> = 4.6.2 .NET Core> = 3.0 中获得DPI比例。 。它返回一个GetDpi结构,其中包含水平和垂直DPI比例因子。

private void MyCanvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
   var mainWindow = Application.Current.MainWindow;
   var dpiScale = VisualTreeHelper.GetDpi(mainWindow);

   var dpiScaleX = dpiScale.DpiScaleX;
   var dpiScaleY = dpiScale.DpiScaleY;

   var pixelPosition = e.GetPosition(sender as Canvas);
   var scaledPixelPosition = new System.Windows.Point(pixelPosition.X * dpiScaleX, pixelPosition.Y * dpiScaleY);

   // ...your code.
}

如果您使用的是没有GetDpi的较低版本的框架,则可以改用DpiScale

var mainWindow = Application.Current.MainWindow;

Matrix m = PresentationSource.FromVisual(mainWindow).CompositionTarget.TransformToDevice;
var dpiScaleX = m.M11;
var dpiScaleY = m.M22;