10

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

4

4 回答 4

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;
于 2012-02-03T18:23:55.567 回答
2

您还可以执行以下操作:

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

        image.Source = writableBitmap;
     }
 }
于 2012-02-03T20:47:44.643 回答
0
WriteableBitmap wb = new WriteableBitmap(UIElement, new ScaleTransform() { ScaleX = 1, ScaleY = 1 });
wb.Invalidate();
Image.Source = wb;
于 2010-05-06T20:55:57.133 回答
0

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

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

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

于 2012-02-09T19:36:06.153 回答