【发布时间】:2014-03-04 13:22:05
【问题描述】:
我在 Silverlight 中打印一个包含多行的网格。 每当网格高度大于 PrintableArea 时,我将 HasMorePages 设置为 true 并中断,否则 HasMorePages 设置为 False。然而,这段代码会导致无限循环,因为尽管“HasMorePages”为假,但 PrintPage 事件会不断被调用。
private void PrintButton_Click(object sender, RoutedEventArgs e)
{
PrintDocument document = new PrintDocument();
// create a copy of the MDivReq form by calling the constructor with the same parameters
Common.MDivDegreeReq mymdiv = scrllvwr.Content as Common.MDivDegreeReq;
int totalrows =mymdiv.LayoutRoot.RowDefinitions.Count;
document.PrintPage +=(s,args) =>
{
Grid GridToBePrinted = new Grid();
GridToBePrinted.Height = 0;
for (int i = 0; i < mymdiv.LayoutRoot.RowDefinitions.Count; i++ )
{
// if GridToBePrinted height + this rows height is less than the PrintableArea heigh
// then add this row to the gridtobeprinted.
if (GridToBePrinted.Height + mymdiv.LayoutRoot.RowDefinitions[i].ActualHeight + 20 < args.PrintableArea.Height)
{
RowDefinition myrow = new RowDefinition();
myrow = mymdiv.LayoutRoot.RowDefinitions[i];
//myrow = mymdiv.LayoutRoot.RowDefinitions[i].MemberwiseClone();
i--;
mymdiv.LayoutRoot.RowDefinitions.Remove(myrow);
GridToBePrinted.RowDefinitions.Add(myrow);
GridToBePrinted.Height += myrow.ActualHeight;
if (mymdiv.LayoutRoot.RowDefinitions.Count == 0)
{
break;
}
args.HasMorePages = false;
}
else
{
if (mymdiv.LayoutRoot.RowDefinitions[i].ActualHeight > args.PrintableArea.Height)
{
mymdiv.LayoutRoot.RowDefinitions.RemoveAt(i);
continue;
}
args.PageVisual = GridToBePrinted;
args.HasMorePages = true;
//i++;
break;
}
}
};
document.Print(mystudent + " - MDiv Requirements");
}
代码卡住如下: 最后当所有 mymdiv.LayoutRoot.RowDefinitions.Count=0 时,再次调用 PrintPage 并检查 forloop 发现不满足条件,然后再次进入 PrintPage 的开头并继续执行该操作永远。
我怎样才能停止这个循环?
【问题讨论】:
标签: silverlight printing infinite-loop printdocument