Bagikan melalui


PointerRoutedEventArgs Kelas

Definisi

Berisi argumen yang dikembalikan oleh pesan peristiwa penunjuk terakhir.

public ref class PointerRoutedEventArgs sealed : RoutedEventArgs
/// [Windows.Foundation.Metadata.ContractVersion(Microsoft.UI.Xaml.WinUIContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
class PointerRoutedEventArgs final : RoutedEventArgs
[Windows.Foundation.Metadata.ContractVersion(typeof(Microsoft.UI.Xaml.WinUIContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
public sealed class PointerRoutedEventArgs : RoutedEventArgs
Public NotInheritable Class PointerRoutedEventArgs
Inherits RoutedEventArgs
Warisan
Object Platform::Object IInspectable RoutedEventArgs PointerRoutedEventArgs
Atribut

Contoh

Contoh kode berikut menunjukkan skenario 2 dari sampel Input. Kode ini menunjukkan beberapa pola penggunaan untuk manipulasi langsung menggunakan peristiwa PointerPressed, PointerReleased, PointerEntered, PointerExited, dan PointerMoved .

<StackPanel x:Name="Scenario2Output" ManipulationMode="All">
  <StackPanel Orientation="Horizontal" Margin="0,10,0,0">
    <Button x:Name="scenario2Reset" Content="Reset" 
      Margin="0,0,10,0" Click="Scenario2Reset"/>
  </StackPanel>
  <StackPanel Orientation="Horizontal" >
    <ToggleSwitch x:Name="tbPointerCapture" 
      Header="Pointer Capture" FontSize="20"/>
    <TextBlock x:Name="txtCaptureStatus" 
      Style="{StaticResource BasicTextStyle}"/>
  </StackPanel>
  <Border x:Name="bEnteredExited" Background="Red" 
    Height="300" Width="450" CornerRadius="20" 
    HorizontalAlignment="Left">
    <Grid>
      <TextBlock Style="{StaticResource BasicTextStyle}" Text="" 
        HorizontalAlignment="Center" VerticalAlignment="Center" 
        x:Name="bEnteredExitedTextBlock"/>
      <Ellipse VerticalAlignment="Bottom" Stroke="Silver" 
        StrokeDashArray="2,2" StrokeThickness="2" Margin="2" 
        x:Name="bEnteredExitedTimer" Width="20" Height="20" 
        RenderTransformOrigin="0.5,0.5">
        <Ellipse.RenderTransform >
          <RotateTransform Angle="0" />
        </Ellipse.RenderTransform>
      </Ellipse>
    </Grid>
  </Border>
</StackPanel>
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;
}

Keterangan

Dalam kebanyakan kasus, kami sarankan Anda mendapatkan info pointer melalui argumen peristiwa penangan peristiwa penunjuk.

Jika argumen peristiwa tidak secara intrinsik mengekspos detail pointer yang diperlukan oleh aplikasi Anda, Anda bisa mendapatkan akses ke data pointer yang diperluas melalui metode GetCurrentPoint dan GetIntermediatePoints dari PointerRoutedEventArgs. Gunakan metode ini untuk menentukan konteks data penunjuk.

Kelas PointerRoutedEventArgs data peristiwa digunakan untuk peristiwa ini:

Penting

Input mouse dikaitkan dengan satu penunjuk yang ditetapkan ketika input mouse pertama kali terdeteksi. Mengklik tombol mouse (kiri, roda, atau kanan) membuat hubungan sekunder antara penunjuk dan tombol itu melalui peristiwa PointerPressed . Peristiwa PointerReleased diaktifkan hanya ketika tombol mouse yang sama dilepaskan (tidak ada tombol lain yang dapat dikaitkan dengan penunjuk hingga peristiwa ini selesai). Karena asosiasi eksklusif ini, klik tombol mouse lainnya dirutekan melalui peristiwa PointerMoved . Anda dapat menguji status tombol mouse saat menangani peristiwa ini, seperti yang ditunjukkan dalam contoh berikut.

private void Target_PointerMoved(object sender, PointerRoutedEventArgs e)
{
    Pointer ptr = e.Pointer;

    // Multiple, simultaneous mouse button inputs are processed here.
    // Mouse input is associated with a single pointer assigned when 
    // mouse input is first detected. 
    // Clicking additional mouse buttons (left, wheel, or right) during 
    // the interaction creates secondary associations between those buttons 
    // and the pointer through the pointer pressed event. 
    // The pointer released event is fired only when the last mouse button 
    // associated with the interaction (not necessarily the initial button) 
    // is released. 
    // Because of this exclusive association, other mouse button clicks are 
    // routed through the pointer move event.          
    if (ptr.PointerDeviceType == PointerDeviceType.Mouse)
    {
        // To get mouse state, we need extended pointer details.
        // We get the pointer info through the getCurrentPoint method
        // of the event argument. 
        PointerPoint ptrPt = e.GetCurrentPoint(Target);
        if (ptrPt.Properties.IsLeftButtonPressed)
        {
            eventLog.Text += "\nLeft button: " + ptrPt.PointerId;
        }
        if (ptrPt.Properties.IsMiddleButtonPressed)
        {
            eventLog.Text += "\nWheel button: " + ptrPt.PointerId;
        }
        if (ptrPt.Properties.IsRightButtonPressed)
        {
            eventLog.Text += "\nRight button: " + ptrPt.PointerId;
        }
    }

    // Prevent most handlers along the event route from handling the same event again.
    e.Handled = true;

    // Display pointer details.
    updateInfoPop(e);
}

Peristiwa tertentu sering memiliki informasi yang tersedia di berbagai perangkat penunjuk dan kelas titik penunjuk yang terutama hanya relevan untuk peristiwa tersebut. Misalnya, saat Anda menangani PointerWheelChanged, Anda mungkin tertarik dengan MouseWheelDelta dari PointerPointProperties.

Objek yang diambil oleh GetCurrentPoint metode dan GetIntermediatePoints menyediakan akses ke info pointer yang diperluas melalui properti Properti , yang mendapatkan objek PointerPointProperties .

Dalam contoh berikut, kita mendapatkan properti pointer yang diperluas melalui objek PointerPoint dan PointerPointProperties . (Lihat Menangani input penunjuk untuk contoh lengkap.)

String queryPointer(PointerPoint ptrPt)
{
    String details = "";

    switch (ptrPt.PointerDeviceType)
    {
        case PointerDeviceType.Mouse:
            details += "\nPointer type: mouse";
            break;
        case PointerDeviceType.Pen:
            details += "\nPointer type: pen";
            if (ptrPt.IsInContact)
            {
                details += "\nPressure: " + ptrPt.Properties.Pressure;
                details += "\nrotation: " + ptrPt.Properties.Orientation;
                details += "\nTilt X: " + ptrPt.Properties.XTilt;
                details += "\nTilt Y: " + ptrPt.Properties.YTilt;
                details += "\nBarrel button pressed: " + ptrPt.Properties.IsBarrelButtonPressed;
            }
            break;
        case PointerDeviceType.Touch:
            details += "\nPointer type: touch";
            details += "\nrotation: " + ptrPt.Properties.Orientation;
            details += "\nTilt X: " + ptrPt.Properties.XTilt;
            details += "\nTilt Y: " + ptrPt.Properties.YTilt;
            break;
        default:
            details += "\nPointer type: n/a";
            break;
    }

    GeneralTransform gt = Target.TransformToVisual(panel);
    Point screenPoint;

    screenPoint = gt.TransformPoint(new Point(ptrPt.Position.X, ptrPt.Position.Y));
    details += "\nPointer Id: " + ptrPt.PointerId.ToString() +
        "\nPointer location (parent): " + ptrPt.Position.X + ", " + ptrPt.Position.Y +
        "\nPointer location (screen): " + screenPoint.X + ", " + screenPoint.Y;
    return details;
}

Biasanya, objek yang dikembalikan oleh metode ini digunakan untuk menyalurkan data penunjuk ke GestureRecognizer. Skenario lain adalah mendapatkan MouseWheelDelta untuk peristiwa PointerWheelChanged ; nilai tersebut ada di PointerPointProperties.

Properti

Handled

Mendapatkan atau menetapkan nilai yang menandai peristiwa yang dirutekan sebagai ditangani, dan mencegah sebagian besar handler di sepanjang rute peristiwa menangani peristiwa yang sama lagi.

IsGenerated

Mendapatkan nilai yang menunjukkan apakah peristiwa pointer terjadi dari interaksi langsung dengan objek oleh pengguna, atau dihasilkan oleh platform berdasarkan perubahan pada UI aplikasi.

KeyModifiers

Mendapatkan nilai yang menunjukkan pengubah kunci mana yang aktif pada saat peristiwa penunjuk dimulai.

OriginalSource

Mendapatkan referensi ke objek yang menaikkan peristiwa. Ini sering menjadi bagian templat dari kontrol daripada elemen yang dideklarasikan di antarmuka pengguna aplikasi Anda.

(Diperoleh dari RoutedEventArgs)
Pointer

Mendapatkan referensi ke token penunjuk.

Metode

GetCurrentPoint(UIElement)

Mengambil objek PointerPoint yang menyediakan info dasar tentang penunjuk yang terkait dengan peristiwa tersebut.

GetIntermediatePoints(UIElement)

Mengambil kumpulan objek PointerPoint yang mewakili riwayat penunjuk dari peristiwa penunjuk terakhir hingga dan termasuk peristiwa penunjuk saat ini. Setiap PointerPoint dalam koleksi menyediakan info dasar tentang penunjuk yang terkait dengan peristiwa tersebut. Item terakhir dalam koleksi setara dengan objek PointerPoint yang dikembalikan oleh GetCurrentPoint.

Berlaku untuk

Lihat juga