Silverlight:PrintPage无限循环,尽管HasMorePages为false
我正在用Silverlight打印一个包含几行的网格。 每当网格高度大于我设置的可打印区域HasMorePages为true和break时,否则HasMorePages设置为False。然而,这段代码会导致一个无限循环,因为PrintPage事件不断被调用,尽管“HasMorePages”为falseSilverlight:PrintPage无限循环,尽管HasMorePages为false,silverlight,printing,infinite-loop,printdocument,Silverlight,Printing,Infinite Loop,Printdocument,我正在用Silverlight打印一个包含几行的网格。 每当网格高度大于我设置的可打印区域HasMorePages为true和break时,否则HasMorePages设置为False。然而,这段代码会导致一个无限循环,因为PrintPage事件不断被调用,尽管“HasMorePages”为false private void PrintButton_Click(object sender, RoutedEventArgs e) { PrintDocument documen
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");
}
private void PrintButton\u单击(对象发送者,路由目标)
{
PrintDocument文档=新的PrintDocument();
//通过使用相同的参数调用构造函数来创建MDivReq表单的副本
Common.mdivdegreeq mymdiv=scrllvwr.Content as Common.mdivdegreeq;
int totalrows=mymdiv.LayoutRoot.RowDefinitions.Count;
document.PrintPage+=(s,args)=>
{
Grid GridToBePrinted=新网格();
GridToBePrinted.Height=0;
对于(int i=0;iargs.PrintableArea.Height)
{
mymdiv.LayoutRoot.RowDefinitions.RemoveAt(i);
继续;
}
args.PageVisual=GridToBePrinted;
args.HasMorePages=true;
//i++;
打破
}
}
};
文件打印(mystudent+“-MDiv要求”);
}
代码如下所示:
当所有mymdiv.LayoutRoot.RowDefinitions.Count都为0时,会再次调用PrintPage并检查forloop,发现它不满足条件,然后它会再次转到PrintPage的开头,并一直这样做
如何停止此循环?Howcome
args.HasMorePages=false每次迭代都要设置代码>
如果不在此if语句中设置:
if (mymdiv.LayoutRoot.RowDefinitions.Count == 0)
{
args.HasMorePages = false;
break;
}
因此,它会显示,如果没有行要打印-将hasMorePages设置为false并退出for循环,然后打印页面。解决方案:
问题是,虽然“HasMorePages”为false,但“PageVisual”的值为null,因此它再次调用PrintPage。修复PageVisual值停止了循环
对我的代码的改进:
使用“DNKROZ”的建议将HasMorePages设置为false,而不是在每次迭代中 谢谢你的回复,这不是问题,但我根据你的建议调整了代码。没问题,我很高兴你找到了解决方案