WPF字符串转义 - 创建控件模板时抛出异常

时间:2011-05-20 06:06:23

标签: wpf exception escaping controltemplate

我正在尝试从后面的代码构造一个Control模板。事情一直很好,直到最近我发现代码因为字符串中的转义字符而抛出异常。通过从资源文件中检索动态构造错误消息。

例外是

PresentationFramework.dll中出现'System.Windows.Markup.XamlParseException'类型的第一次机会异常 附加信息:名称不能以“@”字符开头,十六进制值0x40。第1行,第537位。

 //In this case when exception is thrown, 
 //string errorMessage = "Name cannot contain any of the following characters  $ \" @ ; ^ |   "


    public static ControlTemplate GetErrorTemplate(string errorMessage)
    {
        string xamlString = "<ControlTemplate xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" " +
                                  "xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" " +
                                  "xmlns:nicefx=\"clr-namespace:NiceFx.Interop.UIComponents;assembly=NiceFx\" " +
                                  "xmlns:wpfkit=\"http://schemas.microsoft.com/wpf/2008/toolkit\" >" +
                                  " <DockPanel  LastChildFill=\"True\">" +
                                  "<TextBlock Foreground=\"White\" Background=\"Red\" FontSize=\"12\" Padding=\"2\" FontFamily=\"Trebuchet MS\"  Margin=\"5,5,0,0\" TextWrapping=\"Wrap\" DockPanel.Dock=\"Bottom\" Text=\"" + errorMessage + "\"></TextBlock>" +
                                  "<AdornedElementPlaceholder />" +
                                  " </DockPanel>" +
                                  " </ControlTemplate>";

        //EXCEPTION OCCURS IN THIS LINE
        ControlTemplate ct = (ControlTemplate)XamlReader.Load(XmlReader.Create(
            new StringReader(xamlString)));

        return ct;
    }

如何逃避此字符串?我尝试了所有可能的方法,但我无法这样做。

1 个答案:

答案 0 :(得分:2)

根据代码中的注释,errorMessage包含一个",它将被插入(不会转义)到您正在构建的XAML中。然后,此"将作为Text属性的结束引用。此时,解析器遇到的下一个非空白字符将是@,这不是XAML属性名称的允许字符,因此它会停止并报告错误。

这涵盖了原因。至于如何转义它,可以使用XML实体进行双引号:&quot;请注意,您可能需要将此转义应用于参数中的多个字符。