Criar WPF elemento fora da tela e tornar a bitmap
-
18-09-2019 - |
Pergunta
Eu não posso entender por que isso não funciona, ou o que eu preciso para obtê-lo para o trabalho.
Para repro, criar um aplicativo WPF simples e substituir o construtor da janela principal assim:
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 };
}
Isso resulta em uma imagem vazia. Se eu salvar o RTB para o disco como um PNG seu tamanho correto, mas transparente.
Se, no entanto, eu faço isso com um visual que foi exibida na tela, ele funciona bem.
Como posso prestar um Visual eu construí fora da tela para um bitmap?
Solução
Como os elementos não têm um tamanho desejado até que você medi-los. Você estava dizendo a Grid para si tamanho com um espaço disponível de 0x0. Alterar seu código para:
grid.Measure(new Size(grid.Width, grid.Height));
grid.Arrange(new Rect(new Size(grid.Width, grid.Height)));
(A chamada para UpdateLayout é desnecessário.)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow