如何在 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>
我想在 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>