2016-08-05 1 views
1

私はラベルのフォントを変更したいとしましょう。それは私がそのような何かを記述する必要がありますことを意味しますカスタムレンダラを特定のレイアウトにのみ追加するにはどうすればよいですか?

[assembly: ExportRenderer(typeof(Label), typeof(LabelFontRenderer))] 
namespace MyApp.Droid 
{ 
    public class LabelFontRenderer : LabelRenderer 
    { 
     protected override void OnElementChanged(ElementChangedEventArgs<Label> e) 
     { 
      base.OnElementChanged(e); 
      var label = (TextView)Control; // for example 
      Typeface font = Typeface.CreateFromAsset(Forms.Context.Assets, "Roboto-Regular.ttf"); // font name specified here 
      label.Typeface = font; 
     } 
    } 
} 

ただし、プロジェクトにすべてのラベルが指定したフォントでレンダリングするようになりますと付け加えました。特定のラベルだけをそのフォントでレンダリングするにはどうすればよいですか?

ラベルから継承し、継承されたクラスにレンダラーを追加して、その特定のクラスのインスタンスにのみ適用し、それを指定されたラベルにのみ適用するのが解決策です。したがって、私の質問は2つの部分から成り立っています:(1)私が正しい方法を記述し、それがうまくいく方法であり、そうでない場合、(2)正しい方法は何ですか?

答えて

2

ラベルから継承し、継承されたクラスにレンダラーを追加して、特定のクラスのインスタンスにのみ適用することで、指定されたラベルのみに適用するのが解決策です。

のコントロール/ニーズに対するカスタムレンダリングを行う正しい方法です。 Labelタイプのレンダラーをエクスポートすると、アプリ内のすべてのラベルが変更されます。

共有プロジェクトに継承されたLabelクラスを作成し、カスタムレンダラーを定義する必要があります。例えば:Androidのプロジェクトで

public class MyLabel : Label {} 

:共有/ポータブルプロジェクトで

[assembly: ExportRenderer(typeof(MyLabel), typeof(LabelFontRenderer))] 
namespace MyApp.Droid 
{ 
    public class LabelFontRenderer : LabelRenderer 
    { 
     protected override void OnElementChanged(ElementChangedEventArgs<Label> e) 
     { 
      base.OnElementChanged(e); 
      var label = (TextView)Control; // for example 
      Typeface font = Typeface.CreateFromAsset(Forms.Context.Assets, "Roboto-Regular.ttf"); // font name specified here 
      label.Typeface = font; 
     } 
    } 
} 

使用法:

var myLabel = new MyLabel { Text = "Hello" }; 
+0

申し訳ありませんが、私は困惑しています。私が提供したソリューションが正しいと言っていますか? – nicks

+0

@NikaGamkrelidzeいいえ、Labelクラスを継承して使用する必要があります。私はより明快に私の答えを更新します:)実際に言ったのは –

+0

です。多分私は自分自身を正しく表現していないかもしれません。 – nicks

関連する問題