Silverlight 4 - 将UIElement渲染为图像

10

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

4个回答

13
假设您想呈现的FrameworkElement命名为elementToRender,并且您要将呈现输出放置在名为imageImage中,请在按钮的单击处理程序上使用以下代码:
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。您知道在这种情况下是否有可能呈现整个元素吗? - Artyom
不,我认为这是不可能的。渲染只作用于呈现元素的可见部分。 - Bruno

2
您也可以执行以下操作:
private void SetImageSourceBasedOnElement(Image image, UIElement element)
{
    if (element != null)
    {
        WriteableBitmap writableBitmap = new WriteableBitmap(element, null);
        writableBitmap.Invalidate();

        image.Source = writableBitmap;
     }
 }

0
WriteableBitmap wb = new WriteableBitmap(UIElement, new ScaleTransform() { ScaleX = 1, ScaleY = 1 });
wb.Invalidate();
Image.Source = wb;

我不明白那个链接有什么帮助...他在问UIElement,而不是图像流。 - Pat Niemeyer
@PatNiemeyer,答案是正确的,你理解问题了吗? - Akash Kava

0

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

我研究了如何使用反射来解决这个问题。不幸的是,你不能覆盖UIElement的呈现方式,因为它只是一个内部类XcpImports的轻量级包装器,而XcpImports则是Silverlight中使用的各种本机方法的包装器。换句话说,UIElement及其呈现方式完全是本机的,因此没有(容易的)方法使用反射覆盖其显示方式。

如果你想采用hackish的方法,可以将你的元素放在一个网格中,从该网格中移除它,将它放在另一个与元素相同大小的网格中--你知道我要去哪里了吗?但那将是相当麻烦的,而且是hackish的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接