2013-05-24 3 views
0

У меня есть проект WPF, в котором мы используем некоторый элемент управления WindowsForm (сводная таблица из OWC, веб-компонент Office). Однако, поскольку PivotTable не поддерживает печать очень хорошо, единственный способ, которым мы можем думать, - распечатать файл изображения PivotTable export (другой способ - распечатать из экспортированного файла Excel, но мы хотим избежать его, так как он не гарантирован что Excel установлен на машине).Создайте элемент Framework из файла BitmapImage, а затем уничтожьте его?

У нас уже есть один проект печати, который будет хорошо печатать WPF ElementFramework. Поэтому я хочу использовать этот фрагмент кода. Теперь мой вопрос: как я могу сгенерировать FrameworkElement из BitmapImage из кода. Поскольку этот FrameworkElement предназначен исключительно для печати, поэтому, я думаю, я должен создать его из кода, возможно, назначить ему родителя, а не показывать его на экране, а после печати уничтожить FrameworkElement, чтобы в конечном итоге я смог удалить файл temp BitmapImage ,

Так что это невозможно. Я даже не знаю, правильно ли это: создать элемент пользовательского интерфейса для некоторых работ, не связанных с UI? Есть ли советы по этому поводу? Благодаря!

+0

сделать я вас правильно понял вы хотите конвертировать в 'BitmapImage' к' FrameworkElement'? – WiiMaxx

+0

@WiiMaxx, да. Но этот элемент FrameworkElement не относится к какому-либо действительному элементу пользовательского интерфейса, поэтому более важной частью является его уничтожение. – tete

+0

Я бы упомянул, если бы не другой объект имел ссылку на него, GarbagCollector примет его – WiiMaxx

ответ

0

Вы должны загрузить байты файла временного изображения в память и создать из этих байтов Image. Ваш Image не будет использовать временный файл напрямую, и вы можете удалить его сразу после чтения байтов, остальное - GarbageCollector's job. Вот функция для создания BitmapImage из байтов:

 public static BitmapImage GetImageFromByteArray(byte[] rawImageBytes) 
     { 
      BitmapImage imageSource = null; 

      try 
      { 
       using (MemoryStream stream = new MemoryStream(rawImageBytes)) 
       { 
        stream.Seek(0, SeekOrigin.Begin); 
        BitmapImage bi = new BitmapImage(); 
        bi.BeginInit(); 
        bi.CacheOption = BitmapCacheOption.OnLoad; 
        bi.StreamSource = stream; 
        bi.EndInit(); 
        imageSource = bi; 
       } 
      } 
      catch (System.Exception) 
      { 
      } 

      return imageSource; 
     } 

И использовать его как это: testImage.Source = GetImageFromByteArray(rawImageBytes);

+0

Спасибо, это звучит как лучший способ , Но тогда возникает вопрос, как я могу уничтожить объект Image? Поскольку все это происходит в моем классе ViewModel, у него нет никаких знаний или каких-либо членов другого элемента FrameworkElement, где я могу подключиться и, наконец, отсоединить изображение, чтобы его уничтожить. Очевидно, я не хочу, чтобы этот объект висел в памяти. – tete

+0

'GC' позаботится о вашем объекте' Image'. Это простой 'Object', который не является членом' LogicalTree' и будет освобожден 'CG'. –

Смежные вопросы