在许多页面上打印一封信

时间:2013-02-21 09:15:58

标签: c# silverlight printing silverlight-4.0

我有一个打印按钮,必须打印两个文件: - 这个人写的一封信 其次,在第二版中,我必须处理可能的多页字母。我怎么能这样做?

这封信在我的页面上的文本框内。

这是我的代码:

void btPrint_Click(object sender, RoutedEventArgs e)
        {

            if (itmCandidatSelect.LettreMotiv != null || itmCandidatSelect.LettreMotiv != "")
            {
                _lineIndex = 0;
                _documentBodyLines = new List<string>();
                string[] lines = tbLettreMotiv.Text.Split(new char[] { '\r' }, StringSplitOptions.None);
                _documentBodyLines.AddRange(lines);

                PrintDocument maLettreMotiv = new PrintDocument();
                //maLettreMotiv.BeginPrint += new EventHandler<BeginPrintEventArgs>(maLettreMotiv_BeginPrint);
                //maLettreMotiv.EndPrint += new EventHandler<EndPrintEventArgs>(maLettreMotiv_EndPrint);
                maLettreMotiv.PrintPage += new EventHandler<PrintPageEventArgs>(maLettreMotiv_PrintPage);

                maLettreMotiv.Print("LettreMotivation_" + itmCandidatSelect.NomCandidat + "_" + itmCandidatSelect.PrenomCandidat);

            }

}

    int _lineIndex;
        List<string> _documentBodyLines;

void maLettreMotiv_PrintPage(object sender, PrintPageEventArgs e)
        {
            PrintLettreMotivTemplate page = new PrintLettreMotivTemplate();
            page.SetHeaderAndFooterText("Lettre de motivation", "");
            int numberOfLinesAdded = 0;
            while (_lineIndex < _documentBodyLines.Count)
            {
                page.AddLine(_documentBodyLines[_lineIndex]);
                page.Measure(new Size(e.PrintableArea.Width, double.PositiveInfinity));
                if (page.DesiredSize.Height > e.PrintableArea.Height && numberOfLinesAdded > 1)
                {
                    page.RemoveLastLine();
                    e.HasMorePages = true;
                    break;
                }
                _lineIndex++;
                numberOfLinesAdded++;

            }
             e.PageVisual = page;
        }

我的模板:

<UserControl x:Class="erecrutement_procclass.Views.PrintLettreMotivTemplate"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             Width="815" 
             Height="1024"
             mc:Ignorable="d"    
             d:DesignHeight="300" 
             d:DesignWidth="400">
<Grid x:Name="documentRoot">
    <Grid.RowDefinitions>
        <RowDefinition Height="25"/>
        <RowDefinition />
        <RowDefinition Height="25"/>
    </Grid.RowDefinitions>
    <TextBlock x:Name="headerTextBlock" HorizontalAlignment="Center" />
    <TextBlock x:Name="bodyTextBlock" Grid.Row="1" TextWrapping="Wrap" Margin="5,5,5,5"/>
    <TextBlock x:Name="footerTextBlock" HorizontalAlignment="Center" Grid.Row="2"/>
</Grid>


 public partial class PrintLettreMotivTemplate : UserControl
    {
        public PrintLettreMotivTemplate()
        {
            InitializeComponent();
        }

        public void SetHeaderAndFooterText(string header, string footer)
        {
            headerTextBlock.Text = header;
            footerTextBlock.Text = footer;
        }


        public void AddLine(string line)
        {
            bodyTextBlock.Inlines.Add(line);
            bodyTextBlock.Inlines.Add(new LineBreak());
        }



        public void RemoveLastLine()
        {
            for (int index = 0; index < 2; index++)
            {
                bodyTextBlock.Inlines.RemoveAt(bodyTextBlock.Inlines.Count - 1);
            }
        }
    }

但是,当它应该超过一页时,它会停止,而我只有一页,而且这封信的一部分丢失了。

我该如何解决这个问题?

谢谢。

2 个答案:

答案 0 :(得分:3)

原因是这个。在PrintLettreMotivTemplate.xaml

<UserControl x:Class="DelmePrint.PrintLettreMotivTemplate"
             Width="815" 
             Height="1024"
             >
    <Grid x:Name="documentRoot">
        ...
    </Grid>
</UserControl>

您已将可打印区域的高度设置为1024.当我逐步完成代码时,

/* DesiredSize always (793, 1024)
   PrintableArea always (793, 1122) */
if (page.DesiredSize.Height > e.PrintableArea.Height)

因此代码不断在页面的中间部分添加行。

要解决此问题,您需要将PrintLettreMotivTemplate中的高度更改为MinHeight。这样,当行数太多时,字母会溢出。

<UserControl x:Class="DelmePrint.PrintLettreMotivTemplate"
             Width="815" 
             MinHeight="1024"
             >
    <Grid x:Name="documentRoot">
        ...
    </Grid>
</UserControl>

答案 1 :(得分:2)

尝试使用以下属性;

maLettreMotiv.PrintPage += (s, args) =>
            {
                Candidat monCandidat = this.itmCandidatSelect;

                PrintLettreMotivTemplate monTemplatePrint = PrintableAreaLettreMotiv.printTemplateLettreMotiv(monCandidat);
                monTemplatePrint.Width = args.PrintableArea.Width;
                monTemplatePrint.Height = args.PrintableArea.Height;
                args.HasMorePages = true;
                args.PageVisual = monTemplatePrint;
            };