У меня есть коллекция данных, которую необходимо преобразовать в файл .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();