Xamarin.forms 单击背景上的Xamarin表单选取器

Xamarin.forms 单击背景上的Xamarin表单选取器,xamarin.forms,custom-controls,picker,Xamarin.forms,Custom Controls,Picker,我有一个自定义选择器,在PCL和android中使用此代码,如下所示 问题是当我打开选择器并在后台按下时,选择器将不会再次打开。我试着按“确定”和“取消”,选择器将正常工作,并且可以再次获得焦点 是否有一种方法可以处理对选择器的背景单击,以防止其弹出,除非我单击“取消”或“确定” PCL: 安卓: using Android.Content; using Android.Graphics; using Android.Graphics.Drawables; using Android.Supp

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

问题是当我打开选择器并在后台按下时,选择器将不会再次打开。我试着按“确定”和“取消”,选择器将正常工作,并且可以再次获得焦点

是否有一种方法可以处理对选择器的背景单击,以防止其弹出,除非我单击“取消”或“确定”

PCL:

安卓:

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;
        }

    }
}
使用Android.Content;
使用Android.Graphics;
使用Android.Graphics.Drawables;
使用Android.Support.V4.Content;
使用阿普沙马林;
使用AppXamarin.Droid;
使用Plugin.CurrentActivity;
使用Xamarin.Forms;
使用Xamarin.Forms.Platform.Android;
[程序集:ExportRenderer(typeof(CustomPicker)、typeof(CustomPickerRenderer))]
名称空间AppXamarin.Droid
{
公共类CustomPickerRenderer:PickerRenderer
{
客户选择器元件;
公共CustomPickerRenderer(上下文):基础(上下文)
{
自动包装=错误;
}
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
element=(CustomPicker)this.element;
if(Control!=null&&this.Element!=null&&string.IsNullOrEmpty(Element.Image))
{
Control.Background=AddPickerStyles(element.Image);
}
}
公共层可绘制的AddPickerStyles(字符串imagePath)
{
ShapeDrawable border=新的ShapeDrawable();
border.Paint.Color=Android.Graphics.Color.Gray;
边框。设置填充(10,10,10,10);
边框.Paint.SetStyle(Paint.Style.Stroke);
Drawable[]层={border,GetDrawable(imagePath)};
LayerDrawable LayerDrawable=新的LayerDrawable(层);
layerDrawable.SetLayerSet(0,0,0,0,0);
返回层可绘制;
}
私有BitmapDrawable GetDrawable(字符串imagePath)
{
//int resID=Resources.GetIdentifier(imagePath,“drawable”,this.Context.PackageName);
var drawable=Resources.GetDrawable(imagePath);
var bitmap=((BitmapDrawable)drawable.bitmap;
var result=新的BitmapDrawable(参考资料,Bitmap.CreateScaledBitmap(Bitmap,70,70,true));
result.Gravity=Android.Views.GravityFlags.CenterVertical;
返回结果;
}
}
}

实际上有两个PickerRenderer,分别是
Xamarin.Forms.Platform.Android.AppCompat.PickerRenderer
和基本
Xamarin.Forms.Platform.Android
一个,基本的有这个问题,你实际上需要为你的Android渲染器做些什么:

使用Android.Content;
使用Android.Graphics;
使用Android.Graphics.Drawables;
使用Xamarin.Forms.Platform.Android;
使用阿普沙马林;
使用AppXamarin.Droid;
使用Plugin.CurrentActivity;
使用Xamarin.Forms;
[程序集:ExportRenderer(typeof(CustomPicker)、typeof(CustomPickerRenderer))]
名称空间AppXamarin.Droid
{
公共类CustomPickerRenderer:Xamarin.Forms.Platform.Android.AppCompat.PickerRenderer
{
私有客户选择器元素;
公共CustomPickerRenderer(上下文):基础(上下文)
{
自动包装=错误;
}
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
element=(CustomPicker)this.element;
if(Control!=null&&this.Element!=null&&string.IsNullOrEmpty(Element.Image))
{
Control.Background=AddPickerStyles(element.Image);
}
}
公共层可绘制的AddPickerStyles(字符串imagePath)
{
ShapeDrawable border=新的ShapeDrawable();
border.Paint.Color=Android.Graphics.Color.Gray;
边框。设置填充(10,10,10,10);
边框.Paint.SetStyle(Paint.Style.Stroke);
Drawable[]层={border,GetDrawable(imagePath)};
LayerDrawable LayerDrawable=新的LayerDrawable(层);
layerDrawable.SetLayerSet(0,0,0,0,0);
返回层可绘制;
}
私有BitmapDrawable GetDrawable(字符串imagePath)
{
//int resID=Resources.GetIdentifier(imagePath,“drawable”,this.Context.PackageName);
var drawable=Resources.GetDrawable(imagePath);
var bitmap=((BitmapDrawable)drawable.bitmap;
var result=新的BitmapDrawable(参考资料,Bitmap.CreateScaledBitmap(Bitmap,70,70,true));
result.Gravity=Android.Views.GravityFlags.CenterVertical;
返回结果;
}
}
}

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

只要继承下面的内容,对我来说就行了


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

添加您的代码让我看看我的代码与我问题中的URL中的代码相同,但我用PCL和Android Renders的代码编辑了我的问题,您单击选择器,它会打开,下次单击时不会打开?我第一次单击它时,当我单击“确定”或“取消”时,下次单击它时,它会正常打开。但是,当我单击选择器的背景时,它将关闭,当我再次尝试打开它时,它将不会打开。如果你感到困惑,我可以试着重新表述我所说的我理解你的问题,它是在android还是在iOS中发生的这一个:Xamarin.Forms.Platform.android.AppCompat.PickerRenderer给了我错误:“onElementChanged”和“var drawable=Resources.GetDrawable(imagePath);”无法修复更新请查看您将哪个版本降级?版本:3.4.0.1008975
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;
        }

    }
}