2009-12-09 9 views
18

No puedo entender por qué esto no funciona, o lo que necesito para que funcione.Crear elemento WPF fuera de pantalla y renderizar en mapa de bits

Para repro, crear una sencilla aplicación WPF y reemplazar el constructor de la ventana principal de esta manera:

public MainWindow() 
    { 
     InitializeComponent(); 

     // simple visual definition 
     var grid = new Grid { Width = 300, Height = 300 }; 
     var text = new TextBlock 
         { 
         Text = "Y DON'T I WORK???", 
         FontSize = 100, 
         FontWeight = 
         FontWeights.Bold 
         }; 
     grid.Children.Add(text); 

     // update the layout so everything is awesome cool 
     grid.Measure(grid.DesiredSize); 
     grid.Arrange(new Rect(grid.DesiredSize)); 
     grid.UpdateLayout(); 

     // create a BitmapSource from the visual 
     var rtb = new RenderTargetBitmap(
            (int)grid.Width, 
            (int)grid.Height, 
            96, 
            96, 
            PixelFormats.Pbgra32); 
     rtb.Render(grid); 

     // Slap it in the window 
     this.Content = new Image { Source = rtb, Width = 300, Height = 300 }; 
    } 

Esto se traduce en una imagen vacía. Si guardo el RTB en el disco como PNG, tiene el tamaño correcto pero es transparente.

Si, sin embargo, hago esto con un visual que se ha mostrado en la pantalla, funciona bien.

¿Cómo puedo representar una imagen visual que he construido fuera de pantalla en un mapa de bits?

Respuesta

24

Porque los elementos no tienen el tamaño deseado hasta que los mides. Le estabas diciendo a la Grilla que se dimensione con un espacio disponible de 0x0. Cambiar el código para:

grid.Measure(new Size(grid.Width, grid.Height)); 
grid.Arrange(new Rect(new Size(grid.Width, grid.Height))); 

(. La llamada a UpdateLayout es innecesaria)

+1

Hijo de un ........ he comprobado una vez DesiredSize camino de regreso cuando empecé a tratar de lograr esto y no era 0,0 (quién sabe por qué) y nunca lo volvió a verificar. ¡Gracias! – Will

+2

Acabamos de descubrir que si tiene ItemsControls vinculado a sus ItemsSources dentro del control que está visualizando fuera de pantalla, parece que tiene que llamar a 'UpdateLayout()' o no representan ningún elemento. –

Cuestiones relacionadas