【问题标题】:How can I use StringFormat in Resx text (WPF .xaml)?如何在 Resx 文本 (WPF .xaml) 中使用 StringFormat?
【发布时间】:2017-03-14 09:11:39
【问题描述】:

我想在 Resx 文件中使用文本字符串并添加另一个文本。 例如,

 <Label Content="{Resx example}" ContentStringFormat="+++ {0}"

如果我这样使用,它会显示 "+++ Example" 。 (“示例”在 resx 文件中。)

但是,如果我尝试使用 TextBlock,我将无法使用 StringFormat。 例如,

<TextBlock Text="{Resx example, StringFormat="+++ {0}"} ...

我不能这样编码。如何使用 Resx 编写额外的文本? 请帮助我... :(

【问题讨论】:

  • 您的示例中的 Resx 是什么?它是自定义标记扩展吗?
  • 我引用了“Infralution 本地化 wpf dll”,并创建了资源文件 (StringResource.resx) 来更改语言。 @帕维尔

标签: wpf xaml string-formatting resx


【解决方案1】:

我认为您在 +++ 之前只缺少一个 {} 以使该字符串格式有效, 像

<TextBlock Text="{Binding example,StringFormat={}+++{0}}"/>

【讨论】:

    【解决方案2】:

    看起来“Infralution 本地化 wpf dll”不支持此功能。但由于它是一个开源项目,您可以获取它的源代码并修改 ResxExtension 类。您将不得不再添加一个属性 (StringFormat) 并修改 GetValue 方法以使用它。或者,如果您不想编辑源代码,您可以创建自己的从 ResxExtension 继承的标记扩展,添加属性并覆盖 GetValue 方法。

    但是对于简单的情况,当你不需要复杂的格式化时,你可以尝试另一种方式。由于 TextBlock 实际上包含了内联元素的集合,所以可以尝试如下使用:

    <TextBlock>
        <Run Text="+++" />
        <Run Text="{Resx example, BindingMode=OneWay}" />
    </TextBlock>
    

    这样,您还将从“示例”资源中获取以“+++”开头的字符串

    【讨论】:

      【解决方案3】:

      由于您正在尝试本地化您的应用程序,这可能会变得很方便:

      在我的项目中,我为所有 resx (如 Strings.de.resx、Strings.fr.resx 等)创建了一个名为“Strings”的文件夹。

      然后添加

      xmlns:loc="<yourPathToYourFolderContainigResxFiles>"
      

      然后像这样绑定:

      <TextBlock Text="{x:Static loc:Strings.TEST}" />
      

      注意:

      • 要在 Strings.xxx 上获得智能感知,您需要编译 resx,因此首先构建。
      • 这将根据您的线程的CurrentUICulture 自动选择。
      • Access Modifier 需要公开!

      这是我的主窗口:

      由于这不是Binding,因此您不能在此处使用StringFormat

      因此,您要么需要向保存您的值的 ViewModel 添加一个属性,要么需要将完整的字符串放在您的 resx 中。

      【讨论】:

      • 感谢您的友好回答。 :)
      【解决方案4】:

      (我知道迟到的答案,但对于其他可能会在这里查看的人......)

      “使用 RESX 文件进行 WPF 本地化”(https://www.codeproject.com/articles/35159/wpf-localization-using-resx-files) 的 CodeProject 页面中的说明有一个“格式化绑定数据”部分解决了这个问题。基本上看看 BindingElementName 和 BindingPath...

      他们给出的例子:

      <Resx Key="MyFormatString" BindingElementName="_fileListBox" BindingPath="SelectedItem"/>
      

      <Resx Key="MyMultiFormatString">
          <Resx BindingElementName="_fileListBox" BindingPath="Name"/>
          <Resx BindingElementName="_fileListBox" BindingPath="SelectedItem"/>
      </Resx> 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-16
        • 1970-01-01
        • 1970-01-01
        • 2018-01-27
        • 1970-01-01
        • 1970-01-01
        • 2014-08-22
        相关资源
        最近更新 更多