2009-08-12 114 views
10

我想根据用户的偏好设置WPF应用程序的文化到一个特定的。如何在WPF应用程序中全局设置文化?

我可以通过Thread.CurrentThread.Current(UI)Culture为当前线程做到这一点,但有什么办法可以为应用程序全局执行此操作(因此它会默认影响所有线程)?

回答

9

有没有办法将其设置为应用程序中的所有线程,但如果要创建在应用程序的线程,你可以自己为你上面

提到要设置文化来设置每个人的文化主应用程序使用下面的代码片段:

Dim newCulture As CultureInfo = new CultureInfo("fr-FR") 
CurrentThread.CurrentCulture = newCulture 
+2

如何可以我设置在APP.xaml.cs?将此CultureInfo设置为该项目的任何线程? – Lai32290 2013-07-31 15:05:26

7

尝试把

<UICulture>en-US</UICulture> 

...在你的csproj文件。

3

或者你可以试试这个:

FrameworkElement.LanguageProperty.OverrideMetadata(GetType(FrameworkElement), New FrameworkPropertyMetadata(Markup.XmlLanguage.GetLanguage(Globalization.CultureInfo.CurrentCulture.IetfLanguageTag))) 
+0

嗯,没有为我工作,但也许我做错了什么.. – Tarnschaf 2013-11-19 20:08:27

+0

你需要在加载视觉树之前启动应用程序。 – Darren 2013-12-06 12:29:57

+0

您还需要执行'System.Windows.Documents.TextElement',以便捕获不从'FrameworkElement'继承的''标签(例如'TextBlock'元素内)。 – Grhm 2014-09-24 12:31:55

0

或者尝试建立一个适当的附加属性这样

public class CultureHelper : DependencyObject 
{ 

    public string Culture 
    { 
     get { return (string)GetValue(CultureProperty); } 
     set { SetValue(CultureProperty, value); } 
    } 




    // Using a DependencyProperty as the backing store for MyProperty. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty CultureProperty = 
     DependencyProperty.RegisterAttached("Culture", typeof(string), typeof(CultureHelper), new FrameworkPropertyMetadata("en", CultureChanged)); 

    private static void CultureChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     //For testing purposes in designer only 
     if (DesignerProperties.GetIsInDesignMode(d)) 
     { 
      Thread.CurrentThread.CurrentUICulture = new CultureInfo((string)e.NewValue); 
     } 

    } 

    public static void SetCulture(DependencyObject element, string value) 
    { 
     element.SetValue(CultureProperty, value); 
    } 

    public static string GetCulture(DependencyObject element) 
    { 
     return (string)element.GetValue(CultureProperty); 
    } 


} 
5

好了,所以这是我使用以便确保所有我的应用程序是在一个美国文化。

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US"); 
CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("en-US"); 
XmlLanaguage lang = XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag); 
FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(lang)); 
FrameworkContentElement.LanguageProperty.OverrideMetadata(typeof(System.Windows.Documents.TextElement), new FrameworkPropertyMetadata(lang)); 

,以使在培养一个单独的线程可以使

Thread.CurrentThread.CurrentCulture = new CultureInfo("EN-US"); 
Thread.CurrentThread.CurrentUICulture = new CultureInfo("EN-US"); 
+0

您还需要执行'System.Windows.Documents.TextElement'以捕获不从'FrameworkElement'继承的标签(例如'TextBlock'元素内)。 – Grhm 2014-09-24 12:30:08

+0

Grhm你是什么意思? – Gilad 2014-09-24 14:09:48

+1

我在我的应用程序中有一些部分如下:'标签:' 为了获得格式正确的语言环境中的数字,我不得不添加'FrameworkElement.LanguageProperty .OverrideMetadata(typeof(System.Windows.Documents.TextElement),new FrameworkPropertyMetadata( XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag));'以及我们提到的几行。 运行不会从FrameworkElement继承(请参阅http://msdn.microsoft.com/en-us/library/system.windows.documents.run(v=vs.110).aspx) – Grhm 2014-09-24 14:30:36

相关问题