gpt4 book ai didi

c# - WPF 运行时区域设置更改,重新评估 ValueConverters UI

转载 作者:太空狗 更新时间:2023-10-29 18:28:41 26 4
gpt4 key购买 nike

在大型 WPF 应用程序中,我们有可能在运行时更改语言。我们使用 WPF Localize Extension和用于本地化的 resx 文件,它工作得很好,除了 UI 中使用的转换器。如果在绑定(bind)中 ValueConverter 是特定于文化的,则生成的文本不会在语言更改时更新。

如何让 WPF 在应用程序范围内更新所有已转换的绑定(bind)?

编辑:目前我们已经尝试制作 ValueConverters MultiValueConverters 并将语言环境添加为额外值。这样,值源值会发生变化,结果也会更新。但这既麻烦又丑陋。

<MultiBinding Converter="{StaticResource _codeMultiConverter}" ConverterParameter="ZSLOOPAKT">
<Binding Path="ActivityCode" />
<Binding Source="{x:Static lex:LocalizeDictionary.Instance}" Path="Culture" />
<Binding Source="{x:Static RIEnums:CodeTypeInfo+CodeDisplayMode.Both}" />
</MultiBinding>

相关: Run-time culture change and IValueConverter in a binding(我没有为每个字段手动提高 propertychanged 的​​选项)

最佳答案

这是我们的解决方案。我希望我理解您想要更改的问题,例如 DateTime?

Converter 是一个简单的 IValueConverter,它将值转换为当前语言。 Translator 是一个静态类,它包含(例如)CurrentLanguage (en-en/de-de)作为字符串

如果语言发生变化,则需要行为 来更新绑定(bind)。我们在hole程序中只需要这个实现3-4次,因为它只是针对DateTime的格式化。所有其他文本都保存在动态资源中..

但我认为 Behavior 适合您的需求。

转换器

public class CultureConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value != null)
{
DateTime dateTime;
if(DateTime.TryParse(value.ToString(), out dateTime))
{
if(parameter != null)
{
return dateTime.ToString(parameter.ToString(), new CultureInfo(Translator.CurrentLanguage));
}
return dateTime.ToString(new CultureInfo(Translator.CurrentLanguage));
}
return null;
}
return null;
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return null;
}
}

行为

public class CultureConverter : Behavior<FrameworkElement>
{
private FrameworkElement _HostingControl;
private DependencyProperty _HostingControlDependencyProperty;

protected override void OnAttached()
{
base.OnAttached();

_HostingControl = AssociatedObject;

_InitHostingControl();
Translator.LanguageChanged += Translator_LanguageChanged;
}

protected override void OnDetaching()
{
Translator.LanguageChanged -= Translator_LanguageChanged;

base.OnDetaching();
}

private void Translator_LanguageChanged(string languageCode)
{
if(_HostingControlDependencyProperty != null)
_HostingControl.GetBindingExpression(_HostingControlDependencyProperty).UpdateTarget();
}

private void _InitHostingControl()
{
if(_HostingControl is TextBlock)
{
_HostingControlDependencyProperty = TextBlock.TextProperty;
}
else if (typeof(TextBox) == _HostingControl.GetType())
_HostingControlDependencyProperty = TextBox.TextProperty;
}

XAML

<Window.Resources>
<XamlConverter:CultureConverter x:Key="CultureConverter"/>
<Window.Resources>


<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock
Text="{Binding CreatedOn, ConverterParameter=f, Converter={StaticResource CultureConverter}, UpdateSourceTrigger=PropertyChanged}">
<i:Interaction.Behaviors>
<Behaviors:CultureConverter/>
</i:Interaction.Behaviors>
</TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>

预览

preview

关于c# - WPF 运行时区域设置更改,重新评估 ValueConverters UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43974671/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com