.NET MAUI根据条件更改选择器项的颜色

zour9fqk  于 2023-10-21  发布在  .NET
关注(0)|答案(1)|浏览(188)

你能改变拾荒者特定物品的颜色吗?
我目前有一个选择器,这是一个小数列表。我想一些值有红色,如果值是高于或低于一定的数字。和中间的值以具有默认颜色。
这是可能的,或者我应该使用CollectionView代替?

b09cbbtk

b09cbbtk1#

经过一番研究,我有了一个解决办法。这是一个很多的代码,所以我已经开始了一个完整的解决方案Repo
您需要的是自定义选择器控件。我们使用handler
我们需要做的是控制显示选择器项的View。每个平台都不一样。在iOS中,我们使用delegate来访问picker视图。

private class UIPickerViewDelegateEx : UIPickerViewDelegate
{
    private readonly IPicker _picker;
    private readonly UIColor[] colors;

    public UIPickerViewDelegateEx(IPicker picker)
    {
        _picker = picker;
        colors = new UIColor[]
        {
            UIColor.Green,
            UIColor.Purple,
            UIColor.Blue,
            UIColor.Yellow,
            UIColor.Magenta
        };
    }

    public override UIView GetView(UIPickerView pickerView, nint row, nint component, UIView view)
    {
        var colorIndex = row % 5;
        var color = colors[colorIndex];

        UILabel label = new UILabel
        {
            Text = _picker.GetItem((int)row),
            TextColor = color,
            BackgroundColor = UIColor.White,
            TextAlignment = UITextAlignment.Center
        };

        DispatchQueue.MainQueue.DispatchAsync(() =>
        {
            if (pickerView.ViewFor(row, component) is UILabel updatedLabel)
            {
                updatedLabel.TextColor = UIColor.Red;
                updatedLabel.BackgroundColor = UIColor.LightGray;
                updatedLabel.Font = UIFont.BoldSystemFontOfSize(label.Font.PointSize);
            }
        });

        return label;
    }

    public override void Selected(UIPickerView pickerView, nint row, nint component)
    {
        _picker.SelectedIndex = (int)row;
    }
}

在Android中,MAUI团队使用了AppCompatAlertDialog,而不是微调器。他们已经使它无法访问,所以我'借用'的代码,并添加了一个适配器来控制选择器项目。

private class ArrayAdapterEx : ArrayAdapter<string>
 {
     private readonly IPicker virtualView;
     private readonly Android.Graphics.Color[] colors;

     public ArrayAdapterEx(Context context, int textViewResourceId, string[] objects, IPicker virtualView) : base(context, textViewResourceId, objects)
     {
         this.virtualView = virtualView;
         colors = new Android.Graphics.Color[]
         {
             Android.Graphics.Color.Green,
             Android.Graphics.Color.Purple,
             Android.Graphics.Color.Blue,
             Android.Graphics.Color.Yellow,
             Android.Graphics.Color.Magenta
         };
     }

     public override View GetView(int position, View convertView, ViewGroup parent)
     {
         View view = base.GetView(position, convertView, parent);
         TextView textView = view.FindViewById<TextView>(Android.Resource.Id.Text1);

         var colorIndex = position % 5;
         var color = colors[colorIndex];

         var item = GetItem(position); // Exampel of how to get current item
         if (position == virtualView.SelectedIndex)
         {
             textView.SetTextColor(Colors.Red.ToPlatform());
             textView.SetBackgroundColor(Colors.LightGray.ToPlatform());
             textView.Typeface = Typeface.DefaultBold;
         }
         else
         {
             textView.SetTextColor(color);
             textView.SetBackgroundColor(Colors.White.ToPlatform());
         }

         textView.Gravity = Android.Views.GravityFlags.Center;

         return view;
     }
 }

看看Repo,看看这是不是你想要的。

相关问题