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

时间:2014-03-04 13:22:06

标签: silverlight printing infinite-loop printdocument

我正在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的开头并继续执行该操作永远。

如何停止此循环?

2 个答案:

答案 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循环,然后打印页面。