【问题标题】:Silverlight: PrintPage infinite loop although HasMorePages is falseSilverlight:PrintPage 无限循环,尽管 HasMorePages 为假
【发布时间】: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


    【解决方案1】:

    解决方案: 问题是虽然“HasMorePages”是假的,但“PageVisual”有一个空值,所以它再次调用了PrintPage。修复 PageVisual 值停止了循环。

    我的代码的改进: 使用“DNKROZ”的建议将 HasMorePages 设置为 false ,而不是每次迭代。

    【讨论】:

      【解决方案2】:

      为什么每次迭代都设置args.HasMorePages = false;

      是否应该不设置在这个 if 语句中:

       if (mymdiv.LayoutRoot.RowDefinitions.Count == 0)
       {
          args.HasMorePages = false;
          break;
       }
      

      然后它会读取,如果没有剩余行可打印 - 将 hasMorePages 设置为 false 并退出 for 循环,然后打印页面。

      【讨论】:

      • 感谢您的回复,这不是问题,但我根据您的建议调整了代码。
      • 没问题,很高兴你找到了解决方案
      猜你喜欢
      • 1970-01-01
      • 2015-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-11
      • 1970-01-01
      • 2018-06-14
      • 2019-10-21
      相关资源
      最近更新 更多