Как назначить StreamSource в BitmapImage в codebehind?

117
26 декабря 2019, 21:30

Есть zip файл, в котором хранится FlowDocument (Card.xaml) и папка с изображениями (Media). Картинки в FlowDocument имеют Tag, в котором хранят свой путь относительно FlowDocument. Для поиска изображений (FindImages метод): Поиск изображений в FlowDocument

Как я открываю этот zip в RichTextBox:

string nameOfXamlCardDefault = "Card.xaml";
private void Open_Executed(object sender, ExecutedRoutedEventArgs e)
    {
        OpenFileDialog dlg = new OpenFileDialog();
        if (dlg.ShowDialog() == true)
        {
            //Открываем zip файл
            using (FileStream fullCardZipFile = File.Open(dlg.FileName, FileMode.Open, FileAccess.ReadWrite))
            {
                //Смотрим zip c ZipArchive
                using (ZipArchive archive = new ZipArchive(fullCardZipFile, ZipArchiveMode.Update))
                {                        
                    //Получаем entry для нашего xaml (FlowDocument)
                    ZipArchiveEntry xamlFileEntry = archive.GetEntry(nameOfXamlCardDefault);
                    //Открываем xaml
                    using (Stream xamlFileStreamInZip = xamlFileEntry.Open())
                    {                            
                        //Загружаем FlowDocument в rtbEditor.Document
                        rtbEditor.Document = XamlReader.Load(xamlFileStreamInZip) as FlowDocument;
                        //Ищем картинки
                        List<Image> images = FindImages(rtbEditor.Document).ToList();
                        foreach (var image in images)
                        {
                            var imageFileEntry = archive.GetEntry(image.Tag.ToString());                                
                            var bitmap = new BitmapImage();
                            using (Stream imageFileStream = imageFileEntry.Open())
                            {
                                var memoryStream = new MemoryStream();                                    
                                imageFileStream.CopyTo(memoryStream);                                                                        
                                bitmap.BeginInit();
                                bitmap.CacheOption = BitmapCacheOption.OnLoad;
                                bitmap.StreamSource = memoryStream;
                                bitmap.EndInit();
                                image.Source = bitmap;
                            }
                        }                           
                    }
                }
            }
        }
        return;
    }

Все изображения в RichTextBox отображаются, только в BitmapImage нет StreamSource. И потом это приведет к ошибке.

<FlowDocument xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" NumberSubstitution.CultureSource="User" AllowDrop="True" PagePadding="5,0,5,0">    
<Paragraph>       
    <Image Tag="Media/image0.png">            
        <Image.Source>
            <BitmapImage CacheOption="OnLoad" BaseUri="{x:Null}"/>
        </Image.Source>
    </Image>        
    <Image Tag="Media/image1.png">            
        <Image.Source>
            <BitmapImage CacheOption="OnLoad" BaseUri="{x:Null}"/>
        </Image.Source>
    </Image>              
</Paragraph>

Но, если например просто копировать изображение и вставлять в RichTextBox, то это выглядит так и с таким работать можно:

  <Image Height="400" Width="600">
       <Image.Source>
           <BitmapImage CacheOption="OnLoad" UriSource="./Image1.bmp" 
            BaseUri="pack://payload:,,wpf1,/Xaml/Document.xaml"/>
       </Image.Source> 
   </Image>

Возможно ли как-то изображения из zip приводить к такому виду (как при обычном копировании)? Я пытался работать с MemoryStream, делать Freeze(). Также пытался изображения в Clipboard совать и потом их вставлять. Но ни к чему полезному не привело.

READ ALSO
как задать цвет числу в С#?

как задать цвет числу в С#?

Есть код, который переводит все в двоичный кодТеперь мне нужно задать числу 1 - черный цвет, а 0 - белый цвет

134
Вопрос по интеграции Яндекс.Кассы на сайте

Вопрос по интеграции Яндекс.Кассы на сайте

Зарегистрировался в ЯндексКассе

135
Валидация полей в модальном окне

Валидация полей в модальном окне

В моделе есть правила

147