【问题标题】:Silverlight - Render controls in background threadSilverlight - 在后台线程中渲染控件
【发布时间】:2011-10-31 09:12:15
【问题描述】:

我需要打印一个 silverlight UserControl 的屏幕截图,我已经尝试过使用 PrintDocument 的常规方式,但不幸的是它需要的时间太长,而且因为它必须在 UI 线程上进行,所以整个应用程序也被锁定了长。这需要很长时间,因为该控件包含一个需要测量并打印在许多页面上的网格。

所以我正在寻找一种不锁定 UI 线程的方法。有什么方法可以在后台线程上再次呈现这些控件(与最初呈现的可见控件分开)?然后计划将这些发送到 PrintDocument,或者如果无法使用 WritableBitmap 对它们进行屏幕截图。

我已经快速开始了,但当然我总是遇到线程关联性问题。鉴于我不希望这些控件对用户可见,但我希望有办法解决这个问题?

干杯

【问题讨论】:

  • 您的意思是使用 WriteableBitmap 类来渲染元素吗? msdn.microsoft.com/en-us/library/aa347331(v=VS.95).aspx
  • 我不太确定,但在 Silverlight 中似乎不可能在后台渲染控件。为此,您需要一个新的 Dispatcher。 MSDN says Dispatcher 只能与 UI 线程一起使用。也不能实例化。

标签: c# multithreading silverlight printing dispatcher


【解决方案1】:

您可以使用WriteableBitmap

获取对要引用的根元素的引用。如果您想从外部源动态加载 XAML,可以使用 XamlReader。叫它ScreenshotRoot

WriteableBitmap bmp = new WriteableBitmap(ScreenshotRoot.RenderSize.Width, ScreenshotRoot.RenderSize.Height)

bmp.Render(ScreenshotRoot, new MatrixTransform());

bmp.Invalidate();

您应该可以在另一个线程中执行此操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多