У меня есть приложение .NET 4.0 WPF, где пользователь может изменить язык (культуру) Я просто позволю пользователю выбрать язык, создать соответствующий CultureInfo и установить:
Thread.CurrentThread.CurrentCulture = cultureInfo;
Thread.CurrentThread.CurrentUICulture = cultureInfo;
В коде С# это отлично работает. Однако в WPF контролирует культуру по-прежнему в США. Это означает, например, что даты будут отображаться в формате США вместо того, что будет правильным для текущей культуры.
По-видимому, это не ошибка. Согласно MSDN и нескольким сообщениям в блоге и статьям о StackOverflow, язык WPF автоматически не отслеживает текущую культуру. Это en-US, пока вы этого не сделаете:
FrameworkElement.LanguageProperty.OverrideMetadata(
typeof(FrameworkElement),
new FrameworkPropertyMetadata(
XmlLanguage.GetLanguage(CultureInfo.CurrentUICulture.IetfLanguageTag)));
См. например Проблемы с локализацией строки StringFormat в wpf.
Я не совсем понимаю, что здесь происходит. Кажется, что свойство Language на всех элементах структуры задано текущей культурой. Во всяком случае, он работает. Я делаю это, когда приложение запускается, и теперь все элементы управления работают так, как ожидалось, и, например, даты отформатированы в соответствии с текущей культурой.
Но теперь проблема: по MSDN FrameworkElement.LanguageProperty.OverrideMetadata
можно вызывать только один раз. И действительно, если я снова его назову (когда пользователь меняет язык), это вызовет исключение. Поэтому я не решил свою проблему.
Вопрос: как я могу достоверно обновлять культуру в WPF более одного раза и в любое время в жизненном цикле приложений?
(Я нашел это при исследовании: http://www.nbdtech.com/Blog/archive/2009/03/18/getting-a-wpf-application-to-pick-up-the-correct-regional.aspx и, похоже, у него там что-то работает. Однако я не могу представить, как это сделать в моем приложении. Кажется, мне нужно будет обновить язык во всех открытых окнах и элементах управления и обновить все существующие привязки и т.д.)