У меня есть UIElement
, который я хочу сделать, когда пользователь нажимает кнопку. Когда пользователь нажимает кнопку, я хочу взять UIElement
и загрузить его текущее состояние в элемент изображения. Как сделать UIElement
Image
?
Silverlight 4 — рендеринг UIElement как изображения
Ответы (4)
Предположим, что FrameworkElement
, который вы хотите визуализировать, называется elementToRender, а Image
, куда вы хотите поместить обработанный вывод, называется image strong>, используйте следующий код в обработчике нажатия кнопки:
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;
Вы также можете сделать следующее:
private void SetImageSourceBasedOnElement(Image image, UIElement element)
{
if (element != null)
{
WriteableBitmap writableBitmap = new WriteableBitmap(element, null);
writableBitmap.Invalidate();
image.Source = writableBitmap;
}
}
В конечном счете, нет, вы не можете визуализировать весь UIElement
, включая части, которые не видны из-за переполнения при прокрутке и т. д.
Я посмотрел, как вы можете обойти это, используя отражение. К сожалению, вы не можете переопределить способ рендеринга UIElement
, так как это всего лишь легкая оболочка для внутреннего класса XcpImports, который, в свою очередь, является оболочкой для различных собственных методов, используемых в Silverlight. Другими словами, UIElement
и способ его рендеринга полностью нативны, и поэтому нет (простого) способа переопределить то, как он отображается с помощью отражения.
Если вы хотите использовать хакерский подход, вы можете заключить свой элемент в сетку, удалить его из этой сетки, поместить в другую сетку того же размера, что и элемент — видите, к чему я клоню? Но это было бы довольно хлопотно и в лучшем случае хакерски.