Metro插件系統系列就暫時停一下,這次我們討論一下WPF的資源本地化實現,主要用到的:CultureInfo,ResourceManger,MarkupExtension,RESX文件,這些都是.NET框架提供的。
項目結構:
運行結果:
可在程序運行時,實時切換語言
CultureInfo
CultureInfo類表示有關特定區域性的信息,包括區域性的名稱、書寫體系和使用的日歷,以及有關對常用操作(如格式化日期和排序字符串)提供信息的區域性特定對象的訪問。CultureInfo類的實例化一般有兩個途徑,如下所示: CultureInfo culture = CultureInfo. CreateSpecificCulture (name); CultureInfo culture = new CultureInfo(name);
二者的區別是,使用第一種方法,只能創建固定區域性或特定區域性的CultureInfo實例。如果name為空字符串,則建立固定區域性的實例,如果name為非特定區域性,那麼建立name 關聯的默認特定區域性的 CultureInfo實例。第二種方法,則是建立一個name所指定的區域性的CultureInfo實例,它可以是固定的,非特定的或特定區域性的。
Thread類的CurrentCulture屬性用來獲取或設置當前線程的區域性。它必須被設置為特定區域性。 Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");如果Thread.CurrentThread.CurrentCulture = new CultureInfo("en ");就會報錯!
Thread類的CurrentUICulture屬性用來獲取或設置資源管理器使用的當前區域性以便在運行時查找區域性特定的資源。
ResourceManger
ResourceManger類可以查找區域性特定的資源,當本地化資源不存在時提供代用資源,並支持資源序列化。常用的ResourceManager的構造函數是public ResourceManager(string,Assembly)。其含義是初始化 ResourceManager類的新實例,它使用指定的根名稱從給定的Assembly中查找資源文件。所謂根名稱是例如名為“MyResource.en-US.resources”的資源文件的根名稱為“MyResource”。在根名稱的表達中可以加上命名空間,如“MyWebSite.Resource.UserFolder. MyResource”。而Assembly可以是需要調用資源文件的頁面所在的Assembly,如typeof(MyPage).Assembly。ResourceManager類的GetString方法用來獲得資源文件中的指定鍵的值。舉例:當已設置了線程的CurrentUICulture屬性之後按如下方法。 ResourceManager rm = new ResourceManager("items", Assembly.GetExecutingAssembly()); String str = rm.GetString("welcome");
如果想按照指定的區域性來獲得資源則按照如下寫法: ResourceManager rm = new ResourceManager("items", Assembly.GetExecutingAssembly()); CultureInfo ci = Thread.CurrentThread.CurrentCulture; String str = rm.GetString("welcome",ci);
MarkupExtension
Markup Extensions 與TypeConverter 差不多,允許擴展Xaml表達式,把Xaml中的文本轉換成相應的對象/對象程序。
在上述例子中,x:Null, x:Static, Binding 都是Markup Extension.
微軟已經提供了相當多的擴展,並且我們還可以自定義擴展類型。
----------------------------------------------------------------------------------------------------
微軟定義的Markup Extension
所有的Extensions都必須派生於:
特定於 WPF 的標記擴展 WPF 編程中最常用的標記擴展是支持資源引用的標記擴展(StaticResource 和 DynamicResource)以及支持數據綁定的標記擴展 (Binding)。
StaticResource 通過替換已定義資源的值來為 XAML 屬性提供值。
DynamicResource 通過將值推遲為對資源的運行時引用來為 XAML 屬性提供值。動態資源引用強制在每次訪問此類資源時都重新進行查找。
Binding 按應用於元素的數據上下文來為屬性提供數據綁定值。此標記擴展相對復雜,因為它會啟用大量內聯語法來指定數據綁定。
RelativeSource 為可以在運行時元素樹中定位若干可能關系的 Binding 提供源信息。對於在多用途模板中創建的綁定,或在未充分了解周圍的元素樹的情況下以代碼創建的綁定,上述標記擴展會提供專用源。
TemplateBinding,控件模板可以通過它使用來自要利用該模板的類的對象模型定義屬性中的模板化屬性的值。有關詳細信息,請參見 TemplateBinding 標記擴展。
XAML 定義的標記擴展
StringResourceExtension
[ConstructorArgument( = (Key != && DefaultValue != (Key == && DefaultValue != (Key != && DefaultValue == (Key == && DefaultValue == (Key != strResault== (strResault == == StringResourceExtension(=+= EventHandler<EventArgs> StringResourceExtension( key, ==+= EventHandler<EventArgs> = serviceProvider.GetService((IProvideValueTarget)) = target.TargetObject (setter != Binding() { Source = , Mode == Binding() { Source = , Mode = = System.ComponentModel.PropertyChangedEventArgs( (PropertyChanged != Language_Event(
Resource [BY Zengg]
GetString( CultureInfo culture = CultureInfo( stringResource = ResourceManager(, GetString( =
GlobalClass
? inDesignMode = (inDesignMode == SILVERLIGHT= prop == ()DependencyPropertyDescriptor.FromProperty(prop, (!inDesignMode.GetValueOrDefault() && Process.GetCurrentProcess().ProcessName.StartsWith(= inDesignMode.GetValueOrDefault( EventHandler<EventArgs>= GetString( ChangeLanguage(= === (LanguageChangeEvent != ,
MainWindow.xaml
<Window x:Class===== Height= Width=> <Grid > <StackPanel Margin=> <TextBlock Text=></TextBlock> <TextBlock Text=></TextBlock> <TextBlock Text=></TextBlock> <TextBlock Text=></TextBlock> </StackPanel> <Button Content= HorizontalAlignment= Margin= VerticalAlignment= Width= Click=/> <Button Content= HorizontalAlignment= Margin= VerticalAlignment= Width= Click=/> </Grid> </Window>
綁定到某個對象的用法就是,如{local:StringResource test1,DefaultValue=測試一},test1是當前資源的資源名稱,默認值就是在設計器上顯示的內容。
源碼地址:http://pan.baidu.com/share/link?shareid=3361221912&uk=554439928
如果您看了本篇博客,覺得對您有所收獲,請點擊右下角的 [推薦]
如果您想轉載本博客,請注明出處
如果您對本文有意見或者建議,歡迎留言
感謝您的閱讀,請關注我的後續博客 Zengg
作者:Zengg 出處:http://www.cnblogs.com/01codeworld/ 本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。