2016-08-05 72 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; 
     } 
    } 
} 

然而,並稱到項目將使所有標籤渲染指定的字體。如果我只想製作一些特定的標籤,則會使用該字體進行渲染?

也許一個解決方案是從標籤繼承和渲染器添加到該繼承的類,從而它僅施加到該特定類的實例,並且因此它僅施加到指定的標籤。因此,我的問題由兩部分組成:(1)我描述了正確的方式,並且它會起作用,如果不正確,(2)什麼是正確的方式?

回答

2

也許一個解決方案是從Label繼承並將渲染器添加到該繼承的類,從而將其僅應用於該特定類的實例,因此僅將其應用於指定的標籤。

這是對您的控件/需求進行自定義渲染器的正確方法。通過導出Label類型的渲染器,您正在修改應用中的所有標籤。

你必須建立在共享項目中一個繼承Label類和定義自定義渲染它。例如:

在共享/便攜式項目:

public class MyLabel : Label {} 

在Android項目:

[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

相關問題