Написание FlowDocument xaml с пространством имен с использованием XmlWriter - PullRequest
2 голосов
/ 25 января 2011

У меня есть коллекция данных, которую необходимо преобразовать в файл .xaml, который впоследствии можно будет загрузить как FlowDocument в FlowDocumentReader. Я не создаю непосредственно экземпляры Paragraphs, Runs, скорее, я генерирую xaml, чтобы создать документ позже.

Что я пробовал:

Я перебираю данные, создавая XElements для абзацев, прогонов, InlineUIContainers и т. Д., И очень хорошо создаю структуру FlowDocument, а затем вызываю:

XmlWriter writer = XmlWriter.Create("output.xaml");
flowDocElem.WriteTo(writer);
writer.Close();

В приложении-потребителе я делаю это:

flowDocument = XamlReader.Load(xamlFile) as FlowDocument;
flowDocumentReader.Document = flowDocument;
xamlFile.Close();

Но загрузка не удалась, потому что он не знает, что такое FlowDocument. Элемент FlowDocument выглядит так:

<FlowDocument Name="testDoc">

(Там нет пространства имен, чтобы пролить свет на то, что такое FlowDocument, когда он читается.)

Если я отредактирую .xaml и отредактирую элемент следующим образом:

<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Name="testDoc">

Тогда он будет нормально загружаться.

При создании XElement для FlowDocument я пытался сделать это:

new XElement("FlowDocument", new XAttribute("Name", "testDoc"), new XAttribute("xmlns", "http://schemas.microsoft.com/winfx/2006/xaml/presentation"));

но это тоже не работает - выдает ошибку, если я пытаюсь создать атрибут пространства имен.

Я могу полностью обмануть и прочее, что xmlns в элемент, а затем вызвать что-то вроде

File.WriteAllText("output.xaml", fixedTxt);

но это кажется грязным, и поэтому я думаю, что просто делаю это неправильно.

Мысли


Обновление:

Хотя это, вероятно, не предписывающее решение проблемы, оно работает :

Добавив ParserContext в XamlReader, я смог решить проблему с загрузкой FlowDocument xml.

FileStream xamlFile = new FileStream("output.xaml", FileMode.Open, FileAccess.Read);
XamlReader x = new XamlReader();
ParserContext parserContext = new ParserContext();
parserContext.XmlnsDictionary.Add("","http://schemas.microsoft.com/winfx/2006/xaml/presentation");
flowDocument = XamlReader.Load(xamlFile, parserContext) as FlowDocument;
flowDocumentReader.Document = flowDocument;
xamlFile.Close();

Ответы [ 2 ]

2 голосов
/ 25 января 2011

Попробуйте использовать XamlWriter вместо XmlWriter.

0 голосов
/ 25 января 2011

Если вы используете XLinq, попробуйте следующее:

XNamespace ns = @"http://schemas.microsoft.com/winfx/2006/xaml/presentation";
XNamespace xns = @"http://schemas.microsoft.com/winfx/2006/xaml";
XElement someElement = new XElement(ns + "FlowDocument",
                           new XAttribute(xns + "Name", name),
                           ...);
...