Silverlight 4 — рендеринг UIElement как изображения

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


person user208662    schedule 06.05.2010    source источник


Ответы (4)


Предположим, что 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;
person Bruno    schedule 03.02.2012
comment
Это отличное решение, и я использовал его в одном из своих проектов. Однако это, похоже, отображает растровое изображение элемента в том виде, в котором оно появляется, включая полосы прокрутки, если элемент представляет собой, скажем, большой RichTextBox. Знаете ли вы, можно ли в таких случаях отрендерить весь элемент? - person Artyom; 09.02.2012
comment
Нет, я не думаю, что это возможно. Рендеринг просто воздействует на видимую часть визуализируемого элемента. - person Bruno; 10.02.2012

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

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

        image.Source = writableBitmap;
     }
 }
person MyKuLLSKI    schedule 03.02.2012

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

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

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

person Zenexer    schedule 09.02.2012

person    schedule
comment
Я не понимаю, как эта ссылка помогает... Он спрашивает об UIElement, а не о потоке изображений. - person Pat Niemeyer; 22.03.2011
comment
@PatNiemeyer, ответ правильный, ты понял вопрос? - person Akash Kava; 09.02.2012