惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
I
InfoQ
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 【当耐特】
小众软件
小众软件
B
Blog RSS Feed
大猫的无限游戏
大猫的无限游戏
博客园 - 三生石上(FineUI控件)
Engineering at Meta
Engineering at Meta
人人都是产品经理
人人都是产品经理
Microsoft Security Blog
Microsoft Security Blog
Last Week in AI
Last Week in AI
H
Help Net Security
爱范儿
爱范儿
云风的 BLOG
云风的 BLOG
博客园 - 司徒正美
Y
Y Combinator Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Microsoft Azure Blog
Microsoft Azure Blog
L
LangChain Blog
WordPress大学
WordPress大学
GbyAI
GbyAI
Google DeepMind News
Google DeepMind News
腾讯CDC

博客园 - 紫色永恒

一段旅程的结束和另一端旅程的开始 Silverlight Client←→Server数据同步备忘代码 Expression Blend 5 Preview For Silverlight5 RC已发布 Siverlight5新功能/改进总结 [译]WCF RIA Services中的集合(2) [译]WCF RIA Services中的集合(1) Silverlight中服务通信方式的选择(WCF、Data Service、Ria Service) 你应该知道的,那些未在Silverlight5Beta中出现的特性 记录来敦煌一周的情况 Silverlight奇技银巧7 - 巧用文件生成时间强制客户端载入最新xap文件 [ASP.NET MVC3]Chart的ActionResult扩展 如何将ASP.NET MVC2项目升级到MVC 3 RC Silverlight 4 GDR 1 更新 Silverlight奇技银巧6 - UserControl的继承 Silverlight 4 Training Kit更新 Silverlight4的DataGrid改进与Toolkit2010.4中的新玩意 Win03+IIS6部署.NetFramework4(ASP.NET4)的一点小经验 4.13 Silverlight4 Will Come Silverlight4RC的API汇总(文本文件)
Silverlight通过MVVM实现多语言实时切换(含源代码)
紫色永恒 · 2011-06-28 · via 博客园 - 紫色永恒

由于本示例基于MVVMLightToolkit,所以我们的ViewModel基类继承自MVVMLightToolkit提供的ViewModelBase,并命名为AdvancedViewModelBase,项目中所有的ViewModel都继承自这个类,先看类图:

image

由于本示例基于MVVMLightToolkit,所以我们的ViewModel基类继承自MVVMLightToolkit提供的ViewModelBase,并命名为AdvancedViewModelBase,项目中所有的ViewModel都继承自这个类。

本文的重点是“实时”切换。我们知道,ViewModel中的属性发生变化时如果要将变化反映到界面中则必将使用通知机制—INotifyPropertyChanged,因此我们引入了一个中间“代理”类ObservableResources,代码如下:

public class ObservableResources : INotifyPropertyChanged { public string this[string resourceName] { get { return Language.ResourceManager.GetString(resourceName); } } public event PropertyChangedEventHandler PropertyChanged; public void UpdateBindings() { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Item[]")); } }

注意,因为我们使用了类的索引器,所以PropertyChangedEventArgs的参数应该为“Item[]”,Language类为资源文件自动生成。

之后,我们在AdvancedViewModelBase类中对其进行实例化。AdvancedViewModelBase的关键代码如下:

        public ObservableResources LanguageResource { get; set; }
        public ICommand ChangeLanguageCommand { get; set; }

        public AdvancedViewModelBase() {
            LanguageResource = new ObservableResources();
            ChangeLanguageCommand = new RelayCommand<EdsLanguage>(ChangeLanguage);
        }

        private void ChangeLanguage(EdsLanguage lang) {
            var culture = new CultureInfo(lang.CultureName);
            Thread.CurrentThread.CurrentCulture = culture;
            Thread.CurrentThread.CurrentUICulture = culture;
            LanguageResource.UpdateBindings();
        }

这里我们准备了一个ICommand以供在界面中进行绑定,当ChangeLanguageCommand被激活时执行ChangeLanguage方法(传递选定的语言类型),调用LanguageResource的UpdateBindings方法通知界面当前Culture的改变。

EdsLanguage类为自定义,定义了Culture、图标及语言信息。

image

在XAML中,需要使用多语言的部分则需如此调用

<TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding LanguageResource[Login_UserNameLabel]}" />

其中Login_UserNameLabel则为资源文件中的Name。

改变语言类型的示例(本例使用了EventToCommand,当然用其他方式也可):

<ComboBox SelectedItem="{Binding SelectedLanguage}" ItemsSource="{Binding EdsLangList}" x:Name="cbLanguage"  Width="110" Height="30" HorizontalAlignment="Left">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged">
            <cmd:EventToCommand Command="{Binding ChangeLanguageCommand}" CommandParameter="{Binding ElementName=cbLanguage,Path=SelectedItem}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <Image Width="28" Height="28" Source="{Binding FlagIcon}"/>
                <TextBlock Text="{Binding LanguageName}" VerticalAlignment="Center"/>
            </StackPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

示例源代码:https://files.cnblogs.com/024hi/SwitchLanguageDemo.zip