我正在使用C# UWP
编写程序,其中Inkcanvas
覆盖了整个屏幕。在不禁用此InkCanvas的情况下,我想获得鼠标位置。我试图设置这样的事件:
MyInkCanvas.PointerMoved += MyInkCanvas_PointerMoved;
然而,这个事件永远不会被调用,因为我猜它是由InkCanvas处理的。相反,我尝试执行以下操作:
MyInkCanvas.addHandler(PointerMovedEvent, new PointerEventHandler(MyInkCanvas_PointerMoved), true);
这不起作用,这可能意味着我做错了,因为AddHandler的文档说:
为指定的路由事件添加路由事件处理程序,将处理程序添加到当前元素的处理程序集合中。将processedEventsToo指定为true,即使事件在别处处理,也要调用提供的处理程序
如果我理解正确,即使InkCanvas首先处理它,也应该使事件发生。
我还尝试将此代码放在InkCanvas父级上,但结果相同。
那么,如何在不禁用InkCanvas的情况下获取鼠标位置?
答案 0 :(得分:1)
根据您的要求,您可以通过WetStrokeContinuing
事件获取鼠标位置。它发生在InkPresenter
开始处理墨水笔划之后和停止处理相同笔划之前,表示继续捕获墨迹数据。您可以使用以下代码获取coreWetStrokeUpdateSource
订阅WetStrokeContinuing
活动。
CoreWetStrokeUpdateSource coreWetStrokeUpdateSource = CoreWetStrokeUpdateSource.Create(MyInkCanvas.InkPresenter);
coreWetStrokeUpdateSource.WetStrokeContinuing += CoreWetStrokeUpdateSource_WetStrokeContinuing;
您将在WetStrokeContinuing
事件处理程序中获得鼠标位置。
private void CoreWetStrokeUpdateSource_WetStrokeContinuing(CoreWetStrokeUpdateSource sender, CoreWetStrokeUpdateEventArgs args)
{
var points = args.NewInkPoints;
foreach (var point in points)
{
Debug.WriteLine($"-----{ point.Position.X}--- {point.Position.Y}--");
}
}
您也可以使用PointerEventArgs
获取位置,两者之间的区别在于触发时间不同。
private void StrokeInput_StrokeContinued(Windows.UI.Input.Inking.InkStrokeInput sender, Windows.UI.Core.PointerEventArgs args)
{
var position = args.CurrentPoint.Position;
Debug.WriteLine($"-----{ position.X}--- {position.Y}--");
}
StrokeContinued
在笔画输入开始并且继续被Windows.UI.Input.Inking.InkPresenter对象捕获时发生。
在Windows.UI.Input.Inking.InkPresenter开始处理墨迹后发生WetStrokeContinuing
笔划和停止处理相同笔划之前,表示继续捕获墨迹数据。
结果是一样的。但是,StrokeContinued
更方便使用。