UIElement.CapturePointer(Pointer) Metode

Definisi

Mengatur pengambilan pointer ke UIElement. Setelah ditangkap, hanya elemen yang telah menangkap yang akan menembakkan peristiwa terkait pointer.

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

Boolean

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.

Berlaku untuk

Lihat juga