Сериализация WPF FlowDocuments в / из PackagePart (включая изображения и т. Д.)
Я хочу иметь возможность хранить несколько документов FlowDocuments в одном пакете, включая изображения и т. Д. В каждом документе. Однако ни один из методов, которые я видел для сохранения (и загрузки) Xaml FlowDocuments, кажется, не способен на это.
- TextRange.Save с DataFormats.Xaml снимает изображения и другой встроенный контент
- TextRange.Save с DataFormats.XamlPackage создает совершенно новый пакет, а не позволяет мне обрабатывать документ и включенные изображения как части пакета, в котором я буду его хранить
- XamlWriter выглядит так, как будто это может быть полезно для этого, но я не могу понять, как найти все встроенные объекты для вставки их собственных частей (хотя я, конечно, знаю, как обращаться с ними, как только я их найду). С другой стороны, я понятия не имею, как в дальнейшем все правильно загрузить.
Довольно досадно, что нет единого способа сериализации FlowDocument, его изображений и т. Д. В PackagePart. Если кто-нибудь нашел хороший способ сделать это, как ты справился?
ОБНОВЛЕНИЕ 03-07-2011, 00:22: Используя XamlWriter и некоторый дополнительный код из этого вопроса, я смог создать счастливый маленький OPC-совместимый пакет, который может содержать несколько FlowDocuments, включая их изображения, в виде PackageParts. Однако перейти в другую сторону (из PackagePart в FlowDocument) не удается, потому что независимо от того, как я пытаюсь загрузить документ, я получаю XamlParseExceptions, говорящие мне, что
'Инициализация' System.Windows.Media.Imaging.BitmapImage 'вызвала исключение.'
Итак, теперь возникает вопрос: как мне вручную обработать XamlReader.Load и / или поток моей части, чтобы правильно загрузить соответствующие изображения?
1 ответ
Догадаться. Решение состоит в том, чтобы вручную обработать документ Xaml перед его передачей в XamlReader. Для изображений (и других элементов, хранящихся как их собственные PackageParts) необходимо, чтобы свойство BitmapImage.UriSource было установлено для включения Uri пакета (например, "./Image1.png" в /Content/Document.xaml to "pack://file").:,,, С:, Проекты,Package.pak / Содержание / Image1.png ").
Два предостережения, однако:
Есть проблема с
PackUriHelper.Create(Uri,Uri)
тем не мение. Вместо того, чтобы использоватьPackUriHelper.Create(packUri, part.Uri))
ты должен использовать
new Uri(packUri.ToString() + value)
где
value
является частью.Ури с начальным / удаленным. Если вы этого не сделаете, вместо правильного Uri, подобного указанному выше, вы получите один с дополнительной запятой после имени файла пакета, что смущает и раздражает XamlReader.Вам нужно использовать FileShare.Read при открытии пакета, так как XamlReader попытается открыть его сам. По умолчанию Package.Open блокирует всех, кто пытается открыть пакет, и XamlReader.Load генерирует исключение WebException, если он не может попасть в сам пакет.