【问题标题】:Change resource file in C# code behind in click event在单击事件中更改 C# 代码中的资源文件
【发布时间】:2025-12-26 00:10:11
【问题描述】:

我正在学习界面本地化并在 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");
            }
        }

我已经在学校和自己编程了几年了,所以我不是绝对的菜鸟。但是,我是 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");
        }
    }
}

【问题讨论】:

    标签: c# wpf resx buttonclick


    【解决方案1】:

    说到本地化和全球化,WPF 似乎不支持 Winforms 的相同功能。虽然我发现了一些有趣的文章,它们逐步展示了如何在运行时即时替换语言。

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

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

    【讨论】:

      【解决方案2】:

      它不需要在它自己的函数中(尽管它可能是)。考虑以下几点:

          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 赏金,所以我认为这是一个很好的解决方案。看看吧。

      【讨论】:

      • 我完全抹掉了之前的按钮点击事件,并输入了这个。编译器没有问题,但是点击按钮时语言没有改变。我将发布新代码。 - 还需要注意的是,我有一个 app.config 文件,在运行程序之前我一直在使用它来更改语言。
      • 我刚刚添加了一个类似帖子的链接,该帖子对此有很好的答案,尽管涉及更多。
      • 我正在尝试本地化界面中的所有文本。按钮、文本框和选项卡项上有文本。该链接也适用于那些人吗?我问的唯一原因是因为他们总是将字符串编码到 XAML 窗口中作为示例。