在我的WPF解决方案中,我创建了一个自定义翻译标记扩展。我使用输入键作为要显示的默认语言字符串。当用户更改语言时,我只需将资源绑定值更新为已翻译的版本。 如果最终用户不想拥有多种语言并且他不想维护单独的资源文件,这真的很甜蜜。
问题是我无法用""
包围密钥。
这意味着如果字符串中存在逗号,则它被解释为多个键。我通过在密钥周围包裹特殊""
来解决这个问题:
" <!-- Double quote symbol -->
https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/how-to-use-special-characters-in-xaml
如果我想在text / key中使用逗号,语法会非常混乱。色彩突出也很疯狂。
<Label Content="{l:Translate Some kind of string}"/>
<Label Content="{l:Translate "With comma, not causing trouble if quoted"}"/>
有没有其他方法可以将内联键编写在XAML编辑器不会发疯的位置,而且我不需要在键前面和键后面添加特殊的"
?
答案 0 :(得分:1)
您的问题有一个非常简单的解决方案:用单引号('
)包裹您的字符串。您可以找到有关如何处理标记扩展的所有信息in this MSDN article。
它的要点:
MEMBERNAME或STRING的文本值如下所示。消耗前导空白字符而不在生成的令牌中表示。 如果第一个非空白字符是引号(Unicode代码点0022,引号或0027,Apostrophe),则tokenizer按如下方式继续:
第一个引用已消耗,并且未在令牌的值中表示。
文本值成为最多但不包括下一个匹配引号的字符(即与开头引号相同的代码点的字符),前面没有“\”字符。所有这些字符以及结束语都被消耗掉了。将删除生成的文本值中的任何“\”字符。
结束引号后面的空格字符被使用,并且不会在令牌中表示。
所以你可以这样写:
<Label Content="{l:Translate 'With comma, not causing trouble if quoted'}"/>
如果你想完全摆脱任何类型的引用,你当然可以采取像这样的hacky解决方法:
public TranslateExtension(string value1, string value2)
{
_value = value1 + ", " + value2;
}
public TranslateExtension(string value1, string value2, string value3)
{
_value = value1 + ", " + value2 + ", " + value3;
}
// etc.
这当然可能搞乱你的空格,遗憾的是MarkupExtensions无法使用params
关键字,所以你必须为任意数量的逗号添加构造函数。