Silverlight で XAML 内のテキストをローカライズする方法

以前、WPFXAMLローカライズする方法を紹介しました。


Silverlight には x:Static マークアップ拡張が無いので、WPF の方法が使えません。残念。その代わりと言ってはなんですが、Binding を使う方法があります。


まず、Silverlight プロジェクトにリソースファイルを追加します。
f:id:griefworker:20101007211959j:image


TextBlock や Button に表示するテキストを追加しておきます。アクセス修飾は忘れず public に変更すること。
f:id:griefworker:20101007212000j:image


次に、リソースをプロパティにもつクラスを作成します。

namespace ResourceSample
{
    public class MyResources
    {
        public MyResources()
        {
        }

        private Resource1 _resource1 = new Resource1();
        public Resource1 Resource1
        {
            get { return _resource1; }
        }
    }
}


あとは、ローカライズしたい XAML で次のようにバインドすればいいです。Resources に追加しておいて、バインディングのソースに指定しているところがポイント。

<UserControl x:Class="ResourceSample.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:ResourceSample"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">
    <UserControl.Resources>
        <!-- バインドするため、まずリソースに追加 -->
        <local:MyResources x:Key="MyResources"/>        
    </UserControl.Resources>
    <StackPanel x:Name="LayoutRoot" Background="White">
        <!-- StaticResource としてバインドする -->
        <TextBlock Text="{Binding Path=Resource1.LabelText, Source={StaticResource MyResources}}"/>
        <Button Content="{Binding Path=Resource1.ButtonText, Source={StaticResource MyResources}}"/>
    </StackPanel>
</UserControl>


なんでわざわざ MyResources クラスを作ったかというと、Resource1 クラスが引数無しの public コンストラクタを持っていないためです。引数を無しの public コンストラクタが無いと XAMLインスタンスを生成できないので。ここもポイントですね。