Silverlight通过MVVM实现多语言实时切换(含源代码)

由于本示例基于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>

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

作者:紫色永恒

出处:http://024hi.cnblogs.com/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利

posted @ 2011-06-28 10:13 紫色永恒 阅读(1383) 评论(7) 编辑 收藏

 回复 引用 查看   
#1楼 2011-06-28 10:37 海南.胡勇      
对头,要是能自动生成就好。
 回复 引用 查看   
#2楼 2011-06-29 11:01 yusolo      
C# sliverlight 自定义控件Arc(扇形),通过循环组成一个圆,每个Arc中填充不同的颜色,当鼠标移动到一个Arc上面时,该Arc上浮(类似放大),这样做出这种效果啊?求解!谢谢啊!
 回复 引用 查看   
#3楼[楼主] 2011-06-29 14:01 紫色永恒      
@yusolo
Storyboard配合ScaleTransform完成,最好包装成behavior

 回复 引用 查看   
#4楼 2011-06-29 14:18 yusolo      
@紫色永恒
哥,可不可以再详细点?万分感谢!

 回复 引用 查看   
#5楼 2011-06-29 15:08 江大鱼      
不错!
 回复 引用 查看   
#6楼 2011-09-20 02:33 Smok.      
不错,我以为腾讯公司的都是脑残员工,哈哈哈,开玩笑的。
这个真不错,顶你。

 回复 引用 查看   
#7楼[楼主] 2011-09-20 08:29 紫色永恒      
@Smok.
额。。腾讯?干什么的?

发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 2091949 oMit26fGHco=