Reputation: 1438
I have a print button, that must print two documents : -A letter written by this person Secondly, in the second print, I must take care of a possibly multiPage letter. How can I do this?
The letter is inside a textbox, on my page.
Here is my code :
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;
}
My template :
<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);
}
}
}
But, When it should go over one page, it stopped, and I only have one pages, and a piece of the letter is missing.
How can I fix this?
Thank you.
Upvotes: 2
Views: 397
Reputation: 5584
The reason is this. In PrintLettreMotivTemplate.xaml
<UserControl x:Class="DelmePrint.PrintLettreMotivTemplate"
Width="815"
Height="1024"
>
<Grid x:Name="documentRoot">
...
</Grid>
</UserControl>
You've set the height of the printable area to 1024. When I stepped through the code,
/* DesiredSize always (793, 1024)
PrintableArea always (793, 1122) */
if (page.DesiredSize.Height > e.PrintableArea.Height)
So the code keeps adding lines to the middle section of the page.
To solve the problem, you need to change the Height in PrintLettreMotivTemplate to MinHeight. This way, the letter will overflow when there are too many lines.
<UserControl x:Class="DelmePrint.PrintLettreMotivTemplate"
Width="815"
MinHeight="1024"
>
<Grid x:Name="documentRoot">
...
</Grid>
</UserControl>
Upvotes: 3
Reputation: 361
Try with below property;
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;
};
Upvotes: 2