Adaptive OverrideMetadata
Некоторая форма перезагрузки неизбежна, поскольку изменение свойства Language
элемента управления не приводит к обновлению его текста.
Однако есть способ переопределения метаданных, который позволяет вам установить их один раз и иметь новые элементы управления, автоматически использующие текущую культуру:
FrameworkElement.LanguageProperty.OverrideMetadata(
typeof(FrameworkElement),
new FrameworkPropertyMetadata(
System.Windows.Markup.XmlLanguage.Empty,
default(PropertyChangedCallback),
_CoerceCurrentXmlLang));
, где CoerceValueCallback
равно
private static object _CoerceCurrentXmlLang(DependencyObject d, object baseValue)
{
var lang = baseValue as System.Windows.Markup.XmlLanguage;
var culture = System.Globalization.CultureInfo.CurrentUICulture;
return lang != null && lang.IetfLanguageTag.Equals(culture.Name, StringComparison.InvariantCultureIgnoreCase)
? lang
: System.Windows.Markup.XmlLanguage.GetLanguage(culture.Name);
}
Само по себе этого недостаточно, поскольку вновь созданные элементы управления получат значение по умолчанию System.Windows.Markup.XmlLanguage.Empty
без принудительного применения. Однако, если вы затем установите xml:lang=""
в XAML вашего окна, это будет принудительно выполнено, и тогда каждый новый элемент управления увидит, что он наследует значение от своего родителя, и будет принудительно его приводить. В результате новые элементы управления, добавленные в это окно, будут использовать текущий язык.
PS Как и во многих вещах в WPF, было бы немного проще, если бы они не были так заинтересованы в сохранении вещей internal
. DefaultValueFactory
было бы гораздо более элегантным способом сделать это.
Перезарядка
Самый экстремальный, но надежный способ перезагрузки - просто создать новое главное окно и удалить старое.
Почти столь же экстремальным, но не совсем, является организация изменения языковых настроек только в очень простой панели главного окна с очень небольшим количеством загруженных, и это очень мало, чтобы быть полностью привязанным к модели представления, которая поддерживает форсирование свойства изменил уведомление для всего.
Существующие ответы на этот вопрос имеют другие предложения.