Estou estudando a melhor forma de trabalhar com a geração de relatórios no Silverlight 4, e estou seguindo os passos abaixo:
1 - Chamo uma Child Window com os dados que preciso para impressão, trabalhando com elementos como TextBlock e ListBox.
2 - Quando eu clico no botão de imprimir eu faço a varredura de componente por componente, pegando os valores dos campos e inserindo na "página" para impressão, assim:
// Adicionando um Título para o valor
TextBlock conteudoTituloLinha = new TextBlock { Text = "Valor R$" };
conteudoTituloLinha.FontSize = 15;
conteudoTituloLinha.SetValue(Canvas.TopProperty, alturaAtual);
conteudoTituloLinha.SetValue(Canvas.LeftProperty, margemPagina);
conteudoTituloLinha.SetValue(Canvas.WidthProperty, tamanhoPagina);
bloco.Children.Add(conteudoTituloLinha);
bloco.Measure(new Size(pp.PrintableArea.Width, double.PositiveInfinity));
<strong>if (alturaLinha > alturaDisponivel)
{
bloco.Children.Remove(conteudoTituloLinha);
pp.HasMorePages = true;
}</strong>
adicionarLinha(1);
//Pegando o valor
TextBlock conteudoBloco = new TextBlock { Text = valor.Text };
conteudoBloco.FontSize = 12;
conteudoBloco.SetValue(Canvas.TopProperty, alturaAtual);
conteudoBloco.SetValue(Canvas.LeftProperty, margemPagina);
conteudoBloco.SetValue(Canvas.WidthProperty, tamanhoPagina);
bloco.Children.Add(conteudoBloco);
bloco.Measure(new Size(pp.PrintableArea.Width, double.PositiveInfinity));
<strong>if (alturaLinha > alturaDisponivel)
{
bloco.Children.Remove(conteudoBloco);
pp.HasMorePages = true;
}
</strong>
adicionarLinha(2);
Funciona muito bem, entretanto quando o conteúdo ultrapassa a altura disponível da página de impressão o processo trava e não gera o documento nem para de processar, como eu poderia verificar o tamanho disponível
para acrescentar conteúdo à página ou continuar acrescentando conteúdo à página corrente.
Eu utilizo este código acima para cada elemento na tela Child Window. Para disparar a rotina de impressão estou usando o comando documentoImpressao.PrintPage += (s, pp) =>
{
...
}
Guilherme Carvalho