当用户点击按钮时,我想要捕获一个 UIElement
的快照,并将它当前的状态加载到一个 Image
元素中。如何将一个 UIElement
渲染为一个 Image
?
当用户点击按钮时,我想要捕获一个 UIElement
的快照,并将它当前的状态加载到一个 Image
元素中。如何将一个 UIElement
渲染为一个 Image
?
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;
private void SetImageSourceBasedOnElement(Image image, UIElement element)
{
if (element != null)
{
WriteableBitmap writableBitmap = new WriteableBitmap(element, null);
writableBitmap.Invalidate();
image.Source = writableBitmap;
}
}
WriteableBitmap wb = new WriteableBitmap(UIElement, new ScaleTransform() { ScaleX = 1, ScaleY = 1 });
wb.Invalidate();
Image.Source = wb;
最终,你不能渲染整个UIElement
,包括由于滚动溢出等原因不可见的部分。
我研究了如何使用反射来解决这个问题。不幸的是,你不能覆盖UIElement
的呈现方式,因为它只是一个内部类XcpImports的轻量级包装器,而XcpImports则是Silverlight中使用的各种本机方法的包装器。换句话说,UIElement
及其呈现方式完全是本机的,因此没有(容易的)方法使用反射覆盖其显示方式。
如果你想采用hackish的方法,可以将你的元素放在一个网格中,从该网格中移除它,将它放在另一个与元素相同大小的网格中--你知道我要去哪里了吗?但那将是相当麻烦的,而且是hackish的。