xamarin.forms - 点击背景上的 Xamarin 表单选择器
问题描述
我在 PCL 和 android 中有一个带有此代码的自定义选择器,如下所示。
https://xamgirl.com/picker-with-right-side-icon-in-xamarin-forms/
问题是当我打开选择器并按下背景时,选择器将不会再次打开。我尝试按确定并取消选择器将正常运行并可以再次获得焦点
有没有办法处理背景点击选择器以防止它弹出,除非我点击取消或确定?
个人电脑:
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;
}
}
}
解决方案
实际上有两个 PickerRendererXamarin.Forms.Platform.Android.AppCompat.PickerRenderer
和一个基本Xamarin.Forms.Platform.Android
的,基本的有这个问题你真正需要做的就是你的 Android 渲染器:
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;
}
}
}
推荐阅读
- reactjs - 带有反应选择的反应钩子形式
- powershell - PSFTP 未知命令 - PowerShelll 批处理任务 - Putty
- aws-lambda - AWS Lambda next.js - 无法将 2MB 文件发布到 api 路由
- parsing - 使用 RowProcessor (Univocity) 解析固定宽度的文件
- python - MySql插入速度太慢
- python - 在 Windows(selenium、python)上使用 VPN 时 Chromedriver 无法启动
- php - 日期映射器不接受发送的数据,尽管它似乎是可接受的格式
- string - 批处理脚本 - 用从变量接收的另一个字符串替换字符串
- php - 如何将 cloudways CDN 集成到我的 Codeigniter 项目中
- r - R - 如何更改单个条形图的堆积条形图顺序?