【问题标题】:Silverlight 4 - Render UIElement as an ImageSilverlight 4 - 将 UIElement 渲染为图像
【发布时间】:2011-02-16 13:52:03
【问题描述】:

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

【问题讨论】:

    标签: image silverlight render uielement


    【解决方案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 及其呈现方式完全是原生的,因此没有(简单的)方法可以使用反射覆盖它的显示方式。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多