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

설명

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

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

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

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

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

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

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

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

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

적용 대상

추가 정보