【问题标题】:WPF Converter Static TextWPF 转换器静态文本
【发布时间】:2018-02-03 04:39:28
【问题描述】:

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

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

  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>

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

有什么建议吗?

【问题讨论】:

    标签: wpf data-binding static converters


    【解决方案1】:

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

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

    【讨论】:

    • 哦,亲爱的,在选择写我的答案之前,我正在考虑为绑定源提供某种 x:Static,但我完全没有尝试最简单的源分配,已经想复杂了. +1
    • @grek40, "{Binding Source={x:Static smth}}" 也在工作:) (stackoverflow.com/questions/45175467/…)。与"{Binding Source={StaticResource resourseKey}}"相同
    • 是的,我知道...但是我以某种方式尝试将这样的扩展与直接编写文本结合起来,而不是使用它来获取资源或静态属性,因为问题不在于重定向到资源或财产:)
    【解决方案2】:

    您可以创建自己的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

    【讨论】:

    • 完美运行。我已经在一个类库项目中定义了 Converter 以供重用,所以它运行良好。谢谢。
    猜你喜欢
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    相关资源
    最近更新 更多