2014-03-04 39 views
0

我正在Silverlight中打印包含多行的網格。 每當網格高度超過PrintableArea時,我將HasMorePages設置爲true並中斷,否則HasMorePages設置爲False。但是,此代碼會導致無限循環,因爲儘管「HasMorePages」爲false,PrintPage事件仍會一次又一次地被調用。雖然HasMorePages爲false,但Silverlight: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再次調用,並檢查for循環結束時發現其不符合條件,那麼它會再次進入PrintPage的開始並繼續這樣做。

如何停止此循環?

回答

1

解決方案: 問題是雖然「HasMorePages」爲false,但「PageVisual」爲null值,所以它再次調用PrintPage。修復PageVisual值會停止循環。

改進我的代碼: 使用「DNKROZ」的建議將HasMorePages設置爲false,而不是每次迭代。

0

Howcome args.HasMorePages = false;正在每次迭代設置?

豈不是這裏面的if語句設置:

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

現在,它讀取,如果沒有行左打印 - 集HasMorePages的虛假和退出for循環,然後打印此頁。

+0

感謝您的回覆,這不是問題,但我調整了我的代碼與您的建議。 – user3340627

+0

沒問題,我很高興你找到了解決方案 – DNKROZ