Silverlight:PrintPage无限循环,尽管HasMorePages为false

Silverlight: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

我正在用Silverlight打印一个包含几行的网格。 每当网格高度大于我设置的可打印区域HasMorePages为true和break时,否则HasMorePages设置为False。然而,这段代码会导致一个无限循环,因为PrintPage事件不断被调用,尽管“HasMorePages”为false

 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,而不是在每次迭代中

谢谢你的回复,这不是问题,但我根据你的建议调整了代码。没问题,我很高兴你找到了解决方案