【问题标题】:Xamarin forms picker on background clicked单击背景上的 Xamarin 表单选择器
【发布时间】:2019-08-30 18:09:10
【问题描述】:

我在 PCL 和 android 中有一个带有此代码的自定义选择器,如下所示。

https://xamgirl.com/picker-with-right-side-icon-in-xamarin-forms/

问题是当我打开选择器并按下背景时,选择器将不会再次打开。我尝试按确定并取消选择器将正常运行并可以再次获得焦点

有没有办法处理背景点击选择器以防止它弹出,除非我点击取消或确定?

PCL:

   using Xamarin.Forms;

namespace AppXamarin
{
    public class CustomPicker : Picker
    {
        public static readonly BindableProperty ImageProperty =
            BindableProperty.Create(nameof(Image), typeof(string), typeof(CustomPicker), string.Empty);
        public string Image
        {
            get { return (string)GetValue(ImageProperty); }
            set { SetValue(ImageProperty, value); }
        }
    }
}

安卓:

using Android.Content;
using Android.Graphics;
using Android.Graphics.Drawables;
using Android.Support.V4.Content;
using AppXamarin;
using AppXamarin.Droid;
using Plugin.CurrentActivity;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly: ExportRenderer(typeof(CustomPicker), typeof(CustomPickerRenderer))]
namespace AppXamarin.Droid
{
    public class CustomPickerRenderer : PickerRenderer
    {
        CustomPicker element;
        public CustomPickerRenderer(Context context) : base(context)
        {
            AutoPackage = false;
        }

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

            element = (CustomPicker)this.Element;

            if (Control != null && this.Element != null && !string.IsNullOrEmpty(element.Image))
            {
                Control.Background = AddPickerStyles(element.Image);   
            }
        }
        public LayerDrawable AddPickerStyles(string imagePath)
        {
            ShapeDrawable border = new ShapeDrawable();
            border.Paint.Color = Android.Graphics.Color.Gray;
            border.SetPadding(10, 10, 10, 10);
            border.Paint.SetStyle(Paint.Style.Stroke);

            Drawable[] layers = { border, GetDrawable(imagePath) };
            LayerDrawable layerDrawable = new LayerDrawable(layers);
            layerDrawable.SetLayerInset(0, 0, 0, 0, 0);

            return layerDrawable;
        }
        private BitmapDrawable GetDrawable(string imagePath)
        {
            //int resID = Resources.GetIdentifier(imagePath, "drawable", this.Context.PackageName);
            var drawable = Resources.GetDrawable(imagePath);
            var bitmap = ((BitmapDrawable)drawable).Bitmap;
            var result = new BitmapDrawable(Resources, Bitmap.CreateScaledBitmap(bitmap, 70, 70, true));
            result.Gravity = Android.Views.GravityFlags.CenterVertical;
            return result;
        }

    }
}

【问题讨论】:

  • 添加你的代码让我看看
  • 我的代码与我的问题中的 URL 相同,但我用 PCL 和 android 渲染的代码编辑了我的问题
  • 所以发生的情况是,您单击它打开的选择器,而下次单击它时却没有?
  • 第一次点击打开,点击确定或取消,下次点击正常打开。但是当我点击选择器的背景时,它会关闭,当我再次尝试打开它时,它不会打开。如果您感到困惑,我可以尝试改写我所说的
  • 我了解你的问题,是在安卓还是iOS中都发生了

标签: xamarin.forms custom-controls picker


【解决方案1】:

实际上有两个 PickerRenderer 的Xamarin.Forms.Platform.Android.AppCompat.PickerRenderer 和基本的Xamarin.Forms.Platform.Android 一个,基本的有这个问题你真正需要做的就是你的Android Renderer:

using Android.Content;
using Android.Graphics;
using Android.Graphics.Drawables;
using Xamarin.Forms.Platform.Android;
using AppXamarin;
using AppXamarin.Droid;
using Plugin.CurrentActivity;
using Xamarin.Forms;


[assembly: ExportRenderer(typeof(CustomPicker), typeof(CustomPickerRenderer))]
namespace AppXamarin.Droid
{
     public class CustomPickerRenderer : Xamarin.Forms.Platform.Android.AppCompat.PickerRenderer
    {
        private CustomPicker element;
        public CustomPickerRenderer(Context context) : base(context)
        {
            AutoPackage = false;
        }
        protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
        {
            base.OnElementChanged(e);
            element = (CustomPicker)this.Element;

            if (Control != null && this.Element != null && !string.IsNullOrEmpty(element.Image))
            {
                Control.Background = AddPickerStyles(element.Image);
            }
        }
        public LayerDrawable AddPickerStyles(string imagePath)
        {
            ShapeDrawable border = new ShapeDrawable();
            border.Paint.Color = Android.Graphics.Color.Gray;
            border.SetPadding(10, 10, 10, 10);
            border.Paint.SetStyle(Paint.Style.Stroke);

            Drawable[] layers = { border, GetDrawable(imagePath) };
            LayerDrawable layerDrawable = new LayerDrawable(layers);
            layerDrawable.SetLayerInset(0, 0, 0, 0, 0);

            return layerDrawable;
        }
        private BitmapDrawable GetDrawable(string imagePath)
        {
            //int resID = Resources.GetIdentifier(imagePath, "drawable", this.Context.PackageName);
            var drawable = Resources.GetDrawable(imagePath);
            var bitmap = ((BitmapDrawable)drawable).Bitmap;
            var result = new BitmapDrawable(Resources, Bitmap.CreateScaledBitmap(bitmap, 70, 70, true));
            result.Gravity = Android.Views.GravityFlags.CenterVertical;
            return result;
        }
    }
}

【讨论】:

  • 这个:Xamarin.Forms.Platform.Android.AppCompat.PickerRenderer 给我错误:“onElementChanged”和“var drawable = Resources.GetDrawable(imagePath);”无法修复的
  • 更新看看
【解决方案2】:

我刚刚通过降级我的 Xamarin.Forms 版本解决了这个问题,我安装了一个预发布版本。谢谢大家的帮助!

【讨论】:

  • 你降级到了哪个版本?
  • 到版本:3.4.0.1008975
【解决方案3】:

只继承跟随,对我来说很好用

公共类 CustomPickerRenderer:Xamarin.Forms.Platform.Android.AppCompat.PickerRenderer

【讨论】:

    猜你喜欢
    • 2014-02-18
    • 2015-12-04
    • 2019-07-04
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 2018-02-01
    相关资源
    最近更新 更多