csharpc-sharpdotnetxamlavaloniauicross-platformcross-platform-xamlavaloniaguimulti-platformuser-interfacedotnetcore
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
82 lines
2.5 KiB
82 lines
2.5 KiB
using System;
|
|
using Avalonia.Controls;
|
|
using Avalonia.Input;
|
|
using Avalonia.Markup.Xaml;
|
|
|
|
namespace ControlCatalog.Pages;
|
|
|
|
public class PointersPage : UserControl
|
|
{
|
|
public PointersPage()
|
|
{
|
|
this.InitializeComponent();
|
|
|
|
var border1 = this.Get<Border>("BorderCapture1");
|
|
var border2 = this.Get<Border>("BorderCapture2");
|
|
|
|
border1.PointerPressed += Border_PointerPressed;
|
|
border1.PointerReleased += Border_PointerReleased;
|
|
border1.PointerCaptureLost += Border_PointerCaptureLost;
|
|
border1.PointerMoved += Border_PointerUpdated;
|
|
border1.PointerEntered += Border_PointerUpdated;
|
|
border1.PointerExited += Border_PointerUpdated;
|
|
|
|
border2.PointerPressed += Border_PointerPressed;
|
|
border2.PointerReleased += Border_PointerReleased;
|
|
border2.PointerCaptureLost += Border_PointerCaptureLost;
|
|
border2.PointerMoved += Border_PointerUpdated;
|
|
border2.PointerEntered += Border_PointerUpdated;
|
|
border2.PointerExited += Border_PointerUpdated;
|
|
}
|
|
|
|
private void Border_PointerUpdated(object? sender, PointerEventArgs e)
|
|
{
|
|
if (sender is Border border && border.Child is TextBlock textBlock)
|
|
{
|
|
var position = e.GetPosition(border);
|
|
textBlock.Text = @$"Type: {e.Pointer.Type}
|
|
Captured: {e.Pointer.Captured == sender}
|
|
PointerId: {e.Pointer.Id}
|
|
Position: {(int)position.X} {(int)position.Y}";
|
|
e.Handled = true;
|
|
}
|
|
}
|
|
|
|
private void Border_PointerCaptureLost(object? sender, PointerCaptureLostEventArgs e)
|
|
{
|
|
if (sender is Border border && border.Child is TextBlock textBlock)
|
|
{
|
|
textBlock.Text = @$"Type: {e.Pointer.Type}
|
|
Captured: {e.Pointer.Captured == sender}
|
|
PointerId: {e.Pointer.Id}
|
|
Position: ??? ???";
|
|
e.Handled = true;
|
|
|
|
}
|
|
}
|
|
|
|
private void Border_PointerReleased(object? sender, PointerReleasedEventArgs e)
|
|
{
|
|
if (e.Pointer.Captured == sender)
|
|
{
|
|
e.Pointer.Capture(null);
|
|
e.Handled = true;
|
|
}
|
|
else if (e.Pointer.Captured is not null)
|
|
{
|
|
throw new InvalidOperationException("How?");
|
|
}
|
|
}
|
|
|
|
private void Border_PointerPressed(object? sender, PointerPressedEventArgs e)
|
|
{
|
|
e.Pointer.Capture(sender as Border);
|
|
e.Handled = true;
|
|
e.PreventGestureRecognition();
|
|
}
|
|
|
|
private void InitializeComponent()
|
|
{
|
|
AvaloniaXamlLoader.Load(this);
|
|
}
|
|
}
|
|
|