如何改变文化?

时间:2019-07-05 14:08:39

标签: c# wpf

我试图通过单击代码来更改语言:

private void Spache_Click(object sender, RoutedEventArgs e)
{
    System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("fr-FR");

    System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("fr-FR");          
}

我的应用程序有一些资源文件:Resources.ar-TN.resxResources.fr-FR.resx等...我需要用一个按钮切换语言。它可以在main中使用,但在按钮中不起作用。

2 个答案:

答案 0 :(得分:0)

实际问题应该是:

  

更改UI文化后如何重新加载UI?

影响UI的属性为Thread.CurrentThread.CurrentUICulture不是 Thread.CurrentThread.CurrentCulture。第二种文化影响字符串的解析或格式化方式。 CurrentUICulture是用于加载本地化资源的区域。

更改CurrentUICulture不会重新加载这些资源。您必须显式强制重新加载或重新加载应用程序的主窗口。

检查Changing Culture in WPF,由Pluralsight课程Introduction to Localization and Globalization in .NET的作者撰写。该课程以WPF应用程序为例,因此请务必仔细阅读。通过Microsoft的Visual Studio Dev Essentials(免费)优惠,您可以获得3个月的免费访问Pluralsight的课程。

本文显示的是如何显式处理主窗口并在区域性更改时重新加载它。

App.xaml被修改以防止主窗口自动打开。已从App.xaml and the OnStartup`事件中删除StartupUri,以显式打开主窗口。这:

<Application x:Class="WpfLocalized.App"
             ...
             StartupUri="MainWindow.xaml">
...
</Application>

更改为:

<Application x:Class="WpfLocalized.App"
             ...
             >
...
</Application>

并将以下代码添加到App.xaml.cs中:

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        Application.Current.MainWindow = new MainWindow();
        Application.Current.MainWindow.Show();
    }

    public static void ChangeCulture(CultureInfo newCulture)
    {
        Thread.CurrentThread.CurrentCulture = newCulture;
        Thread.CurrentThread.CurrentUICulture = newCulture;

        var oldWindow = Application.Current.MainWindow;            


        Application.Current.MainWindow = new MainWindow();
        Application.Current.MainWindow.Show();

        oldWindow.Close();
    }
}

OnStartup方法是第一次加载主窗口。 ChangeCulture更改区域性,关闭当前窗口,然后再次加载它,从而重新加载所有资源。

要更改区域性并重新加载所有内容,请致电App.ChangeCulture,例如,单击按钮:

    private void AUButton_Click(object sender, RoutedEventArgs e)
    {
        App.ChangeCulture(new CultureInfo("en-AU"));

    }

本文的示例只有一个文本框,其值是从资源中加载的,还有一些按钮可以改变区域性:

    <TextBlock
            Text="{x:Static resx:Resources.Greeting}"
            HorizontalAlignment="Center" Padding="10,5"
            Margin="5"/>

每次加载窗口时,都会基于CurrentUICulture从正确的文件中加载资源

答案 1 :(得分:-1)

另一个主题中有一个类似的问题,请检查它是否正确

See if this helps u