Avalonia 實現平滑拖動指定控制項 1.創建一個UserControl控制項,並且添加以下代碼 using System; using Avalonia; using Avalonia.Controls; using Avalonia.Input; using Avalonia.Markup.Xa ...
Avalonia 實現平滑拖動指定控制項
1.創建一個UserControl
控制項,並且添加以下代碼
using System;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Markup.Xaml;
using Avalonia.Media;
using Avalonia.Media.Imaging;
using Avalonia.Platform;
using Avalonia.Threading;
using Avalonia.VisualTree;
namespace Token;
/// <summary>
/// 實現拖動的控制項
/// </summary>
public partial class DragControls : UserControl
{
/// <summary>
/// 記錄上一次滑鼠位置
/// </summary>
private Point lastMousePosition;
/// <summary>
/// 用於平滑更新坐標的計時器
/// </summary>
private DispatcherTimer _timer;
/// <summary>
/// 標記是否先啟動了拖動
/// </summary>
private bool isDragging = false;
/// <summary>
/// 需要更新的坐標點
/// </summary>
private PixelPoint _targetPosition;
public LoginStackPanelRight()
{
InitializeComponent();
// 添加當前控制項的事件監聽
PointerPressed += OnPointerPressed;
PointerMoved += OnPointerMoved;
PointerReleased += OnPointerReleased;
// 初始化計時器
_timer = new DispatcherTimer
{
Interval = TimeSpan.FromMilliseconds(10)
};
_timer.Tick += OnTimerTick;
}
/// <summary>
/// 計時器事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnTimerTick(object sender, EventArgs e)
{
var window = this.FindAncestorOfType<Window>();
if (window != null && window.Position != _targetPosition)
{
// 更新坐標
window.Position = _targetPosition;
}
}
private void InitializeComponent()
{
AvaloniaXamlLoader.Load(this);
}
private void OnPointerPressed(object sender, PointerPressedEventArgs e)
{
if (!e.GetCurrentPoint(this).Properties.IsLeftButtonPressed) return;
// 啟動拖動
isDragging = true;
// 記錄當前坐標
lastMousePosition = e.GetPosition(this);
e.Handled = true;
// 啟動計時器
_timer.Start();
}
private void OnPointerReleased(object sender, PointerReleasedEventArgs e)
{
if (!isDragging) return;
// 停止拖動
isDragging = false;
e.Handled = true;
// 停止計時器
_timer.Stop();
}
private void OnPointerMoved(object sender, PointerEventArgs e)
{
if (!e.GetCurrentPoint(this).Properties.IsLeftButtonPressed) return;
// 如果沒有啟動拖動,則不執行
if (!isDragging) return;
var currentMousePosition = e.GetPosition(this);
var offset = currentMousePosition - lastMousePosition;
var window = this.FindAncestorOfType<Window>();
if (window != null)
{
// 記錄當前坐標
_targetPosition = new PixelPoint(window.Position.X + (int)offset.X,
window.Position.Y + (int)offset.Y);
}
}
}
通過以上組件可以實現平滑拖動
效果如圖
來著token的分享