WPF 国际化具体实现步骤

原创 2013年12月05日 14:24:34

这是本人第一次写博客,心想在园子里已经“潜伏”两年多了,好像是该做点什么了,从此下定决心开始写博客。

虽然说文章标题写着原创,但是其实还是借鉴了一些文章,我只是把自己的想法融合进去

如有版权问题,请及时联系我....

废话不多说,切入正题...

 

想法:

1.把需要国际化的数据保存在相应的wpf的资源文件中。

2.创建数据实体类(用来切换国际化数据)

3.把实体类的数据绑定到UI界面上。

 

具体实践:

1.创建两个资源文件Chinese.xamlEnglish.xaml

Chinese.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:sys="clr-namespace:System;assembly=mscorlib"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <sys:String x:Key="MainTitleName">数据转发</sys:String>
</ResourceDictionary>


 

English.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:sys="clr-namespace:System;assembly=mscorlib"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <sys:String x:Key="MainTitleName">Data Forwarder</sys:String>
    
</ResourceDictionary>



 

2.创建数据实体类

public class InternationalizationNames:INotifyPropertyChanged
    {
        public string MainTitleName
        {
            get
            {
                object obj = Application.Current.FindResource("MainTitleName");
                string str = obj as string;
                return str; 
            }
        }
 
        public void UpdateInternationalizationNames()
        {
            this.OnPropertyChanged("MainTitleName");
        }
 
        private void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler
                = this.PropertyChanged;
 
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
 
        public event PropertyChangedEventHandler PropertyChanged;
    }

 

3.自定义绑定类

public class ResourceManager
    {
        public static InternationalizationNames AllInternationalNames;
        public static ResourceDictionary LanguageResourceDictionary;
 
        static ResourceManager()
        {
            AllInternationalNames = new InternationalizationNames();
            LanguageResourceDictionary = new ResourceDictionary();
            
        }
 
        public ResourceManager()
        {
     
            
        }
 
        
    }

public class AllInternationalNamesBinding : System.Windows.Data.Binding
    {
        public AllInternationalNamesBinding()
        {
            this.Source = ResourceManager.AllInternationalNames;
        }
        public AllInternationalNamesBinding(string path)
        {
            this.Path = new PropertyPath(path);
            this.Source = ResourceManager.AllInternationalNames;
        }
    }



 

4.数据绑定UI

<Window x:Class="DDEDataAchieve.MainWindow"
        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:tools="clr-namespace:DDEDataAchieve.Tools"
        mc:Ignorable="d"
        Height="600"
        Width="800"
        WindowStartupLocation="CenterScreen"
        Title="{tools:AllInternationalNamesBinding Path=MainTitleName}"
        TextOptions.TextFormattingMode="Display">


注意:DDEDataAchieve.Tools为类AllInternationalNamesBinding的命名空间。

 

5.国际化语言切换

public partial class App : Application
    {
        static App()
        {
            DispatcherHelper.Initialize();
        }
 
        ResourceManager resourceManager;
        public App()
        {
            resourceManager = new ResourceManager();
            this.Startup += new StartupEventHandler(App_Startup);
        }
 
        void App_Startup(object sender, StartupEventArgs e)
        {
            ResourceManager.LanguageResourceDictionary.Source = 
                new Uri("Resources/English.xaml", UriKind.Relative);
 
            Application.Current.Resources.MergedDictionaries.Add(ResourceManager.LanguageResourceDictionary);
        }


按钮切换语言事件中如下:

Application.Current.Resources.MergedDictionaries.Remove(ResourceManager.LanguageResourceDictionary);
 
        ResourceManager.LanguageResourceDictionary.Source =
                new Uri("Resources/Chinese.xaml", UriKind.Relative);
 
        Application.Current.Resources.MergedDictionaries.Add(ResourceManager.LanguageResourceDictionary);
 
        ResourceManager.AllInternationalNames.UpdateInternationalizationNames();


这样就实现了WPF国际化的问题。

本文如有任何问题欢迎随时指正。

 

WPF 布局心得 一个像素引发的问题和思考

用xaml布局界面的时候,遇到了这样一个问题。 按钮的白色border边框一边细一边消失了。 正常的情况应该是这样的。 我大致的思路是这样的,可能是外部原因:容纳按钮的容器把按钮的边框挤没了。还...

批量生成 PowerPoint 演示文稿缩略图

去年说过一回 SWF 截图的事儿 ,今年又该给 PPT(Microsoft PowerPoint 演示文稿)截图了。 测试环境:Windows 2000 SP4, PowerPoint 2000, W...

LR参数化的方式和具体实现步骤

方式一: 参数化的方法                                                                            选中要参数...

TCP/IP的具体实现源码教材

  • 2014年12月04日 11:14
  • 4.9MB
  • 下载

音乐的播放具体实现

  • 2012年10月06日 16:20
  • 817B
  • 下载

jquery监听div内容(元素)的变化具体实现思路

原文出处:http://blog.itblood.com/jquery-how-to-listen-div-content-change.html 我们做电子商务,javascrip...

飞思卡尔小车具体实现

  • 2013年04月18日 18:54
  • 1.93MB
  • 下载

DES算法具体实现

  • 2011年12月26日 19:14
  • 4.74MB
  • 下载

深入了解Hive Index具体实现

索引是标准的数据库技术,hive 0.7版本之后支持索引。hive索引采用的不是'one size fites all'的索引实现方式,而是提供插入式接口,并且提供一个具体的索引实现作为参考。Hive...

EWB的介绍和具体实现过程

  • 2011年12月04日 15:20
  • 972KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WPF 国际化具体实现步骤
举报原因:
原因补充:

(最多只允许输入30个字)