2009-08-12 5 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

7

이 csproj 파일에

<UICulture>en-US</UICulture> 

를 ... 넣어보십시오 : 메인 응용 프로그램은 다음 코드 조각을 사용합니다.

3

또는 당신이 시도 할 수 :

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

흠, 나에게 도움이되지 못했지만 어쩌면 내가 뭔가 잘못 했어. – Tarnschaf

+0

비주얼 트리를로드하기 전에 응용 프로그램을 시작해야합니다. – Darren

+0

'FrameworkElement'에서 상속받지 않는''태그 (예 :'TextBlock' 요소 내)를 잡으려면'System.Windows.Documents.TextElement'를 수행해야합니다. – Grhm

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

확인과 같은 적절한 연결된 속성을 구축하려고 확실히 내 애플 리케이션의 모든입니다 en-US 문화에서.

문화에서 하나의 스레드를 만들기 위해
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

또한'FrameworkElement'에서 상속받지 않는 태그 (예 :'TextBlock' 요소 내)를 잡으려면'System.Windows.Documents.TextElement'를 수행해야합니다. – Grhm

+0

그게 무슨 소리 야? – Gilad

+1

내 응용 프로그램의 일부 섹션은 다음과 같습니다 :' 레이블 : ' 정확한 로케일로 포맷 된 숫자를 얻으려면'FrameworkElement.LanguageProperty .OverrideMetadata (typeof (System.Windows.Documents.TextElement), 새 FrameworkPropertyMetadata ( XmlLanguage.GetLanguage (CultureInfo.CurrentCulture.IetfLanguageTag))) '및 언급 한 줄. 실행이 FrameworkElement에서 상속되지 않음 (http://msdn.microsoft.com/en-us/library/system.windows.documents.run(v=vs.110).aspx) – Grhm

관련 문제