Daniel Hindrikes
Developer and architect with focus on mobile- and cloud solutions!
Developer and architect with focus on mobile- and cloud solutions!
The label control in Xamarin.Forms does not have a FontColor property. But the control is easy to extend.
First create a new class that inherits from Label.
Create a FontColor property of type string. The value of the FontColor will in this example be an RGBA string.
public class CustomLabel : Label
{
public static readonly BindableProperty FontColorProperty =
BindableProperty.Create(
p => p.FontColor, "");
public string FontColor
{
get
{
return (string)GetValue(FontColorProperty);
}
set
{
SetValue(FontColorProperty, value);
}
}
}
Next step is to write a custom renderer for each platform.
iOS
[assembly: ExportRenderer(typeof(CustomLabel), typeof(CustomLabelRenderer))]
namespace MyApp.iOS.Renderers
{
public class CustomLabelRenderer : LabelRenderer
{
protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if(e.PropertyName == "FontColor")
{
var view = (CustomLabel)Element;
var values = view.FontColor.Split(',');
Control.TextColor = UIColor.FromRGBA(int.Parse(values[0]), int.Parse(values[1]), int.Parse(values[2]), int.Parse(values[3]));
}
}
}
}
Android
[assembly: ExportRenderer(typeof(CustomLabel), typeof(CustomLabelRenderer))]
namespace MyApp.Android.Renderers
{
public class CustomLabelRenderer : LabelRenderer
{
protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if(e.PropertyName == "FontColor")
{
var view = (CustomLabel)Element;
var values = view.FontColor.Split(',');
var color = Color.Argb(int.Parse(values[3]),int.Parse(values[0]), int.Parse(values[1]), int.Parse(values[2]));
Control.SetTextColor(color);
}
}
}
}
Windows Phone
[assembly: ExportRenderer(typeof(CustomLabel), typeof(CustomLabelRenderer))]
namespace MyApp.WinPhone.Renderers
{
public class CustomLabelRenderer : LabelRenderer
{
protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if(e.PropertyName == "FontColor")
{
var view = (CustomLabel)Element;
var values = view.FontColor.Split(',');
Control.Foreground = new SolidColorBrush(System.Windows.Media.Color.FromArgb(byte.Parse(values[0]), byte.Parse(values[1]), byte.Parse(values[2]), byte.Parse(values[3])));
}
}
}
}
To use the custom label in XAML you need to declare the namespace.
Then you can use the control i XAML like this: