2016-08-26 4 views
1

Мне нужно, чтобы пользователь касался элемента управления холста одним пальцем, процесс рисования должен начинаться, и если пользователь коснется элемента управления холстом двумя пальцами, область холста должна прокручиваться/панорамироваться. Как я могу это сделать?Как я могу получить сенсорный ввод в UWP?

Благодаря

+0

Вы проверили мой ответ? Любая проблема? –

ответ

1

Мы можем использовать событие указателя для обнаружения несколько пальцев входа в UWP. Например:

<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> 

Как вы можете видеть, я положил ScrollViewer из canvas:CanvasControl, так будет холст возможность прокручивать. Код позади:

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(); 
    } 
} 

Когда ничья с одним пальцем, в моем демо холст будет обновлять свой макет только тогда, когда указатель отпускается. Вы можете изменить код, чтобы позволить холсту обновляться каждый раз при перемещении указателя. Но я думаю, для этого вам нужно будет заменить canvas:CanvasControl еще одним элементом управления Win2D, для получения дополнительной информации вы можете обратиться к CanvasControl.Invalidate Method.

+0

Большое спасибо за вашу помощь. Меня устраивает. :) –