Сериализация WPF FlowDocuments в / из PackagePart (включая изображения и т. Д.) - PullRequest
3 голосов
/ 03 июля 2011

Я хочу иметь возможность хранить несколько FlowDocuments в одном пакете, включая изображения и т. Д. В каждом документе.Однако ни один из методов, которые я видел для сохранения (и загрузки) Xaml FlowDocuments, кажется, не способен на это.

  • TextRange.Save с DataFormats.Xaml удаляет изображения и другой встроенный контент
  • TextRange.Save с DataFormats.XamlPackage создает совершенно новый пакет, а не позволяет мне обрабатывать документ и включенные изображения как части в пакете. Я бы сохранял его в
  • XamlWriter выглядит так, как будто это может быть хорошодля этого, но я не могу понять, как найти все встроенные объекты для вставки их собственных частей (хотя я, конечно, знаю, как обращаться с ними, когда я их нашел).С другой стороны, я понятия не имею, как впоследствии заставить все загружаться правильно.

Довольно досадно, что нет единого способа сериализации FlowDocument, его изображений и т. Д. ДляPackagePart.Если кто-нибудь нашел хороший способ сделать это, как бы вы это применили?

ОБНОВЛЕНИЕ 2011-07-03 00: 22: Использование XamlWriter и некоторого дополнительного кода из этот вопрос Мне удалось создать счастливый маленький OPC-совместимый пакет, который может содержать несколько FlowDocuments, включая их изображения, в виде PackageParts.Однако пойти другим путем (из PackagePart в FlowDocument) не удается, потому что независимо от того, как я пытаюсь загрузить документ, я получаю XamlParseExceptions, говорящие мне, что

'Инициализация' System.Windows.Media.Imaging.BitmapImage 'сгенерировал исключение.'

Итак, теперь возникает вопрос, как мне обработать поток XamlReader.Load и / или потока моей части, чтобы правильно загрузить соответствующие изображения?

1 Ответ

2 голосов
/ 03 июля 2011

Разобрался. Решение состоит в том, чтобы вручную обработать документ Xaml перед его передачей в XamlReader. Для изображений (и других элементов, хранящихся как их собственные PackageParts) необходимо, чтобы свойство BitmapImage.UriSource было установлено для включения Uri пакета (например, «./Image1.png» в /Content/Document.xaml to «pack: // file»). : ,,, C:., Проекты, Package.pak / Content / 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, если не может попасть в сам пакет.

...