如何在 Resx 文本 (WPF .xaml) 中使用 StringFormat?

How can I use StringFormat in Resx text (WPF .xaml)?

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

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

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

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

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

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

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

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

看起来 'Infralution localization wpf dll' 不支持此功能。但作为一个开源项目,您可以获取其源代码并修改 ResxExtension class。您必须再添加一个 属性 (StringFormat) 并修改 GetValue 方法才能使用它。或者,如果您不想编辑源代码,您可以创建自己的从 ResxExtension 继承的标记扩展,添加 属性 并覆盖 GetValue 方法。

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

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

通过这种方式,您还可以从 "example" 资源中获取前缀为“+++”的字符串

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

在我的项目中,我有一个名为 'Strings' 的文件夹,用于所有 resx,如 Strings.de.resx、Strings.fr.resx 等

然后去添加

xmlns:loc="<yourPathToYourFolderContainigResxFiles>"

然后像这样绑定:

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

注:

  • 要在 Strings.xxx 上获得 intellisens,您需要编译 resx,因此请先构建。
  • 这将根据您的线程的 CurrentUICulture 自动选择。
  • Access Modifier 需要 public !

这是我的主窗口:

因为这不是 Binding 你不能在这里使用 StringFormat

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

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

"WPF Localization Using RESX Files" (https://www.codeproject.com/articles/35159/wpf-localization-using-resx-files) 的 CodeProject 页面中的说明有一个 "Formatting Bound Data" 部分解决了这个问题。基本上查看 BindingElementName 和 BindingPath...

他们给出的例子:

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

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