2017-08-13 6 views
2

これまでこのコードを思いつきました。私の問題はレンダラーにスタイルを渡したいのですが、スタイルIDを渡す方法がわかりません。Xamarin Labelカスタムレンダラにスタイルリクエストを渡す方法はありますか?

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": 

このようにして、コードでitem.StyleIdを使用した別の例を見ました。 - mylabelというの

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; 
     } 

答えて

5

はLabelから派生したクラスを作成します。似た何かが上記labelRendererのために行うことができる場合、私は見て興味を持っていますので、しかし、これはラベルレンダラとは全く異なります。バインディングプロパティ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); } 
     } 
    } 

XAML

<local:MyLabel MyStyleId="Header" Text="Custom Label"></local:MyLabel> 

xmlns:local="clr-namespace:ButtonRendererDemo;assembly=ButtonRendererDemo" 

レンダラあなたの "ローカル" を定義することを忘れないでください

[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; 
        } 
       } 
      } 
     } 

    } 


} 
+0

こんにちは、ちょっと例を挙げてください。私はどこから始めるべきか分かりません。もう少しCSを表示し、おそらくXAMLのために1行を表示できますか? –

+2

更新されました。 –

関連する問題