使用ResourceWrapper在Silverlight 4中进行本地化

时间:2010-04-28 12:48:02

标签: c# silverlight localization

我有一个业务应用程序(从模板创建),我可以通过生成ResourceWrapper INotifyPropertyChanged然后添加代码来动态更改语言:

private void Language_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
 Thread.CurrentThread.CurrentCulture =
     new CultureInfo(((ComboBoxItem)((ComboBox)sender).SelectedItem).Tag.ToString());
 Thread.CurrentThread.CurrentUICulture =
     new CultureInfo(((ComboBoxItem)((ComboBox)sender).SelectedItem).Tag.ToString());
 ((ResourceWrapper)App.Current.Resources["ResourceWrapper"]).ApplicationStrings =
     new ApplicationStrings();
}

这适用于xaml文件中引用/绑定的资源(即MainPage框架),但它不会更新我在代码中声明的任何内容的引用,即

InfoLabel.Content = ApplicationStrings.SomeString

目前我没有使用ResourceWrapper。我的问题是如何更改我的代码,以便在ResourceWrapper更改时使用它并进行更新。我试过了:

InfoLabel.Content = ((ResourceWrapper)App.Current.Resources["ResourceWrapper"])
    .ApplicationStrings.SomeString

但它不起作用。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您必须在代码中创建Binding。像这样:

var b = new Binding("SomeString");
b.Source = ((ResourceWrapper)App.Current.Resources["ResourceWrapper"]).ApplicationStrings;
b.Mode = BindingMode.OneWay;
InfoLabel.SetBinding(ContentControl.ContentProperty, b);

请记住,您绑定的类必须实现INotifyPropertyChanged



修改 如果您担心代码量,只需在应用程序的某处创建一个帮助方法:

public Binding GetResourceBinding(string key)
        {
            var b = new Binding(key);
            b.Source = ((ResourceWrapper)App.Current.Resources["ResourceWrapper"]).ApplicationStrings;
            b.Mode = BindingMode.OneWay;

            return b;
        }

然后使用这样的辅助方法:

InfoLabel.SetBinding(ContentControl.ContentProperty, GetResourceBinding("SomeString"));