2010-02-04 4 views
0

En utilisant le code ci-dessous, j'essaie de remplir un Canvas avec UIElements et enregistrez-le sous la forme Image. Cependant, mon Image est toujours vide. C'est parce que le Canvas n'est jamais affiché sur l'écran et qu'une sorte d'initialisation et de dessin n'a jamais eu lieu? Comment puis-je faire ce travail?Création d'un VisualBrush sans jamais afficher le visuel qu'il représente

La création Canvas irait quelque chose comme ceci:

Canvas theCanvas = new Canvas(); 
theCanvas.Width = 2740; 
theCanvas.Height = 2280; 

... 

Button button = new Button(); 
button.Content = "Push Me."; 
button.Height = 50; 
button.Width = 200; 
Canvas.SetTop(button, 200); 
Canvas.SetLeft(button, 300); 
theCanvas.Children.Add(button); 

Pour créer le Image et enregistrez: Dans ce cas, le contrôle de

using (System.IO.FileStream fs = 
      new System.IO.FileStream(path, System.IO.FileMode.Create)) 
{ 
    RenderTargetBitmap renderBitmap = new RenderTargetBitmap(
     (int)inWidth, 
     (int)inHeight, 1/300, 1/300, 
     PixelFormats.Pbgra32); 

    DrawingVisual visual = new DrawingVisual(); 
    using (DrawingContext context = visual.RenderOpen()) 
    { 
     VisualBrush brush = new VisualBrush(inCanvas); 
     context.DrawRectangle(
      brush, 
      null, 
      new Rect(new Point(), new Size(inWidth, inHeight))); 
    }     

    renderBitmap.Render(visual); 

    BitmapEncoder encoder = new TiffBitmapEncoder(); 
    encoder.Frames.Add(BitmapFrame.Create(renderBitmap)); 
    encoder.Save(fs); 
    fs.Close(); 
} 
+2

J'ai eu le même problème. http://stackoverflow.com/questions/1877115/create-wpf-element-offscreen-and-render-to-bitmap – Will

+0

Eh bien, peut-être un problème de diff (je faisais quelque chose de mal) mais le code est tout là .. – Will

+0

ouais cela a aidé. Il me manquait la mesure et l'arrangement. –

Répondre

0

Voir premier commentaire sur mon message original.

0

est jamais rendu à l'écran. J'ai juste ajouté le canevas à une grille et sur un clic de bouton j'ai appelé la commande d'enregistrement. Et ça a marché.

private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 

    theCanvas.Width = 2740; 
    theCanvas.Height = 2280; 

    Button button = new Button(); 
    button.Content = "Push Me."; 
    button.Height = 50; 
    button.Width = 200; 
    Canvas.SetTop(button, 200); 
    Canvas.SetLeft(button, 300); 
    theCanvas.Children.Add(button); 
    mainGri.Children.Add(theCanvas); 

    } 

    private void mainGri_MouseDown(object sender, MouseButtonEventArgs e) 
    { 



    } 

    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     String path = @"c:\\a.jpg"; 
     using (System.IO.FileStream fs = new System.IO.FileStream(path, System.IO.FileMode.Create)) 
     { 
      int inWidth = 300; 
      int inHeight = 400; 
      RenderTargetBitmap renderBitmap = new RenderTargetBitmap((int)inWidth, 
                   (int)inHeight, 1/300, 1/300, PixelFormats.Pbgra32); 

      DrawingVisual visual = new DrawingVisual(); 
      using (DrawingContext context = visual.RenderOpen()) 
      { 
       VisualBrush brush = new VisualBrush(theCanvas); 
       context.DrawRectangle(brush, 
             null, 
             new Rect(new Point(), new Size(inWidth, inHeight))); 
      } 

      renderBitmap.Render(visual); 

      BitmapEncoder encoder = new TiffBitmapEncoder(); 
      encoder.Frames.Add(BitmapFrame.Create(renderBitmap)); 
      encoder.Save(fs); 
      fs.Close(); 
     } 
    } 
} 

}

+0

Mon objectif est de ne pas avoir à afficher la toile. –

Questions connexes