2010-05-06 6 views
10

J'ai un UIElement que je veux capturer un instantané de quand un utilisateur clique sur un bouton. Quand un utilisateur clique sur le bouton, je veux prendre le UIElement et charger son état actuel dans un élément Image. Comment afficher un UIElement en tant que Image?Silverlight 4 - Render UIElement comme une image

Répondre

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

Je ne vois pas comment ce lien aide ... Il pose des questions sur UIElement, pas un flux d'images. –

+0

@PatNiemeyer, réponse est correcte, comprenez-vous la question? –

+0

@AkashKava Non, votre réponse est incorrecte. Il a raté un pas. – Zenexer

13

En supposant que le FrameworkElement vous voulez rendre est nommé elementToRender et le Image où vous voulez placer la sortie rendu est appelé l'image, utilisez le code suivant sur le gestionnaire de clic de votre bouton:

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

Ceci est une excellente solution, et je l'ai utilisé dans un de mes projets. Cependant, cela semble rendre le bitmap de l'élément tel qu'il apparaît, y compris les barres de défilement si l'élément est, disons, un grand RichTextBox. Savez-vous s'il est possible de rendre l'ensemble de l'élément dans de tels cas? – Artyom

+0

Non, je ne pense pas que ce soit possible. Le rendu agit simplement sur la partie visible de l'élément rendu. – Bruno

2

Vous pouvez également effectuer les opérations suivantes:

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

     image.Source = writableBitmap; 
    } 
} 
0

En fin de compte, non, vous ne pouvez pas rendre tout le UIElement, y compris les parties qui ne sont pas visibles en raison de trop-plein défilement, etc.

Je regardais la façon dont vous pouvez contourner cela en utilisant la réflexion. Malheureusement, vous ne pouvez pas remplacer le rendu UIElement, car il s'agit juste d'un wrapper léger pour la classe interne XcpImports, qui est à son tour un wrapper pour diverses méthodes natives utilisées dans Silverlight. En d'autres termes, UIElement et comment il est rendu est complètement natif, et donc il n'y a pas de moyen (facile) de contourner la façon dont il affiche en utilisant la réflexion. Si vous voulez adopter l'approche hackish, vous pouvez placer votre élément dans une grille, l'enlever de cette grille, la placer dans une autre grille de la même taille que l'élément - voir où je vais ce? Mais ce serait tout à fait une dispute, et au mieux hackish.