我正在尝试从后面的代码构造一个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;
}
如何逃避此字符串?我尝试了所有可能的方法,但我无法这样做。
答案 0 :(得分:2)
根据代码中的注释,errorMessage包含一个"
,它将被插入(不会转义)到您正在构建的XAML中。然后,此"
将作为Text
属性的结束引用。此时,解析器遇到的下一个非空白字符将是@
,这不是XAML属性名称的允许字符,因此它会停止并报告错误。
这涵盖了原因。至于如何转义它,可以使用XML实体进行双引号:"
请注意,您可能需要将此转义应用于参数中的多个字符。