字符串值作为xaml中的资源键

时间:2018-03-11 17:35:02

标签: c# wpf xaml markup-extensions

在我的WPF解决方案中,我创建了一个自定义翻译标记扩展。我使用输入键作为要显示的默认语言字符串。当用户更改语言时,我只需将资源绑定值更新为已翻译的版本。 如果最终用户不想拥有多种语言并且他不想维护单独的资源文件,这真的很甜蜜。

问题是我无法用""包围密钥。 这意味着如果字符串中存在逗号,则它被解释为多个键。我通过在密钥周围包裹特殊""来解决这个问题:

&quot;  <!-- 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 &quot;With comma, not causing trouble if quoted&quot;}"/>

有没有其他方法可以将内联键编写在XAML编辑器不会发疯的位置,而且我不需要在键前面和键后面添加特殊的"

1 个答案:

答案 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关键字,所以你必须为任意数量的逗号添加构造函数。