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

注釈

ポインターが押された状態にある場合にのみ、ポインターを正常にキャプチャできます (Pointer.IsInContact を にする true必要があります)。 押される物理的な構成は、ポインター デバイスの種類 (マウス ボタンが押され、タッチ ポイントが下向き、接触しているスタイラス) によって異なります。 押されていないポインターをキャプチャしようとした場合、またはポインターが以前に押されたが解放された場所をキャプチャしようとすると、CapturePointer は を返します false。 既存のキャプチャは、 を返した呼び出しの CapturePointer 影響を受 falseけません。

通常、 PointerPressed イベント ハンドラー内でポインターをキャプチャします。 ハンドラーの PointerRoutedEventArgs イベント データから取得する Pointer インスタンスは、ハンドラーのPointerPressedコード内から を呼び出CapturePointerすときに value パラメーターに渡す必要がある値です。

現在のポインター アクションがアプリで動作を開始する必要があるため、通常はポインターをキャプチャします。 この場合、通常、動作が完了するか、ポインター キャプチャを解放して取り消されるまで、そのポインターのアクションから発生する他のイベントを他の要素が処理しないようにします。 ポインターがキャプチャされた場合、キャプチャを持つ要素のみがポインターの入力イベントを取得し、ポインターが境界に移動しても他の要素はイベントを発生させません。 たとえば、隣接する 2 つの要素を持つ UI があるとします。 通常、ある要素から他方の要素にポインターを移動した場合、最初に最初の要素から PointerMoved イベントを取得し、次に 2 番目の要素から PointerMoved イベントを取得します。 ただし、最初の要素がポインターをキャプチャした場合、キャプチャされたポインターがその境界を離れた場合でも、最初の要素はイベントを受け取 PointerMoved り続けます。 また、2 番目の要素は、キャプチャされたポインターがポインターに入ったときに、キャプチャされたポインターに対して PointerEntered イベントを発生しません。

ポインター キャプチャの状態と、ポインター キャプチャに関連するイベントの生成は、完全にはアプリ コードにかかっていません。 ユーザーがポインターを離すと、 PointerReleased イベントが生成され 、そのポインターに関連付けられているポインター キャプチャは失われます。 これにより、元のキャプチャ要素に PointerCaptureLost が発生します。

ほとんどの場合、ポインター キャプチャは、ユーザーが前のポインター キャプチャを解放する入力アクションを完了すると自動的に解放されます (タッチ ポイントを持ち上げ、マウスの左ボタンを離し、スタイラスを範囲外に取り出します)。 キャプチャを解放する可能性があるもう 1 つの条件は、 PointerCanceled イベントを発生するアクションです。 通常、アプリは、 ReleasePointerCapture または ReleasePointerCaptures を使用してポインター キャプチャをキャンセルしなくても、ユーザー入力アクションに関連付けられているキャプチャ リリース動作 依存できます。 詳しくは、「マウス操作」をご覧ください。

CapturePointerポインターが既にキャプチャされている場合、 メソッドは を返falseします。

UIElement では、一度に複数のポインター ポイントをキャプチャできます。 パラメーターを value 使用して、キャプチャする ポインター インスタンスを示します。

ジェスチャを表す入力イベント ( TappedDoubleTapped など) は、通常、ポインターが解放された後にのみ発生するため、ジェスチャ イベントのイベント ハンドラーでポインターをキャプチャしないでください。 ジェスチャ イベントのイベント データ内の ポインター 参照は、ポインター キャプチャを開始できません。

ヒント

ポインター関連の入力イベント ハンドラーの範囲外で を使用 CapturePointer しないでください。 その時点で ポインター キャプチャが許可されているポインターに確実に関連付けられているポインターがない限り、CapturePointer 呼び出しは影響を及ぼすことはありません。 新しいを生成し、その新しい Pointer ポインターを使用して を呼び出す CapturePointer 実用的な方法はありません。 ポインター関連の入力イベントの Pointer イベント データを介してシステムが提供している参照のみを使用する必要があります。

適用対象

こちらもご覧ください