Xamarin
Xamarin.Forms

Xamarin.Formsで数値の±で着色するLabelを作る

値に応じた色付けをするような時、画面コントロールではなくてLabel部品側で色をつけたいところ

Styleを作る

<?xml version="1.0" encoding="UTF-8"?>
<ResourceDictionary xmlns="http://xamarin.com/schemas/2014/forms" 
                    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
                    xmlns:common="clr-namespace:hoge.Common"
                    x:Class="hoge.Asset.Styles">

    <x:Double x:Key="DefaultFontSize">16</x:Double>
    <Color x:Key="DefaultTextColor">#000000</Color>

    <Style  x:Key="RegularFontStyle" TargetType="Label">
        <Setter Property="FontSize" Value="{StaticResource DefaultFontSize}" />
        <Setter Property="TextColor" Value="{StaticResource DefaultTextColor}" />
    </Style>

    <Style TargetType="common:ValueLabel" BasedOn="{StaticResource RegularFontStyle}">
    </Style>

</ResourceDictionary>

ここでは自動着色するLabelをcommon:ValueLabelとして定義してます

起動時にスタイルを読み込む

<?xml version="1.0" encoding="utf-8"?>
<Application xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
             xmlns:theme="clr-namespace:hoge.Asset"
             x:Class="hoge.App">
    <Application.Resources>
        <theme:Styles />
    </Application.Resources>
</Application>

App.xamlで読み込む

Labelクラスを作る

using System;
using System.Runtime.CompilerServices;
using Xamarin.Forms;

namespace hoge.Common
{
    public class ValueLabel : Label
    {
        public ValueLabel()
        {
        }

        protected override void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            base.OnPropertyChanged(propertyName);
            if (propertyName == "Text")
            {
                if (!string.IsNullOrEmpty(Text) && Text.Contains("+"))
                {
                    TextColor = (Color)App.GetStyle()["PlusColor"];
                }
                else if (!string.IsNullOrEmpty(Text) && Text.Contains("-"))
                {
                    TextColor = (Color)App.GetStyle()["MinusColor"];
                }
            }
        }

    }
}

数値処理は省略してますが、とりあえず+かーかが含まれてたら色をつけるというロジックにしてます
OnPropertyChangedでの判定が楽なのでこんな処理にしてますがパフォーマンスはあまり良くないと思います