2010-05-06 6 views
10

Ich habe eine UIElement, die ich einen Snapshot von einem Benutzer auf eine Schaltfläche klicken möchte. Wenn ein Benutzer auf die Schaltfläche klickt, möchte ich die UIElement übernehmen und den aktuellen Status in ein Image-Element laden. Wie rende ich eine UIElement als Image?Silverlight 4 - Render UIElement als ein Bild

Antwort

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

Ich sehe nicht, wie dieser Link hilft ... Er fragt nach UIElement, kein Bildstrom. –

+0

@PatNiemeyer, Antwort ist richtig, verstehst du Frage? –

+0

@AkashKava Nein, Ihre Antwort ist falsch. Er hat einen Schritt verpasst. – Zenexer

13

Unter der Annahme, die FrameworkElement Sie wollen ist elementToRender Namen machen und die Image, wo Sie die gerenderte Ausgabe platzieren möchten genannt wird Bild, verwenden Sie den folgenden Code auf Click-Handler Ihre Schaltfläche:

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

Dies ist eine großartige Lösung, und ich habe sie in einem meiner Projekte verwendet. Dies scheint jedoch das Bitmap des Elements so darzustellen, wie es aussieht, einschließlich Bildlaufleisten, wenn das Element beispielsweise eine große RichTextBox ist. Wissen Sie, ob es in solchen Fällen möglich ist, das gesamte Element zu rendern? – Artyom

+0

Nein, ich glaube nicht, dass es möglich ist. Das Rendering wirkt nur auf den sichtbaren Teil des gerenderten Elements. – Bruno

2

Sie können auch folgendes tun:

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

     image.Source = writableBitmap; 
    } 
} 
0

Letztlich, nein, man kann nicht eine ganze UIElement, einschließlich der Teile machen, die durch Scrollen Überlauf nicht sichtbar sind, usw.

Ich sah in, wie Sie, um dieses mit Reflexion bekommen konnte. Leider können Sie nicht überschreiben, wie UIElement rendert, da es nur ein leichter Wrapper für die interne Klasse XcpImports ist, der wiederum ein Wrapper für verschiedene native Methoden ist, die in Silverlight verwendet werden. Mit anderen Worten, UIElement und wie es gerendert wird, ist vollständig nativ, und somit gibt es keine (einfache) Möglichkeit zu überschreiben, wie es mit Reflektion angezeigt wird.

Wenn Sie den hackischen Ansatz verfolgen wollten, könnten Sie Ihr Element in ein Grid einschließen, es aus diesem Grid entfernen, es in ein anderes Grid einfügen, das die gleiche Größe wie das Element hat - sehen Sie, wohin ich gehe Dies? Aber das wäre ziemlich mühsam und bestenfalls hackisch.