Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin.forms 将占位符设置为Xamarin表单中选取项的标题_Xamarin.forms_Picker - Fatal编程技术网

Xamarin.forms 将占位符设置为Xamarin表单中选取项的标题

Xamarin.forms 将占位符设置为Xamarin表单中选取项的标题,xamarin.forms,picker,Xamarin.forms,Picker,需要一个自定义选择器,在该选择器中,一旦从选择器中选择一个项目,标题的大小就会减小,如图所示。MaterialisedEntry也会发生同样的情况,但Picker控件需要同样的情况(Xamarin.Forms不允许将自定义视图(如带有stacklayout的ContentView)插入Picker控件)。你可以做的是使用一个网格,其中你有一个堆叠布局覆盖在一个选择器上。根据选择器的SelectedItem属性,您需要更新状态标签的文本 <Grid HorizontalOptions="Ce

需要一个自定义选择器,在该选择器中,一旦从选择器中选择一个项目,标题的大小就会减小,如图所示。MaterialisedEntry也会发生同样的情况,但Picker控件需要同样的情况(Xamarin.Forms不允许将自定义视图(如带有stacklayout的ContentView)插入Picker控件)。你可以做的是使用一个网格,其中你有一个堆叠布局覆盖在一个选择器上。根据选择器的SelectedItem属性,您需要更新状态标签的文本

<Grid HorizontalOptions="Center" VerticalOptions="Center">
    <Picker x:Name="picker"
            Title="select a state">
        <Picker.ItemsSource>
            <x:Array Type="{x:Type x:String}">
                <x:String>Colorado</x:String>
                <x:String>California</x:String>
                <x:String>Ohio</x:String>
            </x:Array>
        </Picker.ItemsSource>
    </Picker>

    <StackLayout WidthRequest="300" InputTransparent="True" BackgroundColor="White">
        <Label Text="State" FontSize="10"/>
            <!--Here you would need to bind the Label Text to a property 
                that changes according to the SelectedItem of the picker-->
        <Label Text="Colorado" FontSize="14"/>
    </StackLayout>
</Grid>

科罗拉多州
加利福尼亚
俄亥俄州

根据您的描述,我建议您可以使用自定义渲染为选择器控件添加箭头,如下所示:

  • 在PLC中创建类名CustomPicker

    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); }
    }
    }
    
     <Frame
                Padding="8"
                BorderColor="Gray"
                CornerRadius="20"
                HasShadow="True"
                IsClippedToBounds="True">
                <StackLayout>
                    <Label
                        x:Name="label"
                        FontSize="20"
                        Text="state" />
                    <picker:CustomPicker
                        x:Name="picker1"
                        Title="select one item"
                        Image="ic_arrow_drop_down"
                        SelectedIndexChanged="Picker1_SelectedIndexChanged">
                        <picker:CustomPicker.Items>
                            <x:String>1</x:String>
                            <x:String>2</x:String>
                        </picker:CustomPicker.Items>
                    </picker:CustomPicker>
                </StackLayout>
            </Frame>
    
     private void Picker1_SelectedIndexChanged(object sender, EventArgs e)
        {
            var picker = sender as CustomPicker;
            if(picker.SelectedIndex>-1)
            {
                label.FontSize = 10;
            }
        }
    
  • 在Android或ios中创建类名CustomPickerRenderer

    [assembly: ExportRenderer(typeof(CustomPicker), typeof(CustomPickerRenderer))]
    namespace demo3.Droid
    {
    public class CustomPickerRenderer : PickerRenderer
    {
    CustomPicker element;
    
    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) };
        Drawable[] layers = { 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 = ContextCompat.GetDrawable(this.Context, resID);
        var bitmap = ((BitmapDrawable)drawable).Bitmap;
    
        var result = new BitmapDrawable(Resources, Bitmap.CreateScaledBitmap(bitmap, 70, 70, true));
        result.Gravity = Android.Views.GravityFlags.Right;
    
        return result;
    }
    
    }
    }
    
    [程序集:ExportRenderer(typeof(CustomPicker)、typeof(CustomPickerRenderer))]
    名称空间demo3.Droid
    {
    公共类CustomPickerRenderer:PickerRenderer
    {
    客户选择器元件;
    受保护的覆盖无效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)};
    Drawable[]层={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=ContextCompat.GetDrawable(this.Context,resID);
    var bitmap=((BitmapDrawable)drawable.bitmap;
    var result=新的BitmapDrawable(参考资料,Bitmap.CreateScaledBitmap(Bitmap,70,70,true));
    result.Gravity=Android.Views.GravityFlags.Right;
    返回结果;
    }
    }
    }
    
  • 3.在PLC中引用此customPicker

    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); }
    }
    }
    
     <Frame
                Padding="8"
                BorderColor="Gray"
                CornerRadius="20"
                HasShadow="True"
                IsClippedToBounds="True">
                <StackLayout>
                    <Label
                        x:Name="label"
                        FontSize="20"
                        Text="state" />
                    <picker:CustomPicker
                        x:Name="picker1"
                        Title="select one item"
                        Image="ic_arrow_drop_down"
                        SelectedIndexChanged="Picker1_SelectedIndexChanged">
                        <picker:CustomPicker.Items>
                            <x:String>1</x:String>
                            <x:String>2</x:String>
                        </picker:CustomPicker.Items>
                    </picker:CustomPicker>
                </StackLayout>
            </Frame>
    
     private void Picker1_SelectedIndexChanged(object sender, EventArgs e)
        {
            var picker = sender as CustomPicker;
            if(picker.SelectedIndex>-1)
            {
                label.FontSize = 10;
            }
        }
    
    
    1.
    2.
    私有无效选择器1\u SelectedIndexChanged(对象发送方,事件参数e)
    {
    var picker=发送方作为CustomPicker;
    如果(选择器。选择索引>-1)
    {
    label.FontSize=10;
    }
    }
    
    这是屏幕截图:


    我不太清楚这里的确切问题是什么。如何在pickercontrol中添加“State”文本,以便让picker中有两行?第一个是
    状态
    ,第二个是状态本身?是否有任何理由说明
    state
    不能只是选择器的标签?