UIElement.CapturePointer(Pointer) Metode
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
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
Parameter
- value
- Pointer
Referensi objek penunjuk.
Mengembalikan
bool
true jika objek memiliki penunjuk tangkapan; jika tidak, salah.
Contoh
Contoh ini menunjukkan panggilan CapturePointer berdasarkan penanganan PointerPressed. Ini juga menunjukkan pola untuk melacak dan menghitung referensi pointer.
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
Keterangan
Anda hanya dapat berhasil mengambil penunjuk jika penunjuk tersebut dalam keadaan ditekan (Pointer.IsInContact harus benar). Apa yang secara fisik merupakan ditekan akan bervariasi berdasarkan jenis perangkat penunjuk (tombol mouse ditekan, titik sentuh ke bawah, stylus dalam kontak). Jika Anda mencoba mengambil penunjuk yang tidak ditekan, atau di mana penunjuk sebelumnya ditekan tetapi sekarang dirilis, CapturePointer mengembalikan false. Pengambilan yang ada tidak terpengaruh oleh panggilan CapturePointer yang mengembalikan false.
Anda biasanya menangkap penunjuk dalam penanganan aktivitas PointerPressed . Instans Pointer yang Anda dapatkan dari data peristiwa PointerRoutedEventArgs dari penangan PointerPressed Anda adalah nilai yang harus Anda berikan untuk parameter nilai saat Anda memanggil CapturePointer dari dalam kode handler Anda.
Anda biasanya mengambil penunjuk karena Anda ingin tindakan penunjuk saat ini memulai perilaku di aplikasi Anda. Dalam hal ini, Anda biasanya tidak ingin elemen lain menangani peristiwa lain yang berasal dari tindakan pointer tersebut, hingga perilaku Anda selesai atau dibatalkan dengan merilis tangkapan pointer. Jika pointer ditangkap, hanya elemen yang telah menangkap yang mendapatkan peristiwa input pointer, dan elemen lain tidak menembakkan peristiwa bahkan jika pointer bergerak ke batasnya. Misalnya, pertimbangkan UI yang memiliki dua elemen yang berdekatan. Biasanya, jika Anda memindahkan penunjuk dari satu elemen ke elemen lainnya, Anda akan terlebih dahulu mendapatkan peristiwa PointerMoved dari elemen pertama, lalu dari elemen kedua. Tetapi jika elemen pertama telah menangkap pointer, maka elemen pertama terus menerima peristiwa PointerMoved bahkan jika pointer yang ditangkap meninggalkan batasnya. Selain itu, elemen kedua tidak mengaktifkan peristiwa PointerEntered untuk penunjuk yang ditangkap saat pointer yang ditangkap memasukinya.
Status penunjuk menangkap dan menghasilkan peristiwa yang terkait dengan penangkapan pointer tidak sepenuhnya hingga kode aplikasi. Jika pengguna merilis pointer, yang menghasilkan peristiwa PointerReleased , dan penunjuk menangkap yang terkait dengan pointer tersebut akan hilang. Ini juga menembakkan PointerCaptureLost pada elemen penangkapan asli.
Dalam kebanyakan kasus, penangkapan pointer akan dilepaskan secara otomatis ketika pengguna menyelesaikan tindakan input yang melepaskan tangkapan pointer sebelumnya (mengangkat titik sentuh, melepaskan tombol mouse kiri, mengambil stylus di luar jangkauan). Kondisi lain yang mungkin merilis pengambilan adalah tindakan apa pun yang juga mengaktifkan peristiwa PointerCanceled . Aplikasi Anda biasanya dapat mengandalkan perilaku pengambilan-rilis yang terkait dengan tindakan input pengguna, tanpa harus secara khusus membatalkan tangkapan pointer dengan ReleasePointerCapture atau ReleasePointerCaptures. Untuk informasi selengkapnya, lihat Interaksi mouse.
Metode CapturePointer akan mengembalikan false jika pointer sudah diambil.
UIElement dapat menangkap lebih dari satu titik pointer pada satu waktu. Gunakan parameter nilai untuk menunjukkan instans Pointer yang ingin Anda ambil.
Peristiwa input yang mewakili gerakan (seperti Diketuk atau Di-DoubleTapped) biasanya hanya diaktifkan setelah pointer dilepaskan, jadi Anda tidak boleh mencoba menangkap penunjuk di penanganan aktivitas untuk peristiwa gerakan. Referensi Pointer dalam data peristiwa untuk peristiwa gerakan tidak akan diizinkan untuk memulai penangkapan pointer.
Tip
Jangan mencoba menggunakan CapturePointer di luar cakupan penangan peristiwa input yang relevan dengan pointer. Kecuali Anda memiliki Pointer yang Anda yakin dikaitkan dengan pointer yang diizinkan untuk memiliki penangkapan pointer pada saat itu, panggilan CapturePointer Anda tidak akan berpengaruh. Tidak ada cara praktis untuk menghasilkan Pointer baru dan memanggil CapturePointer menggunakan pointer baru tersebut. Anda hanya boleh menggunakan referensi Pointer yang disediakan sistem kepada Anda melalui data peristiwa peristiwa input terkait pointer.