none
Как использовать сенсорный ввод и манипуляции в WPF 4? RRS feed

  • Общие обсуждения

  • В WPF 4 имееются базовые события сенсорного ввода: TouchDownEvent, TouchEnterEvent, TouchLeaveEvent, TouchMoveEvent, TouchUpEvent. Сенсорный ввод поддерживают UIElement, UIElement3D и ContentElement. Поэтому мы можем обрабатывать эти события и рисовать фигуры/элементы или генерировать конкретные операции в коде для достижении мультитач.

    Вот простой пример:

    XAML:

     

    <Canvas x:Name="canvas"
      TouchDown="canvas_TouchDown"
      TouchMove="canvas_TouchMove"
      TouchUp="canvas_TouchUp"/>
    
    

     

    Код:

     

    public MainWindow()
    {
     InitializeComponent();
     shapes = new Dictionary();
    }
    
    private void canvas_TouchDown(object sender, TouchEventArgs e)
    {
     var shape = CreateShape();
     var origin = e.GetTouchPoint(canvas);
     shape.RenderTransform = new TranslateTransform(origin.Position.X - shape.RenderSize.Width / 2,
     origin.Position.Y - shape.RenderSize.Height / 2);
     shapes.Add(e.TouchDevice, shape);
     // Добавляем фигуру на канвас
     canvas.Children.Add(shape);
     canvas.InvalidateVisual();
     canvas.CaptureTouch(e.TouchDevice);
    }
    
    private void _canvas_TouchMove(object sender, TouchEventArgs e)
    {
     if (e.TouchDevice.Captured == canvas)
     {
      var shape = shapes[e.TouchDevice];
      var origin = e.GetTouchPoint(canvas);
    
      shape.RenderTransform = new TranslateTransform(origin.Position.X - shape.RenderSize.Width / 2,
      origin.Position.Y - shape.RenderSize.Height / 2);
     }
    }
    
    private void canvas_TouchUp(object sender, TouchEventArgs e)
    {
     canvas.ReleaseTouchCapture(e.TouchDevice);
     canvas.Children.Remove(shapes[e.TouchDevice]);
     shapes.Remove(e.TouchDevice);
    } 
    
    

     

    Для манипуляций можно обрабатывать события ManipulationStarted, ManipulationDelta, ManipulationStarting, ManipulationCompleted. Событие ManipulationDelta происходит несколько раз, когда пользователь перемещает пальцы на экране во время манипуляции, и повторяется при возникновении инерции. Пример:

    XAML:

    <Canvas x:Name="_canvas"  
      ManipulationStarting="_canvas_ManipulationStarting"  
      ManipulationDelta="_canvas_ManipulationDelta">
     <Rectangle IsManipulationEnabled="True" Fill="Red" Width="100" Height="100"/>
    </Canvas>
    
    

    Код:

    private void _canvas_ManipulationStarting(object sender, ManipulationStartingEventArgs e)
    {
     e.ManipulationContainer = _canvas;
     e.Handled = true;
    }
    
    private void _canvas_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
    {
     var element = e.OriginalSource as UIElement;
     var transformation = element.RenderTransform as MatrixTransform;
     var matrix = transformation == null Matrix.Identity : transformation.Matrix;
    
     matrix.ScaleAt(e.DeltaManipulation.Scale.X,
         e.DeltaManipulation.Scale.Y,
         e.ManipulationOrigin.X,
         e.ManipulationOrigin.Y);
    
     matrix.RotateAt(e.DeltaManipulation.Rotation,
         e.ManipulationOrigin.X,
         e.ManipulationOrigin.Y);
    
     matrix.Translate(e.DeltaManipulation.Translation.X,
          e.DeltaManipulation.Translation.Y);
    
     element.RenderTransform = new MatrixTransform(matrix);
     e.Handled = true;
    } 
    
    


    Для связи [mail]
    14 декабря 2010 г. 10:47