以前、WPF で XAML をローカライズする方法を紹介しました。
Silverlight には x:Static マークアップ拡張が無いので、WPF の方法が使えません。残念。その代わりと言ってはなんですが、Binding を使う方法があります。
まず、Silverlight プロジェクトにリソースファイルを追加します。
TextBlock や Button に表示するテキストを追加しておきます。アクセス修飾は忘れず public に変更すること。
次に、リソースをプロパティにもつクラスを作成します。
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 でインスタンスを生成できないので。ここもポイントですね。