我正在Silverlight中打印一个包含多行的网格。 每当网格高度超过PrintableArea时,我将HasMorePages设置为true并中断,否则HasMorePages设置为False。但是,此代码会导致无限循环,因为尽管“HasMorePages”为false,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的开头并继续执行该操作永远。
如何停止此循环?
答案 0 :(得分:1)
解决方案: 问题是虽然“HasMorePages”是假的,但“PageVisual”有一个空值,所以它再次调用了PrintPage。修复PageVisual值会停止循环。
我的代码的改进: 使用“DNKROZ”的建议将HasMorePages设置为false而不是每次迭代。
答案 1 :(得分:0)
每次迭代都设置了args.HasMorePages = false;
?
如果不在if语句中设置:
if (mymdiv.LayoutRoot.RowDefinitions.Count == 0)
{
args.HasMorePages = false;
break;
}
然后它读取,如果没有要打印的行 - 将hasMorePages设置为false并退出for循环,然后打印页面。