c# - Xamarin.Forms - 按钮按下和释放事件

标签 c# events cross-platform xamarin.forms

我想在按钮按下和释放时触发我的事件,但我只能在 Xamarin.Forms 中找到Click 事件。

我相信必须有一些解决方法才能获得此功能。我的基本需求是在按下按钮时启动进程,在释放按钮时停止。这似乎是一个非常基本的功能,但 Xamarin.Forms 目前没有。

我在按钮上尝试了 TapGestureRecognizer,但按钮仅触发点击事件。

MyButton.Clicked += (sender, args) =>
{
  Log.V(TAG, "CLICKED");
};

var tapGestureRecognizer = new TapGestureRecognizer();
tapGestureRecognizer.Tapped += (s, e) => {
    Log.V(TAG, "TAPPED");
};
MyButton.GestureRecognizers.Add(tapGestureRecognizer);

请记住,我需要这些事件在 Android 和 iOS 中一起工作。

最佳答案

最后我得到了@Jason建议的解决方案。我们开始...

  1. 在 PCL 项目中使用事件创建 Xamarin.Forms.Button 的子类 处理能力

    public class CustomButton : Button
    {
        public event EventHandler Pressed;
        public event EventHandler Released;
    
        public virtual void OnPressed()
        {
          Pressed?.Invoke(this, EventArgs.Empty);
        }
    
        public virtual void OnReleased()
        {
          Released?.Invoke(this, EventArgs.Empty);
        }
    }
    
  2. 在各自的项目中创建平台特定的按钮渲染器

    对于安卓

    [assembly: ExportRenderer(typeof(Button), typeof(CustomButtonRenderer))]
    namespace WalkieTalkie.Droid.Renderer
    {
        public class CustomButtonRenderer : ButtonRenderer
        {
            protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Button> e)
            {
                base.OnElementChanged(e);
    
                var customButton = e.NewElement as CustomButton;
    
                var thisButton = Control as Android.Widget.Button;
                thisButton.Touch += (object sender, TouchEventArgs args) =>
                {
                    if (args.Event.Action == MotionEventActions.Down)
                    {
                        customButton.OnPressed();
                    }
                    else if (args.Event.Action == MotionEventActions.Up)
                    {
                        customButton.OnReleased();
                    }
                };
            }
        }
    }
    

    iOS 版

    [assembly: ExportRenderer(typeof(CustomButton), typeof(CustomButtonRenderer))]
    namespace WalkieTalkie.iOS.Renderer
    {
        public class CustomButtonRenderer : ButtonRenderer
        {
            protected override void    OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Button> e)
            {
                base.OnElementChanged(e);
    
                var customButton = e.NewElement as CustomButton;
    
                var thisButton = Control as UIButton;
                thisButton.TouchDown += delegate
                {
                    customButton.OnPressed();
                };
                thisButton.TouchUpInside += delegate
                {
                    customButton.OnReleased();
                };
            }
        }
    }
    
  3. 在您的页面中实例化您的自定义按钮

    var myButton = new CustomButton
    {
        Text = "CustomButton",
        HorizontalOptions = LayoutOptions.FillAndExpand
    };
    myButton.Pressed += (sender, args) =>
    {
        System.Diagnostics.Debug.WriteLine("Pressed");
    };
    myButton.Released += (sender, args) =>
    {
         System.Diagnostics.Debug.WriteLine("Pressed");
    };
    

希望这对某人有帮助:)

关于c# - Xamarin.Forms - 按钮按下和释放事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38803157/

相关文章:

c# - 获取最近的 N 个文件并删除其余文件

c# - 使用 C# 和 ODP.NET 执行 Oracle 事务

c# - 如何在 C# 中实现抽象事件或接口(interface)方法事件?

angularjs - $rootScope.$on 与 $scope.$on 之间的区别

vb.net - 有什么方法可以清除对 VB.NET 中事件的订阅吗?

internet-explorer - W3C 验证的 CSS 是否自动意味着跨浏览器兼容性?

c# - 从文件夹中删除文件的单元测试方法

c# - 如何在 C# 中将列表添加到匿名对象?

c# - C# 中的加密是单声道跨平台吗?

json - 使用 Rest Api 的 Xamarin 中的 ListView