【问题标题】:Xamarin slider custom renderer DragCompleted eventXamarin 滑块自定义渲染器 DragCompleted 事件
【发布时间】:2019-10-09 20:22:49
【问题描述】:

我正在尝试为 Slider 控件添加一个 IOS 自定义渲染器。由于包装类 SlideriOS 事件没有触发,我需要 DragCompleted 事件。有人知道如何触发/将事件路由到控件?

[assembly: ExportRenderer(typeof(CustomGradientSlider), typeof(CustomGradientSliderRenderer))]
namespace HealMate.iOS.Renderers
{
    public class CustomGradientSliderRenderer : SliderRenderer
    {
        public CGColor StartColor { get; set; }
        public CGColor CenterColor { get; set; }
        public CGColor EndColor { get; set; }
        private UIImage GradImage { get; set; }
        public string SelectionColor1 { get; set; }
        public string SelectionColor2 { get; set; }

    protected override void OnElementChanged(ElementChangedEventArgs<Slider> e)
    {

        if (Control == null)
        {
            var customSlider = e.NewElement as CustomGradientSlider;
            StartColor = customSlider.StartColor.ToCGColor();
            CenterColor = customSlider.CenterColor.ToCGColor();
            EndColor = customSlider.EndColor.ToCGColor();


              var slider = new SlideriOS
            {
                Continuous = true,

                Height = (nfloat)customSlider.HeightRequest
            };

            SetNativeControl(slider);
            Control.ValueChanged += OnControlValueChanged;

        }

        base.OnElementChanged(e);
    }

...

   public class SlideriOS : UISlider
    {
        public nfloat Height { get; set; }

        public override CGRect TrackRectForBounds(CGRect forBounds)
        {
            var rect = base.TrackRectForBounds(forBounds);
            return new CGRect(rect.X, rect.Y, rect.Width, Height);
        }
        }
}

如何触发滑块控件的 DragCompleted 事件? 谢谢!

【问题讨论】:

  • 您好,您解决了吗。如果解决方法有帮助,请提前标记。

标签: c# ios xamarin slider custom-renderer


【解决方案1】:

有一些Events可以在UISlider中调用:

  • TouchDragExit :在 TouchDragExit 事件上引发。
  • TouchUpInside:在 TouchUpInside 事件中引发。
  • TouchUpOutside :在 TouchUpOutside 事件中引发。

您可以调用其中一个来尝试如下:

Control.TouchDragExit += Slider_TouchDragExit;

private void Slider_TouchDragExit(object sender, EventArgs e)
{
    throw new NotImplementedException();
}

====================================更新=========== ==========================

经过本地项目测试,以上三种方法仅TouchUpInside有效,未找到其他方法在iOS渲染器中无效的原因。我还在 Android 中测试了渲染器方法,它可以工作。这是一个奇怪的现象。

但是,我找到了一个解决方法来调用方法,比如拖拽结束的函数。

[assembly: ExportRenderer(typeof(CustomSlider), typeof(CustomSliderRenderer))]
namespace App8.iOS
{
    public class CustomSliderRenderer : SliderRenderer
    {

    protected override void OnElementChanged(ElementChangedEventArgs<Slider> e)
    {
        base.OnElementChanged(e);

        if (null != Control)
        {
            CustomSlider customSlider = (CustomSlider)e.NewElement;

            customSlider.DragCompleted += CustomSlider_DragCompleted;

        }
    }


    private void CustomSlider_DragCompleted(object sender, EventArgs e)
    {
        Console.WriteLine("------CustomSlider_DragCompleted-------");
    }

}

这里,CustomSlider 是我在 Xamarin.Forms 中的自定义 Slider。如果以后找到TouchDragExit不醒的原因会在这里更新。

【讨论】:

  • 感谢您的回答,有趣的是触发了 OnControlValueChanged 但从未达到 Slider_TouchDragExit。我不知道为什么。你知道我应该从哪里开始调试吗?谢谢!
  • @TheElderWisedom 很抱歉在本地项目中测试后没有在 Xamain.iOS 中使用此方法。但是有一个解决方法可以调用 Drag Complete 方法,我会更新答案。
  • @TheElderWisedom 嗨,我也在 GitHub 上提交了。也可以关注here
  • 您好,是的,感谢您的帖子,我能够解决它。您触发了我实施的想法并且似乎工作正常。我将使用我实施的解决方案更新此线程,并检查您提交到 GitHub 的帖子。
  • @TheElderWisedom 很高兴找到了解决方案。稍后分享答案时,我会参考它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-05
  • 1970-01-01
  • 2020-03-16
  • 2021-04-04
  • 2018-07-29
  • 1970-01-01
  • 2016-09-03
相关资源
最近更新 更多