如何在XAML标记扩展属性文字中转义单引号?

时间:2009-08-25 20:23:43

标签: .net xaml escaping markup-extensions

我有一个格式化数字的值转换器(不幸的是我不能使用SP1)。它工作正常,直到达到百分比。

以下是一个例子:

<TextBlock Text="{Binding Path=PercentageComplete,
                          Converter={StaticResource NumberFormatter},
                          ConverterParameter='0.00 %'}" />

不幸的是,当Double.ToString看到一个百分比字符时,它会将该数字乘以100.在我的情况下,该数字已经是一个百分比,不需要转换。

在C#中,这可以通过使用单引号转义%字符来实现:

(99.99).ToString("0.00 %")  // gives -> "9999 %"
(99.99).ToString("0.00 '%") // gives -> "99.99 %"

不幸的是,我不能在上面的XAML标记扩展中的ConverterParameter中使用单引号。有没有办法逃避它?我尝试将单引号加倍并使用反斜杠,但两者都无法编译。

4 个答案:

答案 0 :(得分:11)

未经测试,但您尝试过:

<TextBlock Text="{Binding Path=PercentageComplete,
                      Converter={StaticResource NumberFormatter},
                      ConverterParameter=&quot;0.00 '%&quot;}" />

答案 1 :(得分:9)

以下内容取自http://msdn.microsoft.com/en-us/library/ee200269.aspx

您可以使用反斜杠转义任何字符。它不会解析反斜杠,只是跳过它们。所以:

  • 'foo\'bar'变为foo'bar;
  • "foo\"bar"变为foo"bar;
  • 'foo\\bar'变为foo\bar;
  • 'foo\nbar'变为foonbar而不是换行符。

但是,标记扩展解析非常奇怪。尽管Visual Studio语法突出显示不支持它,但\{},=以外的任何字符都是有效的值字符。这意味着以下结构是合法的:

  • {MyExtension Name=foo'bar}(引号必须是第一个被视为引用字符串的字符;其他任何地方只需逐字复制);
  • {MyExtension Name=f oo}(空格合法;此变为f oo);
  • {MyExtension Name= foo }(值周围的空格被修剪;此变为foo);
  • {MyExtension Name=foo\\bar}\后的字符逐字复制,因此会变为foo\bar);
  • {MyExtension Name=foo \\ bar}(这变为foo \ bar);
  • {MyExtension Name=foo \} bar}(这将成为foo } bar)。

请注意,\规则也适用于此:\后面的任何字符都是逐字复制的。

答案 2 :(得分:3)

您可以使用String.Format而不是Double.ToString

public object Convert( object value, Type targetType, object parameter, System.Globalization.CultureInfo culture ) {
    string format = (string) parameter;

    return String.Format( format, value );
}

在绑定表达式中,使用特殊的{}转义序列:

<TextBlock Text="{Binding PercentageComplete, Converter={StaticResource NumberFormatter}, ConverterParameter='{}{0:0.00} %'}"></TextBlock>

答案 3 :(得分:2)

这是一种避免使用标记扩展的解决方法,但它不能直接回答问题。

<TextBlock>
  <TextBlock.Text>
    <Binding Path="PercentageComplete"
             Converter="{StaticResource NumberFormatter}"
             ConverterParameter="0.00 '%" />
  </TextBlock.Text>
</TextBlock>