다음을 통해 공유


UIElement.CapturePointer(Pointer) 메서드

정의

포인터 캡처를 UIElement로 설정합니다. 캡처된 후에는 캡처가 있는 요소만 포인터 관련 이벤트를 발생합니다.

public:
 virtual bool CapturePointer(Pointer ^ value) = CapturePointer;
bool CapturePointer(Pointer const& value);
public bool CapturePointer(Pointer value);
function capturePointer(value)
Public Function CapturePointer (value As Pointer) As Boolean

매개 변수

value
Pointer

포인터 개체 참조입니다.

반환

Boolean

bool

개체에 포인터 캡처가 있으면 true입니다. 그렇지 않으면 false입니다.

예제

이 예제에서는 PointerPressed 처리를 기반으로 CapturePointer를 호출하는 방법을 보여줍니다. 또한 포인터 참조를 추적하고 계산하는 패턴을 보여 줍니다.

int _pointerCount;

public Scenario2()
{
    this.InitializeComponent();
    bEnteredExited.PointerEntered += bEnteredExited_PointerEntered;
    bEnteredExited.PointerExited += bEnteredExited_PointerExited;
    bEnteredExited.PointerPressed += bEnteredExited_PointerPressed;
    bEnteredExited.PointerReleased += bEnteredExited_PointerReleased;
    bEnteredExited.PointerMoved += bEnteredExited_PointerMoved;

    // To code for multiple Pointers (that is, fingers), 
    // we track how many entered/exited.
    _pointerCount = 0;
}

private void bEnteredExited_PointerMoved(object sender, 
    PointerRoutedEventArgs e)
{
    Scenario2UpdateVisuals(sender as Border, "Moved");
}

private void bEnteredExited_PointerReleased(object sender, 
    PointerRoutedEventArgs e)
{
    ((Border)sender).ReleasePointerCapture(e.Pointer);
    txtCaptureStatus.Text = string.Empty;
}

//Can only get capture on PointerPressed (i.e. touch down, mouse click, pen press)
private void bEnteredExited_PointerPressed(object sender, 
    PointerRoutedEventArgs e)
{
    if (tbPointerCapture.IsOn)
    {
        bool _hasCapture = ((Border)sender).CapturePointer(e.Pointer);
        txtCaptureStatus.Text = "Got Capture: " + _hasCapture;
    }
}

private void bEnteredExited_PointerExited(object sender, 
    PointerRoutedEventArgs e)
{
    _pointerCount--;
    Scenario2UpdateVisuals(sender as Border, "Exited");
}

private void bEnteredExited_PointerEntered(object sender, 
    PointerRoutedEventArgs e)
{
    _pointerCount++;
    Scenario2UpdateVisuals(sender as Border, "Entered");
}

private void Scenario2UpdateVisuals(Border border, 
    String eventDescription)
{
    switch (eventDescription.ToLower())
    {
        case "exited":
            if (_pointerCount <= 0)
            {
                border.Background = new SolidColorBrush(Colors.Red);
                bEnteredExitedTextBlock.Text = eventDescription;
            }
            break;
        case "moved":
            RotateTransform rt = 
                (RotateTransform)bEnteredExitedTimer.RenderTransform;
            rt.Angle += 2;
            if (rt.Angle > 360) rt.Angle -= 360;
            break;
        default:
            border.Background = new SolidColorBrush(Colors.Green);
            bEnteredExitedTextBlock.Text = eventDescription;
            break;
    }
}

private void Scenario2Reset(object sender, RoutedEventArgs e)
{
    Scenario2Reset();
}

private void Scenario2Reset()
{
    bEnteredExited.Background = new SolidColorBrush(Colors.Green);
    bEnteredExitedTextBlock.Text = string.Empty;
}
Private _pointerCount As Integer

Public Sub New()
    Me.InitializeComponent()
    AddHandler bEnteredExited.PointerEntered, AddressOf bEnteredExited_PointerEntered
    AddHandler bEnteredExited.PointerExited, AddressOf bEnteredExited_PointerExited
    AddHandler bEnteredExited.PointerPressed, AddressOf bEnteredExited_PointerPressed
    AddHandler bEnteredExited.PointerReleased, AddressOf bEnteredExited_PointerReleased
    AddHandler bEnteredExited.PointerMoved, AddressOf bEnteredExited_PointerMoved

    'To code for multiple Pointers (i.e. Fingers) we track how many entered/exited.
    _pointerCount = 0
End Sub

''' <summary>
''' Invoked when this page is about to be displayed in a Frame.
''' </summary>
''' <param name="e">Event data that describes how this page was reached.  The Parameter
''' property is typically used to configure the page.</param>
Protected Overrides Sub OnNavigatedTo(e As NavigationEventArgs)
End Sub

Private Sub bEnteredExited_PointerMoved(sender As Object, e As PointerRoutedEventArgs)
    Scenario2UpdateVisuals(TryCast(sender, Border), "Moved")
End Sub

Private Sub bEnteredExited_PointerReleased(sender As Object, e As PointerRoutedEventArgs)
    DirectCast(sender, Border).ReleasePointerCapture(e.Pointer)
    txtCaptureStatus.Text = String.Empty
End Sub

'Can only get capture on PointerPressed (i.e. touch down, mouse click, pen press)
Private Sub bEnteredExited_PointerPressed(sender As Object, e As PointerRoutedEventArgs)
    If tbPointerCapture.IsOn Then
        Dim _hasCapture As Boolean = DirectCast(sender, Border).CapturePointer(e.Pointer)
        txtCaptureStatus.Text = "Got Capture: " & _hasCapture
    End If
End Sub

Private Sub bEnteredExited_PointerExited(sender As Object, e As PointerRoutedEventArgs)
    _pointerCount -= 1
    Scenario2UpdateVisuals(TryCast(sender, Border), "Exited")
End Sub

Private Sub bEnteredExited_PointerEntered(sender As Object, e As PointerRoutedEventArgs)
    _pointerCount += 1
    Scenario2UpdateVisuals(TryCast(sender, Border), "Entered")

End Sub

Private Sub Scenario2UpdateVisuals(border As Border, eventDescription As String)
    Select Case eventDescription.ToLower()
        Case "exited"
            If _pointerCount <= 0 Then
                border.Background = New SolidColorBrush(Colors.Red)
                bEnteredExitedTextBlock.Text = eventDescription
            End If
            Exit Select
        Case "moved"

            Dim rt As RotateTransform = DirectCast(bEnteredExitedTimer.RenderTransform, RotateTransform)
            rt.Angle += 2
            If rt.Angle > 360 Then
                rt.Angle -= 360
            End If
            Exit Select
        Case Else
            border.Background = New SolidColorBrush(Colors.Green)
            bEnteredExitedTextBlock.Text = eventDescription
            Exit Select

    End Select
End Sub

Private Sub Scenario2ResetMethod(sender As Object, e As RoutedEventArgs)
    Reset()
End Sub

Private Sub Reset()
    bEnteredExited.Background = New SolidColorBrush(Colors.Green)
    bEnteredExitedTextBlock.Text = String.Empty
End Sub

설명

포인터가 누름 상태인 경우에만 포인터를 성공적으로 캡처할 수 있습니다(Pointer.IsInContacttrue여야 합니다). 물리적으로 누름을 구성하는 것은 포인터 장치 유형(마우스 단추 누르기, 터치 포인트 아래쪽, 접촉 스타일러스)에 따라 달라집니다. 누르지 않은 포인터 또는 포인터를 이전에 눌렀지만 이제 릴리스된 포인터를 캡처하려고 하면 CapturePointer는 false를 반환합니다. 기존 캡처는 false를 반환한 CapturePointer 호출의 영향을 받지 않습니다.

일반적으로 PointerPressed 이벤트 처리기 내에서 포인터를 캡처합니다. PointerPressed 처리기의 PointerRoutedEventArgs 이벤트 데이터에서 가져오는 포인터 instance 처리기의 코드 내에서 CapturePointer를 호출할 때 value 매개 변수에 전달해야 하는 값입니다.

현재 포인터 동작이 앱에서 동작을 시작하도록 하려면 일반적으로 포인터를 캡처합니다. 이 경우 일반적으로 포인터 캡처를 해제하여 동작이 완료되거나 취소될 때까지 다른 요소가 해당 포인터의 작업에서 발생하는 다른 이벤트를 처리하지 않도록 합니다. 포인터가 캡처되면 캡처된 요소만 포인터의 입력 이벤트를 가져오고 다른 요소는 포인터가 해당 범위로 이동하더라도 이벤트를 발생하지 않습니다. 예를 들어 인접한 두 요소가 있는 UI를 고려해 보세요. 일반적으로 포인터를 한 요소에서 다른 요소로 이동한 경우 먼저 첫 번째 요소에서 PointerMoved 이벤트를 받은 다음 두 번째 요소에서 가져옵니다. 그러나 첫 번째 요소가 포인터를 캡처한 경우 캡처된 포인터가 해당 범위를 벗어나더라도 첫 번째 요소는 PointerMoved 이벤트를 계속 받습니다. 또한 두 번째 요소는 캡처된 포인터가 포인터에 들어갈 때 캡처된 포인터에 대한 PointerEntered 이벤트를 발생하지 않습니다.

포인터 캡처 상태 및 포인터 캡처와 관련된 이벤트를 생성하는 것은 전적으로 앱 코드에 달려 있지 않습니다. 사용자가 포인터를 해제하면 PointerReleased 이벤트를 생성하고 해당 포인터와 연결된 포인터 캡처가 손실됩니다. 또한 원래 캡처 요소에서 PointerCaptureLost 가 발생합니다.

대부분의 경우 포인터 캡처는 사용자가 이전 포인터 캡처를 해제하는 입력 작업을 완료할 때 자동으로 해제됩니다(터치 포인트를 들어 올리고, 마우스 왼쪽 단추를 해제하고, 스타일러스를 범위를 벗어났습니다). 캡처를 해제할 수 있는 또 다른 조건은 PointerCanceled 이벤트를 발생시키는 작업입니다. 앱은 일반적으로 ReleasePointerCapture 또는 ReleasePointerCaptures를 사용하여 포인터 캡처를 취소하지 않고도 사용자 입력 작업과 관련된 캡처-릴리스 동작을 사용할 수 있습니다. 자세한 내용은 마우스 조작을 참조하세요.

포인터가 이미 캡처된 경우 CapturePointer 메서드는 false 를 반환합니다.

UIElement는 한 번에 둘 이상의 포인터 지점을 캡처할 수 있습니다. value 매개 변수를 사용하여 캡처하려는 포인터 instance 나타냅니다.

제스처를 나타내는 입력 이벤트(예: Tapped 또는 DoubleTapped)는 일반적으로 포인터가 해제된 후에만 발생하므로 제스처 이벤트에 대한 이벤트 처리기에서 포인터를 캡처하려고 시도해서는 안 됩니다. 제스처 이벤트에 대한 이벤트 데이터의 포인터 참조는 포인터 캡처를 시작할 수 없습니다.

포인터 관련 입력 이벤트 처리기의 scope 외부에서 CapturePointer를 사용하지 마세요. 현재 포인터 캡처가 허용되는 포인터와 연결되어 있다고 확신하는 포인터 가 없는 한 CapturePointer 호출은 아무런 영향을 주지 않습니다. 새 포인터를 생성하고 새 포인터 를 사용하여 CapturePointer를 호출하는 실용적인 방법은 없습니다. 포인터 관련 입력 이벤트의 이벤트 데이터를 통해 시스템에서 제공하는 포인터 참조만 사용해야 합니다.

적용 대상

추가 정보