У меня есть UIElement
, что я хочу сделать снимок, когда пользователь нажимает кнопку. Когда пользователь нажимает кнопку, я хочу взять UIElement
и загрузить текущее состояние в элемент изображения. Как сделать UIElement
как Image
?
Silverlight 4 - Render UIElement как изображение
Ответ 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
и то, как он визуализируется, является полностью родным, и, следовательно, нет (простого) способа переопределить, как он отображается с помощью отражения.
Если вы хотите воспользоваться хакерским подходом, вы можете заключить свой элемент в грид, удалить его из этой сетки, поместить его в другую сетку с тем же размером, что и элемент, - см., где я собираюсь с этим? Но это было бы довольно хлопотно, и в лучшем случае взломать.