有没有办法可以将样式请求传递给Xamarin Label Custom渲染器?

2 xamarin xamarin.forms

到目前为止我想出了这个代码.我的问题是我想将一个样式传递给渲染器,我不知道如何传递一个styleId.

public class LabelBodyCustomRenderer : LabelRenderer
{
    public LabelBodyCustomRenderer()
    {
    }

    protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
    {
        base.OnElementChanged(e);
        if (Control != null)
            Control.Font = UIFont.GetPreferredFontForTextStyle(UIFontTextStyle.Body);

    }

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

        if (e.PropertyName == Label.TextColorProperty.PropertyName
                || e.PropertyName == Label.FontProperty.PropertyName
                || e.PropertyName == Label.TextProperty.PropertyName
                || e.PropertyName == Label.FormattedTextProperty.PropertyName)
        {
            switch (e.StyleId)
            {
                case "Body":
                    Control.Font = UIFont.GetPreferredFontForTextStyle(UIFontTextStyle.Body);
                    break;
                case "Callout":
                    Control.Font = UIFont.GetPreferredFontForTextStyle(UIFontTextStyle.Callout);
                    break;
                case "Caption1":
                    Control.Font = UIFont.GetPreferredFontForTextStyle(UIFontTextStyle.Caption1);
                    break;
                case "Caption2":
                    Control.Font = UIFont.GetPreferredFontForTextStyle(UIFontTextStyle.Caption2);
                    break;
                case "Footnote":
Run Code Online (Sandbox Code Playgroud)

我看到了另一个例子,它是这样做的,代码使用了item.StyleId.但是,这是从标签上呈现完全不同的,所以我很感兴趣,看看类似的东西可以为上述将为labelRenderer来完成:

public class TextCellCustomRenderer : TextCellRenderer
{
    CellTableViewCell cell;
    public override UITableViewCell GetCell(Cell item, UITableViewCell reusableCell, UITableView tv)
    {
        var textCell = (TextCell)item;
        var fullName = item.GetType().FullName;
        cell = tv.DequeueReusableCell(fullName) as CellTableViewCell;

        if (cell == null)
        {
            cell = new CellTableViewCell(UITableViewCellStyle.Value1, fullName);
        }
        else
        {
            cell.Cell.PropertyChanged -= cell.HandlePropertyChanged;
            //cell.Cell.PropertyChanged -= Current_PropertyChanged;
        }
Run Code Online (Sandbox Code Playgroud)

Yur*_*i S 5

创建一个派生自Label - MyLabel的类.将绑定属性MyStyleId添加到MyLabel.更新渲染器以渲染MyLabel而不是所有标签.

MyLabel类

    public class MyLabel : Label
    {
        public static readonly BindableProperty MyStyleIdProperty =
                BindableProperty.Create("MyStyleId", typeof(string), typeof(MyLabel), "Body");

        public string MyStyleId
        {
            get { return (string)GetValue(MyStyleIdProperty); }
        }
    }
Run Code Online (Sandbox Code Playgroud)

XAML

 <local:MyLabel MyStyleId="Header" Text="Custom Label"></local:MyLabel>
Run Code Online (Sandbox Code Playgroud)

别忘了定义你的"本地"

xmlns:local="clr-namespace:ButtonRendererDemo;assembly=ButtonRendererDemo"
Run Code Online (Sandbox Code Playgroud)

渲染

[assembly: ExportRenderer(typeof(MyLabel), typeof(MyLabelRenderer))]
namespace ButtonRendererDemo.iOS
{
    public class MyLabelRenderer : LabelRenderer
    {

        //protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
        //{
        //    base.OnElementChanged(e);

        //    if (e.NewElement != null)
        //    {
        //        var label =  e.NewElement as MyLabel;
        //        if (label != null) //sanity check
        //        {
        //            var styleId = label.MyStyleId;
        //        }
        //    }
        //}

        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);

            if (e.PropertyName == "Renderer")
            {
                var label = sender as MyLabel;
                if (label != null) //sanity check
                {
                    switch(label.MyStyleId)
                    {
                        case "Body":
                            break;
                        case "Header":
                            break;
                    }
                }
            }
        }

    }


}
Run Code Online (Sandbox Code Playgroud)

  • 更新了,希望现在很清楚:-) (2认同)