2016-08-26 5 views
1

Ich brauche, dass, wenn Benutzer auf Canvas-Steuerelement mit einem Finger berühren, Zeichnungsprozess gestartet werden muss und wenn Benutzer auf der Leinwand Steuerung mit zwei Finger berühren, müssen Leinwandbereich scrollen/schwenken. Wie kann ich das machen?Wie kann ich Toucheingabe in uwp erhalten?

Dank

+0

Haben Sie meine Antwort überprüft? Irgendein Problem? –

Antwort

1

Wir können Pointer Ereignisse verwenden, um mehrere Finger Eingang in UWP zu erkennen. Zum Beispiel:

<ScrollViewer x:Name="scrollViewer" VerticalScrollBarVisibility="Hidden" HorizontalScrollBarVisibility="Hidden" 
       VerticalScrollMode="Disabled" HorizontalScrollMode="Disabled"> 
    <canvas:CanvasControl x:Name="canvasControl" Draw="CanvasControl_Draw" CreateResources="canvasControl_CreateResources" ClearColor="CornflowerBlue" 
          PointerPressed="canvasControl_PointerPressed" PointerReleased="canvasControl_PointerReleased" PointerExited="canvasControl_PointerReleased" 
          PointerCanceled="canvasControl_PointerPressed" 
          PointerMoved="canvasControl_PointerMoved" Width="1200"> 
    </canvas:CanvasControl> 
</ScrollViewer> 

Wie Sie sehen können, habe ich eine ScrollViewer aus dem canvas:CanvasControl, so wird die Leinwand gescrollt werden können. Code hinter:

private CanvasRenderTarget renderTarget; 

private async void CanvasControl_Draw(Microsoft.Graphics.Canvas.UI.Xaml.CanvasControl sender, Microsoft.Graphics.Canvas.UI.Xaml.CanvasDrawEventArgs args) 
{ 
    args.DrawingSession.DrawImage(renderTarget); 
} 

private void canvasControl_CreateResources(CanvasControl sender, Microsoft.Graphics.Canvas.UI.CanvasCreateResourcesEventArgs args) 
{ 
    renderTarget = new CanvasRenderTarget(sender, (float)sender.ActualWidth, (float)sender.ActualHeight); 
} 

private List<PointerPoint> m_pt = new List<PointerPoint>(); 

private void canvasControl_PointerPressed(object sender, PointerRoutedEventArgs e) 
{ 
    PointerPoint cp = e.GetCurrentPoint(canvasControl); 
    m_pt.Add(cp); 
    if (m_pt.Count == 2) 
    { 
     scrollViewer.HorizontalScrollMode = ScrollMode.Enabled; 
     scrollViewer.VerticalScrollMode = ScrollMode.Enabled; 
    } 
} 

private void canvasControl_PointerReleased(object sender, PointerRoutedEventArgs e) 
{ 
    if (m_pt.Count == 1) 
     canvasControl.Invalidate(); 
    scrollViewer.HorizontalScrollMode = ScrollMode.Disabled; 
    scrollViewer.VerticalScrollMode = ScrollMode.Disabled; 
    m_pt.Clear(); 
} 

private void canvasControl_PointerMoved(object sender, PointerRoutedEventArgs e) 
{ 
    if (m_pt.Count == 1) 
    { 
     var pt = e.GetCurrentPoint(canvasControl); 
     using (var ds = renderTarget.CreateDrawingSession()) 
     { 
      ds.DrawCircle(new Vector2((float)pt.Position.X, (float)pt.Position.Y), 2, Colors.Black); 
     } 
    } 
    else 
    { 
     if (m_pt.Count > 2) 
      m_pt.Clear(); 
    } 
} 

Wenn Unentschieden mit einem Finger in meiner Demo das Layout die Leinwand nur aktualisiert wird, wenn der Zeiger freigegeben wird. Sie können den Code ändern, damit die Zeichenfläche bei jedem Verschieben des Zeigers aktualisiert wird. Aber ich denke, dafür müssen Sie das canvas:CanvasControl durch ein anderes Win2D-Steuerelement ersetzen, für weitere Informationen können Sie sich auf CanvasControl.Invalidate Method beziehen.

+0

Vielen Dank für Ihre Hilfe. Für mich geht das. :) –

Verwandte Themen