Silverlight 4 - визуализация UIElement как изображения - PullRequest
10 голосов
/ 07 мая 2010

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

Ответы [ 4 ]

13 голосов
/ 03 февраля 2012

Предполагая, что 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 голосов
/ 04 февраля 2012

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

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

        image.Source = writableBitmap;
     }
 }
0 голосов
/ 09 февраля 2012

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

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

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

0 голосов
/ 07 мая 2010
WriteableBitmap wb = new WriteableBitmap(UIElement, new ScaleTransform() { ScaleX = 1, ScaleY = 1 });
wb.Invalidate();
Image.Source = wb;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...