【问题标题】:Create a FrameworkElement out of an BitmapImage file, and then destroy?从 BitmapImage 文件中创建一个 FrameworkElement,然后销毁?
【发布时间】:2013-05-24 09:45:38
【问题描述】:

我有一个 WPF 项目,我们使用一些 WindowsForm 控件(来自 OWC 的数据透视表,Office Web 组件)。但是,由于数据透视表不太支持打印,所以我们能想到的唯一方法是打印数据透视表导出的图像文件(另一种方法是从导出的 Excel 文件中打印,但我们希望避免它,因为它不能保证机器上安装了 Excel)。

我们已经有一个打印项目,可以很好地打印 WPF ElementFramework。所以我想使用那段代码。现在我的问题是:如何从代码中的BitmapImage 生成FrameworkElement。由于此FrameworkElement 纯粹用于打印,所以我想我必须从代​​码中创建它,可能为其分配一个父级,而不是在屏幕上显示它,并在打印后销毁FrameworkElement,以便最终我可以删除临时BitmapImage 文件。

所以这超出了我的知识范围。我什至不知道这是否是正确的方法:为一些非 UI 相关的工作创建一个 UI 元素?对此有何建议?谢谢!

【问题讨论】:

  • 我理解正确吗您想将BitmapImage 转换为FrameworkElement?
  • @WiiMaxx ,是的。但是这个 FrameworkElement 不属于任何实际的 UI 元素,所以更关键的部分是如何在之后销毁它
  • 我会提到,如果没有其他对象持有对它的引用,GarbagCollector 将接受它

标签: wpf frameworkelement


【解决方案1】:

您应该将临时图像文件的字节加载到内存中,并从这些字节创建一个Image。 您的Image 不会直接使用临时文件,您可以在读取字节后立即将其删除,剩下的就是GarbageCollector's 工作。这是一个从字节创建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);

【讨论】:

  • 谢谢,这听起来是一个更好的方法。但接下来的问题就变成了如何销毁 Image 对象?由于所有这些都发生在我的 ViewModel 类中,它没有任何知识或其他 FrameworkElement 的任何成员,我可以在其中附加并最终分离 Image 以销毁它。显然我不希望这个对象挂在内存中。
  • GC 将处理您的 Image 对象。它是一个简单的Object,它不是LogicalTree 的成员,将被CG 释放。
猜你喜欢
  • 2012-09-11
  • 1970-01-01
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多