翼度科技»论坛 编程开发 .net 查看内容

Avalonia 实现平滑拖动指定控件

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
Avalonia 实现平滑拖动指定控件

1.创建一个UserControl控件,并且添加以下代码
  1. using System;
  2. using Avalonia;
  3. using Avalonia.Controls;
  4. using Avalonia.Input;
  5. using Avalonia.Markup.Xaml;
  6. using Avalonia.Media;
  7. using Avalonia.Media.Imaging;
  8. using Avalonia.Platform;
  9. using Avalonia.Threading;
  10. using Avalonia.VisualTree;
  11. namespace Token;
  12. /// <summary>
  13. /// 实现拖动的控件
  14. /// </summary>
  15. public partial class DragControls : UserControl
  16. {
  17.     /// <summary>
  18.     /// 记录上一次鼠标位置
  19.     /// </summary>
  20.     private Point lastMousePosition;
  21.     /// <summary>
  22.     /// 用于平滑更新坐标的计时器
  23.     /// </summary>
  24.     private DispatcherTimer _timer;
  25.     /// <summary>
  26.     /// 标记是否先启动了拖动
  27.     /// </summary>
  28.     private bool isDragging = false;
  29.     /// <summary>
  30.     /// 需要更新的坐标点
  31.     /// </summary>
  32.     private PixelPoint _targetPosition;
  33.     public LoginStackPanelRight()
  34.     {
  35.         InitializeComponent();
  36.         // 添加当前控件的事件监听
  37.         PointerPressed += OnPointerPressed;
  38.         PointerMoved += OnPointerMoved;
  39.         PointerReleased += OnPointerReleased;
  40.         // 初始化计时器
  41.         _timer = new DispatcherTimer
  42.         {
  43.             Interval = TimeSpan.FromMilliseconds(10)
  44.         };
  45.         _timer.Tick += OnTimerTick;
  46.     }
  47.     /// <summary>
  48.     /// 计时器事件
  49.     /// </summary>
  50.     /// <param name="sender"></param>
  51.     /// <param name="e"></param>
  52.     private void OnTimerTick(object sender, EventArgs e)
  53.     {
  54.         var window = this.FindAncestorOfType<Window>();
  55.         if (window != null && window.Position != _targetPosition)
  56.         {
  57.             // 更新坐标
  58.             window.Position = _targetPosition;
  59.         }
  60.     }
  61.     private void InitializeComponent()
  62.     {
  63.         AvaloniaXamlLoader.Load(this);
  64.     }
  65.     private void OnPointerPressed(object sender, PointerPressedEventArgs e)
  66.     {
  67.         if (!e.GetCurrentPoint(this).Properties.IsLeftButtonPressed) return;
  68.         // 启动拖动
  69.         isDragging = true;
  70.         // 记录当前坐标
  71.         lastMousePosition = e.GetPosition(this);
  72.         e.Handled = true;
  73.         // 启动计时器
  74.         _timer.Start();
  75.     }
  76.     private void OnPointerReleased(object sender, PointerReleasedEventArgs e)
  77.     {
  78.         if (!isDragging) return;
  79.         // 停止拖动
  80.         isDragging = false;
  81.         e.Handled = true;
  82.         // 停止计时器
  83.         _timer.Stop();
  84.     }
  85.     private void OnPointerMoved(object sender, PointerEventArgs e)
  86.     {
  87.         if (!e.GetCurrentPoint(this).Properties.IsLeftButtonPressed) return;
  88.         
  89.         // 如果没有启动拖动,则不执行
  90.         if (!isDragging) return;
  91.         var currentMousePosition = e.GetPosition(this);
  92.         var offset = currentMousePosition - lastMousePosition;
  93.         var window = this.FindAncestorOfType<Window>();
  94.         if (window != null)
  95.         {
  96.             // 记录当前坐标
  97.             _targetPosition = new PixelPoint(window.Position.X + (int)offset.X,
  98.                 window.Position.Y + (int)offset.Y);
  99.         }
  100.     }
  101. }
复制代码
通过以上组件可以实现平滑拖动
效果如图

来着token的分享

来源:https://www.cnblogs.com/hejiale010426/archive/2023/02/28/17164542.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具