언어

Touch 클래스

정의

운영 체제에서 다중 터치 입력을 처리하고 이벤트를 발생시키는 FrameReported 애플리케이션 수준 서비스를 제공합니다.

public ref class Touch abstract sealed
public static class Touch
type Touch = class
Public Class Touch
상속
Touch

예제

다음 예제에서는 터치 스크린을 Canvas 통해 두 손가락을 끌어 간단한 패턴을 만들 수 있습니다. 각 터치는 .로 TouchDevice표시됩니다. 패턴은 터치에서 제공하는 터치 포인트 사이에 선을 그려 만들어집니다. 이 예제에서는 Windows 터치 호환 화면이 필요합니다.

다음 태그는 가운데에 있는 사용자 인터페이스로 Canvas 구성된 사용자 인터페이스를 Grid만듭니다.

<Window x:Class="WpfTouchFrameSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="525" Width="525">
    <Grid>
        <Canvas x:Name="canvas1"
                Width="500" Height="500"
                Background="Black" />     
    </Grid>
</Window>

다음 코드는 이벤트를 처리합니다 FrameReported . 터치가 누르면 CanvasTouchDevice 에 캡처됩니다Canvas. 터치가 해제되면 TouchDevice 해제됩니다. 터치가 가로 CanvasId 로 이동하면 확인됩니다. 첫 번째 터치에서 이동한 경우 해당 위치가 기록됩니다. 두 번째 터치에서 이동하면 첫 번째 터치의 위치에서 두 번째 터치의 위치로 선이 그려집니다.

using System;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Shapes;

namespace WpfTouchFrameSample
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        // Variables for tracking the position of two points.
        Point pt1, pt2 = new Point();
        
        public MainWindow()
        {
            InitializeComponent();
            Touch.FrameReported += new TouchFrameEventHandler(Touch_FrameReported);
        }

        void Touch_FrameReported(object sender, TouchFrameEventArgs e)
        {
            if (this.canvas1 != null)
            {
                foreach (TouchPoint _touchPoint in e.GetTouchPoints(this.canvas1))
                {
                    if (_touchPoint.Action == TouchAction.Down)
                    {
                        // Clear the canvas and capture the touch to it.
                        this.canvas1.Children.Clear();
                        _touchPoint.TouchDevice.Capture(this.canvas1);
                    }

                    else if (_touchPoint.Action == TouchAction.Move && e.GetPrimaryTouchPoint(this.canvas1) != null)
                    {   
                        // This is the first (primary) touch point. Just record its position.
                        if (_touchPoint.TouchDevice.Id == e.GetPrimaryTouchPoint(this.canvas1).TouchDevice.Id)
                        {
                            pt1.X = _touchPoint.Position.X;
                            pt1.Y = _touchPoint.Position.Y;
                        }

                        // This is not the first touch point. Draw a line from the first point to this one.
                        else if (_touchPoint.TouchDevice.Id != e.GetPrimaryTouchPoint(this.canvas1).TouchDevice.Id)
                        {
                            pt2.X = _touchPoint.Position.X;
                            pt2.Y = _touchPoint.Position.Y;

                            Line _line = new Line();
                            _line.Stroke = new RadialGradientBrush(Colors.White, Colors.Black);
                            _line.X1 = pt1.X;
                            _line.X2 = pt2.X;
                            _line.Y1 = pt1.Y;
                            _line.Y2 = pt2.Y;
                            _line.StrokeThickness = 2;
                            this.canvas1.Children.Add(_line);
                        }
                    }

                    else if (_touchPoint.Action == TouchAction.Up)
                    {
                        // If this touch is captured to the canvas, release it.
                        if (_touchPoint.TouchDevice.Captured == this.canvas1)
                        {
                            this.canvas1.ReleaseTouchCapture(_touchPoint.TouchDevice);
                        }
                    }
                }                        
            }
        }
    }
}
Class MainWindow
    ' Variables for tracking the position of two points.
    Private pt1, pt2 As Point

    Public Sub New()
        InitializeComponent()
        AddHandler Touch.FrameReported, AddressOf Touch_FrameReported
    End Sub

    Private Sub Touch_FrameReported(ByVal sender As System.Object, ByVal e As System.Windows.Input.TouchFrameEventArgs)
        If (canvas1 IsNot Nothing) Then
            For Each _touchPoint In e.GetTouchPoints(Me.canvas1)

                If _touchPoint.Action = TouchAction.Down Then
                    ' Clear the canvas and capture the touch to it.
                    canvas1.Children.Clear()
                    _touchPoint.TouchDevice.Capture(canvas1)

                ElseIf _touchPoint.Action = TouchAction.Move Then
                    ' This is the first (primary) touch point. Just record its position.
                    If _touchPoint.TouchDevice.Id = e.GetPrimaryTouchPoint(Me.canvas1).TouchDevice.Id Then
                        pt1.X = _touchPoint.Position.X
                        pt1.Y = _touchPoint.Position.Y

                        ' This is not the first touch point; draw a line from the first point to this one.
                    ElseIf _touchPoint.TouchDevice.Id <> e.GetPrimaryTouchPoint(Me.canvas1).TouchDevice.Id Then
                        pt2.X = _touchPoint.Position.X
                        pt2.Y = _touchPoint.Position.Y

                        Dim _line As New Line()
                        _line.Stroke = New RadialGradientBrush(Colors.White, Colors.Black)
                        _line.X1 = pt1.X
                        _line.X2 = pt2.X
                        _line.Y1 = pt1.Y
                        _line.Y2 = pt2.Y

                        _line.StrokeThickness = 2
                        Me.canvas1.Children.Add(_line)
                    End If

                ElseIf _touchPoint.Action = TouchAction.Up Then
                    ' If this touch is captured to the canvas, release it.
                    If (_touchPoint.TouchDevice.Captured Is canvas1) Then
                        canvas1.ReleaseTouchCapture(_touchPoint.TouchDevice)
                    End If
                End If
            Next
        End If
    End Sub
End Class

설명

FrameReported 이벤트는 Silverlight와의 호환성을 지원하기 위해 Windows Presentation Foundation(WPF)에 포함됩니다. Silverlight와의 호환성을 보장할 필요가 없는 경우 터치 이벤트(예: TouchDown and TouchMove, on UIElement, UIElement3D또는 ContentElement.)를 사용합니다.

FrameReported 이벤트는 TouchDown 및 TouchMove 같은 다른 WPF 입력 이벤트와 동일한 이벤트 모델을 사용하지 않습니다. UI의 개체 트리를 통해 잠재적으로 라우팅되는 요소별 이벤트로 노출되는 대신, FrameReported 이 이벤트는 애플리케이션 수준에서 처리되는 단일 이벤트입니다. 따라서 이벤트 처리기의 매개 변수를 sender 사용하여 처리되는 요소를 확인할 수 없습니다.

TouchFrameEventArgs 터치 이벤트와 관련된 값을 가져오는 TouchPoint 데 사용합니다. TouchPoint에서 터치를 Position 가져와서 동작인지 여부를 TouchActionDownMoveUp 확인할 수 있습니다. 를 사용하여 .를 TouchPointTouchDevice가져올 수도 있습니다. 에서 디바이스 TouchDevice 를 Id확인하고 터치되는 요소에 대한 정보를 가져올 수 있습니다.

이벤트

속성 Description
FrameReported

터치 메시지를 보낼 때 발생합니다.

적용 대상