我有一个打印按钮,必须打印两个文件: - 这个人写的一封信 其次,在第二版中,我必须处理可能的多页字母。我怎么能这样做?
这封信在我的页面上的文本框内。
这是我的代码:
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);
}
}
}
但是,当它应该超过一页时,它会停止,而我只有一页,而且这封信的一部分丢失了。
我该如何解决这个问题?
谢谢。
答案 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;
};