WPF 转换器静态文本
WPF Converter Static Text
我正在尝试使用转换器实现我自己的翻译器。在转换器中,我调用了一个包含翻译的静态 class。此翻译在应用程序启动时加载。
我使用这个转换器的主要优点有三个:
- 我根据 XML 语言文件在运行时翻译文本。
- 在执行应用程序时,我在其他 XML 文件中注册了没有翻译的文本,以便稍后添加翻译。
- 翻译也会根据需要应用于数据。
当要翻译的文本来自绑定 属性 时,一切正常,例如:
<TextBox Grid.Row="1" Text="{Binding NameToShow, Converter={StaticResource TranslationConverter}}"></TextBox>
问题是翻译静态文本,如标签、按钮内容...想法是这样的:
<Button Content={Binding "MyText",Converter={StaticResource TranslationConverter}} Command="{Binding InitializeAdapterCommand}"></Button>
显然,我既不想在资源中声明静态字符串,也不想使用可绑定属性。
有什么建议吗?
您可以创建自己的 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}
时出错,请将标记扩展移至单独的 class 库项目。请参阅以下内容:
您可以使用 Binding.Source
属性 将常量值传递给转换器:
Text="{Binding Source='My Text', Converter={StaticResource TranslationConverter}}"
我正在尝试使用转换器实现我自己的翻译器。在转换器中,我调用了一个包含翻译的静态 class。此翻译在应用程序启动时加载。
我使用这个转换器的主要优点有三个:
- 我根据 XML 语言文件在运行时翻译文本。
- 在执行应用程序时,我在其他 XML 文件中注册了没有翻译的文本,以便稍后添加翻译。
- 翻译也会根据需要应用于数据。
当要翻译的文本来自绑定 属性 时,一切正常,例如:
<TextBox Grid.Row="1" Text="{Binding NameToShow, Converter={StaticResource TranslationConverter}}"></TextBox>
问题是翻译静态文本,如标签、按钮内容...想法是这样的:
<Button Content={Binding "MyText",Converter={StaticResource TranslationConverter}} Command="{Binding InitializeAdapterCommand}"></Button>
显然,我既不想在资源中声明静态字符串,也不想使用可绑定属性。
有什么建议吗?
您可以创建自己的 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}
时出错,请将标记扩展移至单独的 class 库项目。请参阅以下内容:
您可以使用 Binding.Source
属性 将常量值传递给转换器:
Text="{Binding Source='My Text', Converter={StaticResource TranslationConverter}}"