2010-05-06 22 views
10

Tengo un UIElement que quiero capturar una instantánea de cuando un usuario hace clic en un botón. Cuando un usuario hace clic en el botón, quiero tomar el UIElement y cargar su estado actual en un elemento de imagen. ¿Cómo presento un UIElement como Image?Silverlight 4 - Renderizar UIElement como una imagen

Respuesta

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

No veo cómo funciona ese enlace ... Está preguntando sobre UIElement, no sobre la transmisión de una imagen. –

+0

@PatNiemeyer, la respuesta es correcta, ¿entiendes la pregunta? –

+0

@AkashKava No, su respuesta es incorrecta. Él perdió un paso. – Zenexer

13

Suponiendo que el FrameworkElement desea procesar se llama elementToRender y la Image en la que desea colocar el resultado representado se llama imagen, utilice el siguiente código en su botón de controlador de clic:

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; 
+0

Esta es una gran solución, y la he usado en uno de mis proyectos. Sin embargo, esto parece representar el mapa de bits del elemento tal como aparece, incluidas las barras de desplazamiento si el elemento es, por ejemplo, un RichTextBox grande. ¿Sabes si es posible renderizar el elemento completo en tales casos? – Artyom

+0

No, no creo que sea posible. La representación solo actúa en la parte visible del elemento renderizado. – Bruno

2

también puede hacer lo siguiente:

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

     image.Source = writableBitmap; 
    } 
} 
0

En última instancia, no, no se puede suponer que la totalidad de una UIElement, incluyendo las partes que no son visibles debido al desbordamiento de desplazamiento, etc.

Miré en cómo se puede evitar esto usando la reflexión. Desafortunadamente, no puede anular la forma en que se renderiza UIElement, ya que es solo un contenedor ligero para la clase interna XcpImports, que a su vez es un contenedor para varios métodos nativos utilizados en todo Silverlight. En otras palabras, UIElement y cómo se procesa es completamente nativo, y por lo tanto no hay una forma (fácil) de anular cómo se muestra mediante la reflexión.

Si desea adoptar el enfoque de hack, puede incluir su elemento en una cuadrícula, quitarlo de esa cuadrícula, ponerlo en otra cuadrícula que tenga el mismo tamaño que el elemento - vea a dónde voy con ¿esta? Pero eso sería bastante complicado, y hackoso en el mejor de los casos.

Cuestiones relacionadas