Xamarin.Forms Cell渲染器问题

时间:2015-03-06 09:36:58

标签: android windows-phone-8 xamarin xamarin.forms renderer

自从我在1月份开始处理需要自定义渲染器的项目以来,我一直有这个问题。

我们的目标是拥有自定义列表视图 - 列表项必须在2行3列网格中显示四个重要信息: - 第1列中的第1行和第2行合并,显示单个大数字(如ImageCell中) - 第2列和第3行中的第1行显示中等字体大小的文本 - 第2列中的第2行显示字体较小的文本 - 第3列中的第2行显示字体较小的文本,与右侧对齐

现在,为此我尝试了ViewCell,但鉴于它是如何渲染和生成的,它非常慢(与例如TextCell相比,布局相同,速度慢6-7倍)。

代码如下:

PCL课程:

public class ExtendedCell : ViewCell
{
    public static readonly BindableProperty BigNumProperty = BindableProperty.Create<ExtendedCell, String>(p => p.BigNum, default(String));

    public String BigNum
    {
        get { return (String)GetValue(BigNumProperty); }
        set { SetValue(BigNumProperty, value); }
    }

    public static readonly BindableProperty TextProperty = BindableProperty.Create<ExtendedCell, String>(p => p.Text, default(String));

    public String Text
    {
        get { return (String)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }

    public static readonly BindableProperty DetailProperty = BindableProperty.Create<ExtendedCell, String>(p => p.Detail, default(String));

    public String Detail
    {
        get { return (String)GetValue(DetailProperty); }
        set { SetValue(DetailProperty, value); }
    }

    public static readonly BindableProperty DateProperty = BindableProperty.Create<ExtendedCell, String>(p => p.Date, default(String));

    public String Date
    {
        get { return (String)GetValue(DateProperty); }
        set { SetValue(DateProperty, value); }
    }



    public static readonly BindableProperty BackgroundColorProperty = BindableProperty.Create<ExtendedCell, Color>(p => p.BackgroundColor, default(Color));

    public Color BackgroundColor
    {
        get { return (Color)GetValue(BackgroundColorProperty); }
        set { SetValue(BackgroundColorProperty, value); }
    }

    public static readonly BindableProperty ForegroundColorProperty = BindableProperty.Create<ExtendedCell, Color>(p => p.ForegroundColor, default(Color));

    public Color ForegroundColor
    {
        get { return (Color)GetValue(ForegroundColorProperty); }
        set { SetValue(ForegroundColorProperty, value); }
    }



    public ExtendedCell()
    {

    }
}

WP8渲染器:

[assembly: ExportCell(typeof(ExtendedCell), typeof(ExtendedCellRenderer))]
public class ExtendedCellRenderer : ViewCellRenderer //ICellRenderer, IRegisterable
{
    public ExtendedCellRenderer()
    {

    }

    public override System.Windows.DataTemplate GetTemplate(Cell cell)
    {
        return (System.Windows.DataTemplate)App.Current.Resources["ExtendedCellTemplate"];
    }
}

Android渲染器:

[assembly:ExportCell(typeof(ExtendedCell),typeof(ExtendedCellRenderer))]
class ExtendedCellRenderer : ViewCellRenderer
{
    private Android.Views.View extendedCell;

    static ExtendedCellRenderer()
    { 

    }


    protected override Android.Views.View GetCellCore(Cell item, Android.Views.View convertView, ViewGroup parent, Context context)
    {
        var cell = (ExtendedCell)item;
        var view = convertView;

        if (view == null)
        {
            view = (context as Activity).LayoutInflater.Inflate(Resource.Layout.ExtendedCellLayout, null);
        }
        else
        {

        }

        view.FindViewById<TextView>(Resource.Id.bigNumText).Text = cell.BigNum;
        view.FindViewById<TextView>(Resource.Id.subjecText).Text = cell.Text;
        view.FindViewById<TextView>(Resource.Id.topicText).Text = cell.Detail;
        view.FindViewById<TextView>(Resource.Id.dateText).Text = cell.Date;


        return view;
    }

    protected override void OnCellPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        base.OnCellPropertyChanged(sender, e);

    }
}

在WP上,代码运行,它显示一个TextCell(在WP上,常规Cell&#39被设置为使用TextCellRenderer)。在Android上,它默认为CellRenderer,而后者则不显示任何内容。

上面的代码表示一个新状态,我在ViewCellRenderer类上创建了CellRenderers(之前它基于CellRenderer和ICell + IRegisterable)。

可能是什么问题?为什么它不起作用,我错过了一步吗?

0 个答案:

没有答案