【发布时间】:2011-02-16 13:52:03
【问题描述】:
我有一个UIElement,我想捕获用户单击按钮时的快照。当用户单击按钮时,我想获取 UIElement 并将其当前状态加载到 Image 元素中。如何将UIElement 渲染为Image?
【问题讨论】:
标签: image silverlight render uielement
我有一个UIElement,我想捕获用户单击按钮时的快照。当用户单击按钮时,我想获取 UIElement 并将其当前状态加载到 Image 元素中。如何将UIElement 渲染为Image?
【问题讨论】:
标签: image silverlight render uielement
WriteableBitmap wb = new WriteableBitmap(UIElement, new ScaleTransform() { ScaleX = 1, ScaleY = 1 });
wb.Invalidate();
Image.Source = wb;
【讨论】:
假设您要渲染的 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;
【讨论】:
您还可以执行以下操作:
private void SetImageSourceBasedOnElement(Image image, UIElement element)
{
if (element != null)
{
WriteableBitmap writableBitmap = new WriteableBitmap(element, null);
writableBitmap.Invalidate();
image.Source = writableBitmap;
}
}
【讨论】:
最终,不,你不能渲染整个UIElement,包括由于滚动溢出等原因不可见的部分。
我研究了如何使用反射来解决这个问题。不幸的是,您无法覆盖 UIElement 的呈现方式,因为它只是内部类 XcpImports 的轻包装器,而 XcpImports 又是整个 Silverlight 中使用的各种本机方法的包装器。换句话说,UIElement 及其呈现方式完全是原生的,因此没有(简单的)方法可以使用反射覆盖它的显示方式。
如果您想采用骇人听闻的方法,您可以将您的元素包含在一个网格中,将其从该网格中删除,然后将其放入另一个与该元素大小相同的网格中——看看我将如何处理?但这会很麻烦,而且充其量也是骇人听闻的。
【讨论】: