UIElement.CapturePointer(Pointer) Metodo
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Imposta l'acquisizione del puntatore su un oggetto UIElement. Dopo l'acquisizione, solo l'elemento con acquisizione genera eventi correlati al puntatore.
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
Parametri
- value
- Pointer
Riferimento all'oggetto puntatore.
Restituisce
bool
true se l'oggetto ha l'acquisizione del puntatore; in caso contrario, false.
Esempio
Questo esempio mostra la chiamata di CapturePointer in base alla gestione di PointerPressed. Mostra anche un modello per il rilevamento e il conteggio dei riferimenti del puntatore.
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
Commenti
È possibile acquisire correttamente il puntatore solo se il puntatore si trova in uno stato premuto (Pointer.IsInContact deve essere true). Ciò che fisicamente costituisce la pressione varia in base al tipo di dispositivo del puntatore (pulsante del mouse premuto, tocco verso il basso, stilo in contatto). Se si tenta di acquisire un puntatore che non viene premuto o quando il puntatore è stato premuto in precedenza ma viene rilasciato, CapturePointer restituisce false. Le acquisizioni esistenti non sono interessate da una chiamata capturePointer che ha restituito false.
In genere si acquisisce il puntatore all'interno di un gestore eventi PointerPressed . L'istanza del puntatore ottenuta dai dati dell'evento PointerRoutedEventArgs del gestore PointerPressed è il valore da passare per il parametro value quando si chiama CapturePointer dal codice del gestore.
In genere si acquisisce il puntatore perché si vuole che l'azione del puntatore corrente avvii un comportamento nell'app. In questo caso in genere non si vuole che altri elementi gestisca altri eventi provenienti dalle azioni del puntatore, fino a quando il comportamento non viene completato o annullato rilasciando l'acquisizione del puntatore. Se viene acquisito un puntatore, solo l'elemento con acquisizione ottiene gli eventi di input del puntatore e altri elementi non generano eventi anche se il puntatore si sposta nei limiti. Si consideri ad esempio un'interfaccia utente con due elementi adiacenti. In genere, se il puntatore è stato spostato da un elemento all'altro, si otterrà prima gli eventi PointerMoved dal primo elemento e quindi dal secondo elemento. Tuttavia, se il primo elemento ha acquisito il puntatore, il primo elemento continua a ricevere eventi PointerMoved anche se il puntatore acquisito lascia i limiti. Inoltre, il secondo elemento non genera eventi PointerEntered per un puntatore acquisito quando il puntatore acquisito lo immette.
Lo stato di acquisizione del puntatore e la generazione degli eventi correlati all'acquisizione del puntatore non è interamente fino al codice dell'app. Se l'utente rilascia il puntatore, che genera un evento PointerReleased e i puntatori associati a tale puntatore vengono persi. Viene attivato anche PointerCaptureLost sull'elemento di acquisizione originale.
Nella maggior parte dei casi l'acquisizione del puntatore verrà rilasciata automaticamente quando l'utente completa un'azione di input che rilascia l'acquisizione del puntatore precedente (sollevando un punto di tocco, rilasciando il pulsante sinistro del mouse, rimuovendo lo stilo dall'intervallo). Un'altra condizione che potrebbe rilasciare l'acquisizione è qualsiasi azione che genera anche un evento PointerCanceled . L'app in genere può basarsi sul comportamento di rilascio dell'acquisizione associato alle azioni di input dell'utente, senza dover annullare in modo specifico un'acquisizione del puntatore con ReleasePointerCaptures o ReleasePointerCaptures. Per altre info, vedi Interazioni tramite mouse.
Il metodo CapturePointer restituirà false se il puntatore è già stato acquisito.
Un UIElement può acquisire più di un punto puntatore alla volta. Usare il parametro value per indicare l'istanza del puntatore che si vuole acquisire.
Gli eventi di input che rappresentano movimenti (ad esempio Tapped o DoubleTapped) vengono in genere attivati solo dopo il rilascio di un puntatore, quindi non è consigliabile tentare di acquisire un puntatore nei gestori eventi per gli eventi di movimento. Il riferimento puntatore nei dati dell'evento per gli eventi di movimento non potrà avviare un'acquisizione del puntatore.
Suggerimento
Non provare a usare CapturePointer all'esterno dell'ambito dei gestori eventi di input pertinenti al puntatore. A meno che non si disponga di un puntatore che si è certi che sia associato a un puntatore autorizzato ad avere l'acquisizione del puntatore in quel momento, la chiamata di CapturePointer non avrà alcun effetto. Non esiste un modo pratico per generare un nuovo puntatore e chiamare CapturePointer usando quel nuovo puntatore. È consigliabile usare solo il puntatore che fa riferimento al sistema tramite i dati dell'evento degli eventi di input correlati al puntatore.