2011-08-12 4 views
3

Je prends une image d'un contrôle WPF en utilisant ce code:Obtenir l'image de UIElement est recadrée à la taille affichée

BitmapEncoder imgEncoder = new PngBitmapEncoder(); 
RenderTargetBitmap bmpSource = new RenderTargetBitmap((int)element.ActualWidth, (int)element.ActualHeight, 150, 150, PixelFormats.Pbgra32); 
bmpSource.Render(element); 
imgEncoder.Frames.Add(BitmapFrame.Create(bmpSource)); 
using (MemoryStream ms = new MemoryStream()) 
{ 
    imgEncoder.Save(ms); 
    bytes = ms.ToArray(); 
    ms.Position = 0; 
    Image i = Image.FromStream(ms); 
    i.Save(@"C:\" + Guid.NewGuid().ToString() + "LARGE.png"); 
} 

Le problème est ActualHeight/Width propriété donne la hauteur et la largeur rendu à savoir la partie affichée. Je veux enregistrer une image de tout le contrôle même si une partie du contrôle n'est pas visible sur l'écran, c'est-à-dire qu'elle est placée dans un scrollviewer.

Comment puis-je obtenir la taille/hauteur totale d'un contrôle afin que bmpSource.Render() rende le contrôle entier à une image?

Répondre

0

Vous pouvez essayer temporairement de sortir le contrôle de son contexte (cela peut causer des problèmes si vous le liez), le transformer en un point visible ou le faire défiler pour le rendre.

+0

Que voulez-vous dire point visible, j'ai essayé de lui donner une nouvelle taille et d'appeler updatelayout() mais il revient à son ancienne taille? – Jon

+0

Un point visible est un point qui est garanti pour être visible, avec les scrollviewers, il est souvent plus facile de faire défiler le viewhar rathar que de déplacer le contrôle vers la viewport. –

1
 private static void SaveUsingEncoder(string fileName, FrameworkElement UIElement, BitmapEncoder encoder) 
    { 
     int height = (int)UIElement.ActualHeight; 
     int width = (int)UIElement.ActualWidth; 

     // These two line of code make sure that you get completed visual bitmap. 
     // In case your Framework Element is inside the scroll viewer then some part which is not 
     // visible gets clip. 
     UIElement.Measure(new System.Windows.Size(width, height)); 
     UIElement.Arrange(new Rect(new System.Windows.Point(), new Point(width, height))); 

     RenderTargetBitmap bitmap = new RenderTargetBitmap(width, 

                   height, 
                   96, // These decides the dpi factors 
                   96,// The can be changed when we'll have preview options. 
                   PixelFormats.Pbgra32); 
     bitmap.Render(UIElement); 

     SaveUsingBitmapTargetRenderer(fileName, bitmap, encoder); 
    } 


    private static void SaveUsingBitmapTargetRenderer(string fileName, RenderTargetBitmap renderTargetBitmap, BitmapEncoder bitmapEncoder) 
    { 
     BitmapFrame frame = BitmapFrame.Create(renderTargetBitmap); 
     bitmapEncoder.Frames.Add(frame); 
     // Save file . 
     using (var stream = File.Create(fileName)) 
     { 
      bitmapEncoder.Save(stream); 
     } 
    } 

appeler cette fonction comme

 SaveUsingEncoder(fileName, frameworkElement, new PngBitmapEncoder()); 

Espérons que cela aidera.

Questions connexes