Сериализация 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 ").

Два предостережения, однако:

  1. Есть проблема с PackUriHelper.Create(Uri,Uri) тем не мение. Вместо того, чтобы использовать

    PackUriHelper.Create(packUri, part.Uri))
    

    ты должен использовать

    new Uri(packUri.ToString() + value)
    

    где value является частью.Ури с начальным / удаленным. Если вы этого не сделаете, вместо правильного Uri, подобного указанному выше, вы получите один с дополнительной запятой после имени файла пакета, что смущает и раздражает XamlReader.

  2. Вам нужно использовать FileShare.Read при открытии пакета, так как XamlReader попытается открыть его сам. По умолчанию Package.Open блокирует всех, кто пытается открыть пакет, и XamlReader.Load генерирует исключение WebException, если он не может попасть в сам пакет.

Другие вопросы по тегам