UIElement.CapturePointer(Pointer) メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
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
ポインター オブジェクト参照。
戻り値
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.IsInContact は true である必要があります)。 押される物理的な構成は、ポインター デバイスの種類 (マウス ボタンが押され、タッチ ポイントが下向き、接触しているスタイラス) によって異なります。 押されていないポインターをキャプチャしようとした場合、またはポインターが以前に押されたが解放された場合、CapturePointer は false を返します。 既存のキャプチャは、 false を返した CapturePointer 呼び出しの影響を受けません。
通常、 PointerPressed イベント ハンドラー内でポインターをキャプチャします。 PointerPressed ハンドラーの PointerRoutedEventArgs イベント データから取得する Pointer インスタンスは、ハンドラーのコード内から CapturePointer を呼び出すときに value パラメーターに渡す必要がある値です。
現在のポインター アクションがアプリで動作を開始する必要があるため、通常はポインターをキャプチャします。 この場合、通常、動作が完了するか、ポインター キャプチャを解放して取り消されるまで、そのポインターのアクションから発生する他のイベントを他の要素が処理しないようにします。 ポインターがキャプチャされた場合、キャプチャを持つ要素のみがポインターの入力イベントを取得し、ポインターが境界に移動しても他の要素はイベントを発生させません。 たとえば、隣接する 2 つの要素を持つ UI があるとします。 通常、ある要素から他方の要素にポインターを移動した場合、最初に最初の要素から PointerMoved イベントを取得し、次に 2 番目の要素から PointerMoved イベントを取得します。 ただし、最初の要素がポインターをキャプチャした場合、キャプチャされたポインターが境界を離れた場合でも、最初の要素は PointerMoved イベントを受け取り続けます。 また、2 番目の要素は、キャプチャされたポインターがポインターに入ったときに、キャプチャされたポインターに対して PointerEntered イベントを発生しません。
ポインター キャプチャの状態と、ポインター キャプチャに関連するイベントの生成は、完全にはアプリ コードにかかっていません。 ユーザーがポインターを離すと、 PointerReleased イベントが生成され 、そのポインターに関連付けられているポインター キャプチャは失われます。 これにより、元のキャプチャ要素に PointerCaptureLost が発生します。
ほとんどの場合、ポインター キャプチャは、ユーザーが前のポインター キャプチャを解放する入力アクションを完了すると自動的に解放されます (タッチ ポイントを持ち上げ、マウスの左ボタンを離し、スタイラスを範囲外に取り出します)。 キャプチャを解放する可能性があるもう 1 つの条件は、 PointerCanceled イベントを発生するアクションです。 通常、アプリは、 ReleasePointerCapture または ReleasePointerCaptures を使用してポインター キャプチャをキャンセルしなくても、ユーザー入力アクションに関連付けられているキャプチャ リリース動作 に依存できます。 詳しくは、「マウス操作」をご覧ください。
ポインターが既にキャプチャされている場合、CapturePointer メソッドは false を返します 。
UIElement では、一度に複数のポインター ポイントをキャプチャできます。 value パラメーターを使用して、キャプチャする Pointer インスタンスを示します。
ジェスチャを表す入力イベント ( Tapped や DoubleTapped など) は、通常、ポインターが解放された後にのみ発生するため、ジェスチャ イベントのイベント ハンドラーでポインターをキャプチャしないでください。 ジェスチャ イベントのイベント データ内の ポインター 参照は、ポインター キャプチャを開始できません。
ヒント
ポインター関連の入力イベント ハンドラーのスコープ外で CapturePointer を使用しないでください。 その時点で ポインター キャプチャが許可されているポインターに確実に関連付けられているポインターがない限り、CapturePointer 呼び出しは影響を及ぼすことはありません。 新しいポインターを生成し、その新しい ポインター を使用して CapturePointer を呼び出す実用的な方法はありません。 ポインター関連の入力イベントのイベント データを介してシステムが提供している ポインター 参照のみを使用する必要があります。