Изменить файл ресурса в коде C# позади в событии клика
Я изучаю локализацию интерфейса и использую WPF в Visual Studio 2008. Моя цель для моей программы - сделать так, чтобы пользователь мог нажать кнопку и изменить язык, отображаемый в окне. Я пытался изменить свои файлы ресурсов во время выполнения в разделе кода позади, когда пользователь нажимает кнопку.
Я прочитал этот вопрос: программно изменить язык файла ресурсов (resx) в коде позади
Тем не менее, это не похоже на решение для меня, потому что я хочу внести вышеуказанные изменения в событие нажатия кнопки. Когда я пытаюсь сделать это, кажется, что я не могу использовать это решение, потому что защищенная функция из другого вопроса не может войти в событие действия.
Вот то, что я попробовал без удачи, основываясь на предыдущем вопросе:
/// 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");
}
}
}
2 ответа
Похоже, что WPF не поддерживает те же функции Winforms, говоря о локализации и глобализации. Хотя я нашел несколько интересных статей, которые показывают шаг за шагом, как заменить язык во время выполнения, на лету.
- Локализация WPF - выбор языка на лету:
- Он предоставляет возможность замены языков во время выполнения, на лету
- Он работает лучше, чем слабое решение для связывания на основе XML, XPath
- Его можно использовать через стили, шаблоны управления и шаблоны данных
- Он переводит форматированный текст с параметрами, используя стандартные и пользовательские форматеры
- Предоставляет собственное расширение разметки Translate для написания элегантного XAML
- WPF локализация времени выполнения
- Переключение культур во время выполнения - автоматическое обновление всех локализованных элементов
- Используйте существующую файловую структуру ресурсов (файлы *.resx), которую можно поддерживать в Visual Studio
- Сохраняйте поддержку во время разработки для локализованных элементов, работающих в 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 к награде, так что я думаю, что это отличное решение. Проверьте это.