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

在单击事件中更改C#代码中的资源文件,c#,wpf,resx,buttonclick,C#,Wpf,Resx,Buttonclick,我正在学习界面本地化,并在VisualStudio2008中使用WPF。我的程序的目标是使用户可以单击按钮并更改窗口中显示的语言。当用户单击按钮时,我一直试图在运行时更改代码隐藏部分中的资源文件 我已看完这个问题: 然而,这对我来说似乎不是一个解决方案,因为我想在按钮点击事件中进行上述更改。当我尝试这样做时,似乎无法使用此解决方案,因为来自其他问题的受保护函数无法进入操作事件内部 根据前面的问题,以下是我在没有运气的情况下尝试的内容: /// Change to English-US

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

我已看完这个问题:

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

根据前面的问题,以下是我在没有运气的情况下尝试的内容:

/// 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还不熟悉,这正是我现在正在从事的工作。据我所知,函数中不能有函数,就像我在代码中所做的那样。我把它放在那里的唯一原因是我需要它来处理button click事件

在此方面的帮助将不胜感激

以下是新代码:

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");
        }
    }
}
名称空间本地化概念
{
/// 
///Window1.xaml的交互逻辑
/// 
公共部分类Window1:Window
{
公共窗口1()
{
Properties.Resources.Culture=new CultureInfo(ConfigurationManager.AppSettings[“Culture”]);
///初始化组件();
}
///退出按钮
私有无效按钮1\u单击(对象发送者,路由目标)
{
系统环境退出(0);
}
私有void changecurity(字符串cultureKey)
{
尝试
{
System.Threading.Thread.CurrentThread.CurrentUICulture=新的CultureInfo(cultureKey);
}
捕获(异常错误)
{
系统环境退出(0);
}
}
私有无效按钮2\u单击(对象发送者,路由目标)
{
改变文化(“美国”);
}
私有无效按钮3\u单击(对象发送者,路由目标)
{
改变文化(“德”);
}
}
}

说到本地化和gloablization,WPF似乎不支持Winforms的相同功能。尽管我发现了一些有趣的文章,这些文章一步一步地展示了如何在运行时替换语言,但仍然是动态的

  • :
    • 它提供了在运行时动态替换语言的选项
    • 它的性能比基于XPath的蹩脚XML绑定解决方案要好
    • 它可以通过样式、控制模板和数据模板使用
    • 它使用默认和自定义格式化程序,用参数转换格式化文本
    • 它提供了一个翻译自定义标记扩展来编写优雅的XAML

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

它不需要有自己的功能(尽管可以)。考虑以下事项:

    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");
    }
编辑:


它被授予+100赏金,所以我认为这是一个伟大的解决方案。查看。

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