如何设置 TextColor Xamarin.Forms TableSection? [英] How to set TextColor Xamarin.Forms TableSection?

查看:28
本文介绍了如何设置 TextColor Xamarin.Forms TableSection?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我喜欢在 xaml 中做尽可能多的事情,我有一个带有 TableSection 的 TableView`.

I am a fan of doing as much as possible in xaml, I have aTableView` with a TableSection.

<TableView Intent="Menu">
     <TableRoot>
          <TableSection Title="Test Section" TextColor="#FFFFFF">
                <TextCell Text="Test Item" TextColor="#FFFFFF"/>
          </TableSection>
     </TableRoot>
</TableView>

对于 TextCell TextColor="#FFFFFF" 似乎有效,但是每当我在 TableSection 上使用此属性时,我都会得到:

For TextCell TextColor="#FFFFFF" seems to work, however whenever I use this attribute on a TableSection I get this:

An unhandled exception occurred.

是否可以用xaml改变TableSection的颜色?

Is it possible to change the color of the TableSection with xaml?

推荐答案

自定义渲染器!我在这里有两篇博文:

Custom Renderers! I have two blog posts on this here:

Android:Android 上的 Xamarin.Forms TableView 节自定义标题

iOS:iOS 上的 Xamarin.Forms TableView 部分自定义标题

基本上,创建一个继承 TableView 的自定义视图,然后是实现自定义 TableViewModelRenderer 的自定义渲染器.从那里您可以覆盖方法以获取部分标题的标题视图.

Basically, create a custom view that inherits TableView, then custom renderers that implement custom TableViewModelRenderer. From there you can override methods to get the header view for the section title.

以下是 Android 可能的样子:

Here's what that might look like for Android:

public class ColoredTableViewRenderer : TableViewRenderer
{

    protected override TableViewModelRenderer GetModelRenderer(Android.Widget.ListView listView, TableView view)
    {
        return new CustomHeaderTableViewModelRenderer(Context, listView, view);
    }

    private class CustomHeaderTableViewModelRenderer : TableViewModelRenderer
    {
        private readonly ColoredTableView _coloredTableView;

        public CustomHeaderTableViewModelRenderer(Context context, Android.Widget.ListView listView, TableView view) : base(context, listView, view)
        {
            _coloredTableView = view as ColoredTableView;
        }

        public override Android.Views.View GetView(int position, Android.Views.View convertView, ViewGroup parent)
        {
            var view = base.GetView(position, convertView, parent);

            var element = GetCellForPosition(position);

            // section header will be a TextCell
            if (element.GetType() == typeof(TextCell))
            {
                try
                {
                    // Get the textView of the actual layout
                    var textView = ((((view as LinearLayout).GetChildAt(0) as LinearLayout).GetChildAt(1) as LinearLayout).GetChildAt(0) as TextView);

                    // get the divider below the header
                    var divider = (view as LinearLayout).GetChildAt(1);

                    // Set the color
                    textView.SetTextColor(_coloredTableView.GroupHeaderColor.ToAndroid());
                    textView.TextAlignment = Android.Views.TextAlignment.Center;
                    textView.Gravity = GravityFlags.CenterHorizontal;
                    divider.SetBackgroundColor(_coloredTableView.GroupHeaderColor.ToAndroid());
                }
                catch (Exception) { }
            }

            return view;
        }
    }
}

iOS 上的:

public class ColoredTableViewRenderer : TableViewRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<TableView> e)
    {
        base.OnElementChanged(e);
        if (Control == null)
            return;

        var coloredTableView = Element as ColoredTableView;
        tableView.WeakDelegate = new CustomHeaderTableModelRenderer(coloredTableView);
    }



    private class CustomHeaderTableModelRenderer : UnEvenTableViewModelRenderer
    {
        private readonly ColoredTableView _coloredTableView;
        public CustomHeaderTableModelRenderer(TableView model) : base(model)
        {
            _coloredTableView = model as ColoredTableView;
        }
        public override UIView GetViewForHeader(UITableView tableView, nint section)
        {
            return new UILabel()
            {
                Text = TitleForHeader(tableView, section),
                TextColor = _coloredTableView.GroupHeaderColor.ToUIColor(),
                TextAlignment = UITextAlignment.Center
            };
        }
    }
}

这篇关于如何设置 TextColor Xamarin.Forms TableSection?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆