如何解决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 举报,一经查实,本站将立刻删除。