Silverlight 4 - 将 UIElement 渲染为图像
Posted
技术标签:
【中文标题】Silverlight 4 - 将 UIElement 渲染为图像【英文标题】:Silverlight 4 - Render UIElement as an Image 【发布时间】:2011-02-16 13:52:03 【问题描述】:我有一个UIElement
,我想捕获用户单击按钮时的快照。当用户单击按钮时,我想获取 UIElement
并将其当前状态加载到 Image 元素中。如何将UIElement
渲染为Image
?
【问题讨论】:
【参考方案1】:WriteableBitmap wb = new WriteableBitmap(UIElement, new ScaleTransform() ScaleX = 1, ScaleY = 1 );
wb.Invalidate();
Image.Source = wb;
【讨论】:
我看不出那个链接有什么帮助......他问的是 UIElement,而不是图像流。 @PatNiemeyer,答案是正确的,你明白问题吗?【参考方案2】:假设您要渲染的 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;
【讨论】:
这是一个很棒的解决方案,我已经在我的一个项目中使用了它。但是,这似乎是在呈现元素的位图,如果元素是一个大的 RichTextBox,则包括滚动条。你知道在这种情况下是否可以渲染整个元素? 不,我认为这不可能。渲染只作用于渲染元素的可见部分。【参考方案3】:您还可以执行以下操作:
private void SetImageSourceBasedOnElement(Image image, UIElement element)
if (element != null)
WriteableBitmap writableBitmap = new WriteableBitmap(element, null);
writableBitmap.Invalidate();
image.Source = writableBitmap;
【讨论】:
【参考方案4】:最终,不,你不能渲染整个UIElement
,包括由于滚动溢出等原因不可见的部分。
我研究了如何使用反射来解决这个问题。不幸的是,您无法覆盖 UIElement
的呈现方式,因为它只是内部类 XcpImports 的轻包装器,而 XcpImports 又是整个 Silverlight 中使用的各种本机方法的包装器。换句话说,UIElement
及其呈现方式完全是原生的,因此没有(简单的)方法可以使用反射覆盖它的显示方式。
如果您想采用骇人听闻的方法,您可以将您的元素包含在一个网格中,将其从该网格中删除,然后将其放入另一个与该元素大小相同的网格中——看看我将如何处理?但这会很麻烦,而且充其量也是骇人听闻的。
【讨论】:
以上是关于Silverlight 4 - 将 UIElement 渲染为图像的主要内容,如果未能解决你的问题,请参考以下文章
将 FontFamily 应用于 Silverlight 4 Beta 中的所有控件
如何将现有的业务层实施到 SilverLight 4.0 应用程序?
Silverlight 4 - BusyIndicator 使用 DomainDataSource
零元学Expression Blend 4 - Chapter 19 如何让做好的Blend专案变Silverlight网页
零元学Expression Design 4 - Chapter 2 熟悉Design并且快速设计出Silverlight网页