在click事件中更改C#代码中的资源文件

时间:2013-07-08 17:58:46

标签: c# wpf resx buttonclick

我正在学习界面本地化并在Visual Studio 2008中使用WPF。我的程序的目标是使用户可以单击按钮并更改窗口中显示的语言。当用户单击按钮时,我一直在尝试在代码隐藏部分中运行时更改我的资源文件。

我已阅读此问题:Programmatically change resource file language (resx) in Code Behind

但是,这对我来说似乎不是一个解决方案,因为我想在按钮点击事件上进行上述更改。当我尝试这样做时,似乎我无法使用此解决方案,因为来自其他问题的受保护功能无法进入操作事件。

根据上一个问题,以下是我没有运气的尝试:

/// Change to English-US
        private void Button2_Click(object sender, RoutedEventArgs e)
        {
            protected override void InitializeCulture()
            {
               base.InitializeCulture();
               System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
            }
        }

/// Change to German
        private void Button3_Click(object sender, RoutedEventArgs e)
        {
            protected override void InitializeCulture()
            {
               base.InitializeCulture();
               System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("de-DE");
            }
        }

我已经在学校和我自己编程了几年,所以我不是一个绝对的noobie。但是,我是C#和WPF的新手,这正是我现在正在使用的。据我所知,你不能在函数中使用函数,就像我在代码中一样。我把它放在那里的唯一原因是因为我需要它来处理按钮点击事件。

非常感谢帮助。

这是新代码:

namespace LocalizationConcept
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            Properties.Resources.Culture = new CultureInfo(ConfigurationManager.AppSettings["Culture"]);
            ///InitializeComponent();
        }

        /// Exit Button
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            System.Environment.Exit(0);
        }

        private void ChangeCulture(string cultureKey)
        {
            try
            {
                System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultureKey);
            }
            catch (Exception err)
            {
                System.Environment.Exit(0);
            }
        }

        private void Button2_Click(object sender, RoutedEventArgs e)
        {
            ChangeCulture("en-US");
        }

        private void Button3_Click(object sender, RoutedEventArgs e)
        {
            ChangeCulture("de-DE");
        }
    }
}

2 个答案:

答案 0 :(得分:1)

似乎WPF通过谈论本地化和全球化而不支持Winforms的相同功能。虽然我发现了一些有趣的文章,这些文章一步一步地展示了如何在运行时替换语言。

  • WPF Localization - On-the-fly Language Selection
    • 它提供了一个在运行时替换语言的选项,即时
    • 它的性能优于基于XPath的基于XML的绑定解决方案
    • 可以通过样式,控制模板和数据模板使用
    • 使用默认和自定义格式化程序
    • 转换带参数的带格式文本
    • 它提供了一个Translate自定义标记扩展来编写一个优雅的XAML

  • WPF Runtime Localization
    • 在运行时切换文化 - 自动更新所有本地化元素
    • 使用现有的资源文件结构(* .resx文件),可以在Visual Studio中维护
    • 保持对Expression Blend中工作的本地化元素的设计时支持(希望其他XAML设计应用程序)

答案 1 :(得分:0)

它不需要在它自己的功能中(虽然它可能是)。请考虑以下事项:

    private void ChangeCulture(string cultureKey)
    {
        try
        {
            System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultureKey);
        }
        catch (Exception err)
        {
            // That culture probably doesn't exist
        }
    }

    private void ButtonA_Click(object sender, EventArgs args)
    {
        ChangeCulture("en-US");
    }

    private void ButtonB_Click(object sender, EventArgs args)
    {
        ChangeCulture("de-DE");
    }

编辑:

I found this on another post它获得了+100赏金,所以我认为这是一个很好的解决方案。看看吧。