WPF string escapeing - при создании шаблона элемента управления возникает исключение - PullRequest
1 голос
/ 20 мая 2011

Я пытаюсь построить шаблон управления из кода позади.До недавнего времени все работало нормально. Я обнаружил, что код генерирует исключение из-за escape-символов в строке.Сообщение об ошибке динамически создается путем извлечения из файла ресурсов.

Исключение составляет

Первое исключение типа "System.Windows.Markup.XamlParseException" произошло в PresentationFramework.dll.Дополнительная информация: Имя не может начинаться с символа '@', шестнадцатеричное значение 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 Ответ

2 голосов
/ 20 мая 2011

Согласно комментарию в вашем коде, errorMessage содержит ", который будет вставлен (без экранирования) в создаваемый вами XAML.Этот " будет действовать как заключительная кавычка атрибута Text.На этом этапе следующим непробельным символом, с которым сталкивается анализатор, будет @, что не разрешено для имени атрибута XAML, поэтому он останавливается и сообщает об ошибке.

Это охватываетЗачем.Что касается того, как избежать этого, вы можете использовать сущность XML для двойной кавычки: &quot; Обратите внимание, что вам может потребоваться применить это экранирование к нескольким символам в вашем параметре.

...