Avalonia 手势操作GestureRecognizer示例

Avalonia 手势操作GestureRecognizer示例

Avalonia是.Net跨平台的UI库,支持Windows,Linux,iOS,MacOS,Android等;
本文测试内容为使用Avalonia监控上下左右滑动手势操作动作并触发事件;
手势操作支持安卓及PC电脑,并区分长滑动和短滑动;本文代码

步骤

  1. 安装Avalonia For VS2022扩展
  2. 新建名为LRGestureRecognizer的Avalonia Cross Platform项目
  3. 将LRGestureRecognizer主工程及各个平台的启动工程改为.Net8
  4. LRGestureRecognizer工程增加如下引用
		<PackageReference Include="Prism.Avalonia" Version="8.1.97.11000" />
		<PackageReference Include="Prism.DryIoc.Avalonia" Version="8.1.97.11000" />
  1. 写代码,主要为SliderGestureRecognizer类的实现
  2. 启动及调试代码

关键代码

// MainView.axaml.cs
    public partial class MainView : UserControl
    {
        MainViewModel VM;
        public MainView()
        {
            InitializeComponent();
            VM = new MainViewModel();
            DataContext = VM;
            // mainview.GestureRecognizers.Add(new LeftRightSlideGestureRecognizer());
            mainview.GestureRecognizers.Add(new SliderGestureRecognizer());
            mainview.AddHandler(SliderGestureRecognizer.MySliderEvent, PullGestureEndedEvent_Sub);
        }

        private void PullGestureEndedEvent_Sub(object? sender, SlideEventArgs e)
        {
            if (e.Slide == SlideEventType.SlideLeft || e.Slide == SlideEventType.LongSlideLeft)
            {
                VM.Greeting = e.Slide.ToString();
            }
            else
            {
                VM.Greeting = e.Slide.ToString();
            }
            System.Diagnostics.Debug.WriteLine(e.Slide);
        }
    }
<UserControl x:Class="LRGestureRecognizer.Views.MainView"
             xmlns="https://github.com/avaloniaui"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:vm="clr-namespace:LRGestureRecognizer.ViewModels"
             x:Name="mainview"
             d:DesignHeight="450"
             d:DesignWidth="800"
             x:DataType="vm:MainViewModel"
             Background="Azure"  
             mc:Ignorable="d">
    <Design.DataContext>
        <vm:MainViewModel />
    </Design.DataContext>
	<!-- UserControl的Background必须要设置,不可为空 -->
    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding Greeting}" />
</UserControl>
// SliderGestureRecognizer.cs
 /// <summary>
 /// 全部方向都触发
 /// <para></para>
 /// </summary>
 public class SliderGestureRecognizer : GestureRecognizer
 {
     public static readonly RoutedEvent<SlideEventArgs> MySliderEvent
         = RoutedEvent.Register<SlideEventArgs>("MySliderEvent", RoutingStrategies.Bubble, typeof(Gestures));
     /// <summary>
     /// 允许鼠标触发
     /// <para>Default:true</para>
     /// </summary>
     public bool EnableMouse { get; set; }
     /// <summary>
     /// 方向
     /// <para>Default:Vector(1, 0)</para>
     /// </summary>
     public Vector Direction { get; set; }
     /// <summary>
     /// 距离 
     /// <para>Default:6</para>
     /// </summary>
     public float Distance { get; set; }
     private int _LongMultiple = 2;
     /// <summary>
     /// 长滑判断倍数
     /// <para>Default:2</para>
     /// </summary>
     public int LongMultiple
     {
         get => _LongMultiple;
         set
         {
             _LongMultiple = Math.Clamp(value, 1, 10000);
         }
     }

     public SliderGestureRecognizer()
     {
         Direction = new Vector(1, 0); // 设置手势方向为向左 
         Distance = 6;
         EnableMouse = true;
         if (LRGestureRecognizer.App.IsPCType)
         {
             LongMultiple = 3;
             Distance = 20;
         }
     }
     // 省略若干代码
}

效果

在这里插入图片描述

备注

  1. MainView.axaml的UserControl的Background一定要设置,否则没有效果
  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文光山石

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值