Silverlight 4 - 渲染UIElement作为图像

时间:2010-05-06 20:35:44

标签: image silverlight render uielement

我有UIElement我希望捕获用户点击按钮时的快照。当用户单击该按钮时,我想获取UIElement并将其当前状态加载到Image元素中。如何将UIElement呈现为Image

4 个答案:

答案 0 :(得分:13)

假设您要渲染的FrameworkElement名为 elementToRender ,而您要放置渲染输出的Image称为 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;

答案 1 :(得分:2)

您还可以执行以下操作:

private void SetImageSourceBasedOnElement(Image image, UIElement element)
{
    if (element != null)
    {
        WriteableBitmap writableBitmap = new WriteableBitmap(element, null);
        writableBitmap.Invalidate();

        image.Source = writableBitmap;
     }
 }

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

如果您想采用hackish方法,可以将元素包含在Grid中,将其从该网格中移除,将其放入与元素大小相同的另一个网格中 - 请参阅我要使用的内容?但那将是一件非常麻烦的事情,而且充其量只是一种骚扰。