xamarin表单自定义渲染选择器

xamarin表单自定义渲染选择器,xamarin,xamarin.forms,picker,renderer,Xamarin,Xamarin.forms,Picker,Renderer,我创建了一个自定义选择器,以便有一个控件,该控件具有一个具有厚度的框架、一个清除按钮和一个箭头按钮 public类BorderlessPicker:Picker { 公共静态BindableProperty CornerRadiusProperty= 创建(nameof(CornerRadius)、typeof(int)、typeof(BorderlessPicker)、0); 公共静态BindableProperty BorderThicknessProperty= 创建(nameof(Bo

我创建了一个自定义选择器,以便有一个控件,该控件具有一个具有厚度的框架、一个清除按钮和一个箭头按钮

public类BorderlessPicker:Picker
{
公共静态BindableProperty CornerRadiusProperty=
创建(nameof(CornerRadius)、typeof(int)、typeof(BorderlessPicker)、0);
公共静态BindableProperty BorderThicknessProperty=
创建(nameof(BorderThickness)、typeof(int)、typeof(BorderlessPicker)、0);
公共静态BindableProperty PaddingProperty=
创建(nameof(Padding)、typeof(Thickness)、typeof(BorderlessPicker)、newthickness(5));
公共静态BindableProperty BorderColorProperty=
创建(nameof(BorderColor)、typeof(Color)、typeof(BorderlessPicker)、Color.Transparent);
公共静态只读BindableProperty ImageProperty=
创建(nameof(Image)、typeof(string)、typeof(BorderlessPicker)、string.Empty);
公共字符串图像
{
获取{return(string)GetValue(ImageProperty);}
set{SetValue(ImageProperty,value);}
}
公共半径
{
get=>(int)GetValue(CornerRadiusProperty);
set=>SetValue(CornerRadiusProperty,值);
}
公共int边界厚度
{
get=>(int)GetValue(BorderThicknessProperty);
set=>SetValue(BorderThicknessProperty,value);
}
公共颜色边框颜色
{
get=>(颜色)GetValue(BorderColorProperty);
set=>SetValue(BorderColorProperty,value);
}
/// 
///无法在iOS运行时更改此属性。
/// 
公共厚度填料
{
get=>(厚度)GetValue(填充属性);
set=>SetValue(PaddingProperty,value);
}
公共边界Spicker()
{
this.BackgroundColor=Color.Transparent;
}
}
自定义渲染器以清除背景:

  public class BorderlessPickerRenderer : PickerRenderer
{
    public BorderlessPickerRenderer(Context context) : base(context)
    {
    }
    protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
    {            
        base.OnElementChanged(e);
        if (e.OldElement == null)
        {
            Control.Background = null;
        }
    }

}
公共类无边框SpickerEnder:PickerEnder
{
公共无边框SpickerEnder(上下文):基础(上下文)
{
}
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{            
基础。一个要素发生变化(e);
if(e.OldElement==null)
{
Control.Background=null;
}
}
}
当我打开选择器时,我会得到一个“半屏幕”列表,其中大部分项目都隐藏在用户面前。 大概是这样的:

我想要的是,当我打开选择器时,我会得到默认的“全屏”:


可能吗?

一切皆有可能,但定制意味着更多的工作

在Android上,
Picker
基于Android的
Picker
控件,在iOS上,它是
UIPickerView
UITextField
链接在一起的组合

因此,如果您想更改当前的
选择器
,它将受到这些底层控件可能的限制。你的要求在这方面是不可能的


但是,没有人阻止您使用按钮(或其他控件)打开全屏弹出窗口,您可以在其中选择值。

一切都是可能的,但定制意味着更多的工作

在Android上,
Picker
基于Android的
Picker
控件,在iOS上,它是
UIPickerView
UITextField
链接在一起的组合

因此,如果您想更改当前的
选择器
,它将受到这些底层控件可能的限制。你的要求在这方面是不可能的


但是,没有人阻止您使用按钮(或其他控件)打开全屏弹出窗口,您可以在其中拾取值。

您必须使用AppCompact PickerRenderer

public class BorderlessPickerRenderer : Xamarin.Forms.Platform.Android.AppCompat.PickerRenderer
    {
        public BorderlessPickerRenderer(Context context) : base(context)
        {
        }

        protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
        {
            base.OnElementChanged(e);
            Control.Background = null;
        }

    }
公共类无边框SpickerEnder:Xamarin.Forms.Platform.Android.AppCompat.PickerEnder
{
公共无边框SpickerEnder(上下文):基础(上下文)
{
}
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
Control.Background=null;
}
}

您必须使用AppCompact PickerRenderer

public class BorderlessPickerRenderer : Xamarin.Forms.Platform.Android.AppCompat.PickerRenderer
    {
        public BorderlessPickerRenderer(Context context) : base(context)
        {
        }

        protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
        {
            base.OnElementChanged(e);
            Control.Background = null;
        }

    }
公共类无边框SpickerEnder:Xamarin.Forms.Platform.Android.AppCompat.PickerEnder
{
公共无边框SpickerEnder(上下文):基础(上下文)
{
}
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
Control.Background=null;
}
}

请接受答案,如果有效请投票请接受答案,如果有效请投票