使用UWP InkCanvas时如何获得鼠标位置

时间:2017-09-26 14:03:28

标签: c# uwp

我正在使用C# UWP编写程序,其中Inkcanvas覆盖了整个屏幕。在不禁用此InkCanvas的情况下,我想获得鼠标位置。我试图设置这样的事件:

MyInkCanvas.PointerMoved += MyInkCanvas_PointerMoved;

然而,这个事件永远不会被调用,因为我猜它是由InkCanvas处理的。相反,我尝试执行以下操作:

MyInkCanvas.addHandler(PointerMovedEvent, new PointerEventHandler(MyInkCanvas_PointerMoved), true);

这不起作用,这可能意味着我做错了,因为AddHandler的文档说:

  

为指定的路由事件添加路由事件处理程序,将处理程序添加到当前元素的处理程序集合中。将processedEventsToo指定为true,即使事件在别处处理,也要调用提供的处理程序

如果我理解正确,即使InkCanvas首先处理它,也应该使事件发生。

我还尝试将此代码放在InkCanvas父级上,但结果相同。

那么,如何在不禁用InkCanvas的情况下获取鼠标位置?

1 个答案:

答案 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更方便使用。