Avalonia 实现平滑拖动指定控件

  • Avalonia 实现平滑拖动指定控件已关闭评论
  • 171 次浏览
  • A+
所属分类:.NET技术
摘要

1.创建一个UserControl控件,并且添加以下代码通过以上组件可以实现平滑拖动
效果如图


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);         }     } } 

通过以上组件可以实现平滑拖动
效果如图
Avalonia 实现平滑拖动指定控件

来着token的分享