WPF 转换器静态文本



我正在尝试使用转换器实现我自己的翻译器。在转换器中,我调用一个包含翻译的静态类。此转换在应用程序启动时加载。

对我来说,使用此转换器的主要优势有三个:

  1. 我基于 XML 语言文件在运行时翻译文本。
  2. 执行应用程序时,我在其他XML文件中注册文本而不进行翻译,因此以后可以添加翻译。
  3. 在需要时,转换也会应用于数据。

当要翻译的文本来自绑定属性时,一切正常,例如:

<TextBox Grid.Row="1" Text="{Binding NameToShow, Converter={StaticResource TranslationConverter}}"></TextBox>

问题是翻译静态文本,如标签、按钮内容......这个想法是做这样的东西:

<Button Content={Binding "MyText",Converter={StaticResource TranslationConverter}} Command="{Binding InitializeAdapterCommand}"></Button>

显然,我既不想在资源中声明静态字符串,也不要使用可绑定属性。

有什么建议吗?

您可以使用Binding.Source属性将常量值传递给转换器:

Text="{Binding Source='My Text', Converter={StaticResource TranslationConverter}}"

您可以创建自己的MarkupExtension,而不是依赖绑定:

public class StaticTranslation : MarkupExtension
{
public StaticTranslation()
{
}
public StaticTranslation(string textToTranslate)
{
TextToTranslate = textToTranslate;
}
public string TextToTranslate { get; set; }
public IValueConverter Converter { get; set; }
public object ConverterParameter { get; set; }
public override object ProvideValue(IServiceProvider serviceProvider)
{
if (Converter != null)
{
return Converter.Convert(TextToTranslate, typeof(string), ConverterParameter, CultureInfo.CurrentUICulture);
}
return TextToTranslate;
}
}

并在lib成为xmlns:lib=[namespace containing StaticTranslation]的情况下使用它

<TextBlock Text="{lib:StaticTranslation 'ABC',Converter={StaticResource TranslationConverter}}"/>

当然,StaticTranslation中的转换器使用情况只是一个例子。您可能需要测试/改进用于生产用途的代码。

旁注:

如果在嵌套Converter={StaticResource TranslationConverter}时出错,请将标记扩展移动到单独的类库项目中。请参阅以下内容:https://stackoverflow.com/a/11785549/5265292

最新更新