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?

Foi útil?

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
scroll top