我正在尝试使用转换器实现我自己的翻译器。在转换器中,我调用一个包含翻译的静态类。此转换在应用程序启动时加载。
对我来说,使用此转换器的主要优势有三个:
- 我基于 XML 语言文件在运行时翻译文本。
- 执行应用程序时,我在其他XML文件中注册文本而不进行翻译,因此以后可以添加翻译。
- 在需要时,转换也会应用于数据。
当要翻译的文本来自绑定属性时,一切正常,例如:
<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