2017-09-26 52 views
1

我正在使用C# UWP编写程序,其中我有一个覆盖整个屏幕的Inkcanvas。不禁用这个InkCanvas我想获得鼠标位置。我试图设置一个事件是这样的:如何在使用UWP InkCanvas时获得鼠标位置

MyInkCanvas.PointerMoved += MyInkCanvas_PointerMoved; 

然而,这一事件不会被调用,因为我猜它是由InkCanvas处理。相反,我试图做到以下几点:

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

这不工作,要么这可能意味着我做错了什么,因为AddHandler的文件说:

添加路由事件处理程序指定的路由事件,将处理程序添加到当前元素上的处理程序集合中。将handledEventsToo指定为true时,即使该事件在其他地方处理

所提供的处理程序中调用如果我理解正确的话这应该使该事件发生,甚至尽管InkCanvas第一处理它。

我也尝试将此代码放在InkCanvas父项上,结果相同。

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

回答

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对象被捕获时发生。

WetStrokeContinuing发生在Windows.UI.Input.Inking.InkPresenter开始处理墨迹 描边并且在它停止处理相同描边之前,指示墨迹数据继续被捕获。

结果是一样的。但是,StrokeContinued使用起来更方便。

+0

这工作非常好。一个简单的问题,但我发现我也可以使用'MyInkCanvas.InkPresenter.StrokeInput.StrokeContinued + = StrokeInput_StrokeContinued',这对我来说是一样的。你知道这两者之间有什么特别的区别,应该让我的案例比另一个更好吗? – FewWords

+0

是的,你是对的,我已经更新了答案。 –

相关问题