- A+
所属分类:.NET技术
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的分享