微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

WPF SkiaSharp画布单击鼠标位置

如何解决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?

解决方法

正如@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;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。