2017-09-26 50 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

是的,你是對的,我已經更新了答案。 –

相關問題