代码之家  ›  专栏  ›  技术社区  ›  provençal le breton

在多页纸上打印一封信

  •  2
  • provençal le breton  · 技术社区  · 12 年前

    我有一个打印按钮,必须打印两个文档: -此人写的一封信 第二,在第二次印刷中,我必须处理一封可能有多页的信。我该怎么做?

    这封信在我的页面上的一个文本框里。

    这是我的代码:

    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 回复  |  直到 12 年前
        1
  •  3
  •   Chui Tey    12 年前

    原因是这样的。在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中的Height更改为MinHeight。这样,当行数过多时,字母就会溢出。

    <UserControl x:Class="DelmePrint.PrintLettreMotivTemplate"
                 Width="815" 
                 MinHeight="1024"
                 >
        <Grid x:Name="documentRoot">
            ...
        </Grid>
    </UserControl>
    
        2
  •  2
  •   scetiner    12 年前

    尝试使用以下属性;

    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;
                };