Silverlight 4 - 将 UIElement 渲染为图像

Posted

技术标签:

【中文标题】Silverlight 4 - 将 UIElement 渲染为图像【英文标题】:Silverlight 4 - Render UIElement as an Image 【发布时间】:2011-02-16 13:52:03 【问题描述】:

我有一个UIElement,我想捕获用户单击按钮时的快照。当用户单击按钮时,我想获取 UIElement 并将其当前状态加载到 Image 元素中。如何将UIElement 渲染为Image

【问题讨论】:

【参考方案1】:
WriteableBitmap wb = new WriteableBitmap(UIElement, new ScaleTransform()  ScaleX = 1, ScaleY = 1 );
wb.Invalidate();
Image.Source = wb;

【讨论】:

我看不出那个链接有什么帮助......他问的是 UIElement,而不是图像流。 @PatNiemeyer,答案是正确的,你明白问题吗?【参考方案2】:

假设您要渲染的 FrameworkElement 名为 elementToRender,而您要放置渲染输出的 Image 名为 图片,在按钮的点击处理程序上使用以下代码:

var writeableBitmap = new WriteableBitmap((int)elementToRender.RenderSize.Width, (int)elementToRender.RenderSize.Height);

writeableBitmap.Render(elementToRender, new ScaleTransform()  ScaleX = 1, ScaleY = 1 );
writeableBitmap.Invalidate();

image.Source = writeableBitmap;

【讨论】:

这是一个很棒的解决方案,我已经在我的一个项目中使用了它。但是,这似乎是在呈现元素的位图,如果元素是一个大的 RichTextBox,则包括滚动条。你知道在这种情况下是否可以渲染整个元素? 不,我认为这不可能。渲染只作用于渲染元素的可见部分。【参考方案3】:

您还可以执行以下操作:

private void SetImageSourceBasedOnElement(Image image, UIElement element)

    if (element != null)
    
        WriteableBitmap writableBitmap = new WriteableBitmap(element, null);
        writableBitmap.Invalidate();

        image.Source = writableBitmap;
     
 

【讨论】:

【参考方案4】:

最终,不,你不能渲染整个UIElement,包括由于滚动溢出等原因不可见的部分。

我研究了如何使用反射来解决这个问题。不幸的是,您无法覆盖 UIElement 的呈现方式,因为它只是内部类 XcpImports 的轻包装器,而 XcpImports 又是整个 Silverlight 中使用的各种本机方法的包装器。换句话说,UIElement 及其呈现方式完全是原生的,因此没有(简单的)方法可以使用反射覆盖它的显示方式。

如果您想采用骇人听闻的方法,您可以将您的元素包含在一个网格中,将其从该网格中删除,然后将其放入另一个与该元素大小相同的网格中——看看我将如何处理?但这会很麻烦,而且充其量也是骇人听闻的。

【讨论】:

以上是关于Silverlight 4 - 将 UIElement 渲染为图像的主要内容,如果未能解决你的问题,请参考以下文章

将 FontFamily 应用于 Silverlight 4 Beta 中的所有控件

如何将现有的业务层实施到 SilverLight 4.0 应用程序?

Silverlight 4 - BusyIndi​​cator 使用 DomainDataSource

零元学Expression Blend 4 - Chapter 19 如何让做好的Blend专案变Silverlight网页

内容控制内容调整以填充Silverlight 4

零元学Expression Design 4 - Chapter 2 熟悉Design并且快速设计出Silverlight网页