Silverlight 4 - Render UIElement как изображение

У меня есть UIElement, что я хочу сделать снимок, когда пользователь нажимает кнопку. Когда пользователь нажимает кнопку, я хочу взять UIElement и загрузить текущее состояние в элемент изображения. Как сделать UIElement как Image?

Ответ 1

Предполагая, что 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;

Ответ 2

Вы также можете сделать следующее:

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

        image.Source = writableBitmap;
     }
 }

Ответ 3

WriteableBitmap wb = new WriteableBitmap(UIElement, new ScaleTransform() { ScaleX = 1, ScaleY = 1 });
wb.Invalidate();
Image.Source = wb;

Ответ 4

В конечном счете нет, вы не можете отобразить весь UIElement, включая части, которые не видны из-за переполнения прокрутки и т.д.

Я посмотрел, как вы можете обойти это, используя отражение. К сожалению, вы не можете переопределить способ рендеринга UIElement, поскольку это всего лишь легкая оболочка для внутреннего класса XcpImports, которая, в свою очередь, является оберткой для различных собственных методов, используемых в Silverlight. Другими словами, UIElement и то, как он визуализируется, является полностью родным, и, следовательно, нет (простого) способа переопределить, как он отображается с помощью отражения.

Если вы хотите воспользоваться хакерским подходом, вы можете заключить свой элемент в грид, удалить его из этой сетки, поместить его в другую сетку с тем же размером, что и элемент, - см., где я собираюсь с этим? Но это было бы довольно хлопотно, и в лучшем случае взломать.