2009-08-12 22 views
10

Tôi muốn đặt ứng dụng Văn hóa của WPF thành một ứng dụng cụ thể dựa trên tùy chọn của người dùng.Làm thế nào tôi có thể thiết lập văn hóa toàn cầu trong một ứng dụng WPF?

Tôi có thể làm điều này cho luồng hiện tại qua Thread.CurrentThread.Current(UI)Culture, nhưng có cách nào để thực hiện điều này trên toàn cầu cho ứng dụng (do đó nó ảnh hưởng đến tất cả các luồng theo mặc định)?

Trả lời

9

không có cách nào để thiết lập nó cho tất cả các chủ đề trong ứng dụng, tuy nhiên nếu bạn đang tạo các chủ đề trong ứng dụng của bạn, bạn có thể thiết lập các nền văn hóa cho tất cả mọi người một mình như bạn đề cập ở trên

Để thiết lập văn hóa để Application Main sử dụng đoạn mã sau:

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

Làm thế nào để tôi có thể thiết lập này trong APP.xaml.cs? đặt CultureInfo này cho bất kỳ chủ đề nào của dự án này? – Lai32290

7

Hãy thử đặt

<UICulture>en-US</UICulture> 

... trong tập tin csproj của bạn.

3

Hoặc bạn có thể thử điều này:

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

Hm, đã không làm việc cho tôi nhưng có lẽ tôi đã làm điều gì đó sai .. – Tarnschaf

+0

Bạn cần phải làm điều đó lúc khởi động ứng dụng trước khi tải cây trực quan. – Darren

+0

Bạn cũng cần phải thực hiện 'System.Windows.Documents.TextElement' để bắt các thẻ' '(ví dụ trong các phần tử' TextBlock') không kế thừa từ 'FrameworkElement'. – Grhm

0

Hoặc thử xây dựng một tài sản gắn thích hợp như thế này

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

ok vì vậy đây là những gì tôi sử dụng để đảm bảo tất cả các ứng dụng của tôi là trong một nền văn hóa Mỹ.

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)); 

để tạo ra một chủ đề duy nhất trong một nền văn hóa bạn có thể làm

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

Bạn cũng cần phải thực hiện 'System.Windows.Documents.TextElement' để bắt các thẻ (ví dụ trong các phần tử' TextBlock') không kế thừa từ 'FrameworkElement'. – Grhm

+0

Grhm bạn có ý gì? – Gilad

+1

Tôi có một số phần trong ứng dụng của tôi trông giống như: ' Nhãn: ' Để có được số được định dạng đúng ngôn ngữ, tôi phải thêm 'FrameworkElement.LanguageProperty .OverrideMetadata (typeof (System.Windows.Documents.TextElement), mới FrameworkPropertyMetadata ( XmlLanguage.GetLanguage (CultureInfo.CurrentCulture.IetfLanguageTag))); 'cũng như các dòng chúng tôi đã đề cập. Chạy không được kế thừa từ FrameworkElement (xem http://msdn.microsoft.com/en-us/library/system.windows.documents.run(v=vs.110).aspx) – Grhm

Các vấn đề liên quan