Как можно глобально установить Культуру в приложении WPF?

Я хотел бы установить Культуру приложения WPF на конкретную, основанную на пользовательских настройках.

Я могу сделать это для текущего потока через Thread.CurrentThread.Current(UI)Culture, но есть ли способ сделать это глобально для приложения (поэтому он влияет на все потоки по умолчанию)?

Ответ 1

нет способа установить его для всех потоков в приложении, однако, если вы создаете потоки в своем приложении, вы можете установить культуру для всех самостоятельно, как вы упомянули выше.

Чтобы установить Культуру в основное приложение, используйте следующий код фрагмента:

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

Ответ 2

Попробуйте поставить

<UICulture>en-US</UICulture>

... в вашем файле csproj.

Ответ 3

ok, поэтому я использую это, чтобы убедиться, что все мое приложение находится в культуре в США.

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

Ответ 4

Или вы можете попробовать следующее:

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

Ответ 5

Или попробуйте создать подходящее Attached Property, подобное этому

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


}