【问题标题】:string value as resource key in xaml字符串值作为 xaml 中的资源键
【发布时间】:2018-03-11 17:35:02
【问题描述】:

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

问题是我不能用"" 包围密钥。 这意味着如果字符串中存在逗号,则将其解释为多个键。我通过在键周围包裹特殊的"" 解决了这个问题:

&quot;  <!-- Double quote symbol -->

https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/how-to-use-special-characters-in-xaml

如果我想在文本/键中使用逗号,语法真的很混乱。颜色突出显示也很疯狂。

<Label Content="{l:Translate Some kind of string}"/>
<Label Content="{l:Translate &quot;With comma, not causing trouble if quoted&quot;}"/>

有没有其他方法可以编写内联密钥,XAML 编辑器不会发疯,我不需要在密钥之前和之后添加特殊的 "

【问题讨论】:

    标签: c# wpf xaml markup-extensions


    【解决方案1】:

    您的问题有一个非常简单的解决方案:将您的字符串用单引号括起来 (')。您可以在in this MSDN article 找到有关如何处理标记扩展的所有信息。

    要点:

    MEMBERNAME 或 STRING 的文本值读取如下。使用前导空白字符而不在生成的令牌中表示。 如果第一个非空白字符是引号(Unicode 代码点 0022,引号或 0027,撇号),分词器将按如下方式进行:

    第一个引号被消费了,并且没有在令牌的值中表示。

    文本值成为直到但不包括下一个匹配的引号(即与开头引号相同的代码点的字符)之前没有“\”字符的字符。所有这些字符以及结束引号都被消耗掉了。结果文本值中的所有“\”字符都将被删除。

    结束引号后面的空格字符被消耗,并且不在令牌中表示。

    所以你可以这样写:

    <Label Content="{l:Translate 'With comma, not causing trouble if quoted'}"/>
    

    如果您想完全摆脱任何类型的引号,您当然可以采用这样的解决方法:

    public TranslateExtension(string value1, string value2)
    {
        _value = value1 + ", " + value2;
    }
    
    public TranslateExtension(string value1, string value2, string value3)
    {
        _value = value1 + ", " + value2 + ", " + value3;
    }
    
    // etc.
    

    这当然可能会弄乱你的空格,不幸的是 MarkupExtensions 不能使用 params 关键字,所以你必须为任意数量的逗号添加构造函数。

    【讨论】:

    • 是的,当我创建标记扩展时,我做了一个骇人听闻的解决方案,但很快就放弃了它。似乎单引号解决方案完全是我所需要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多