2013-07-09 5 views
0

Я пытаюсь напечатать Usercontrol как страницы. Она работает очень хорошо для первой страницыПроблема с DataBinding для первой печати UserControl

здесь код для моей печати, кроме:

#region Print 
    /// <summary> 
    /// Used the XpsDocumentWriter to write a FixedDocumentSequence which contains the UIElements as single pages 
    /// </summary> 
    /// <param name="xpsWriter"></param> 
    /// <param name="uiElements"></param> 
    private void PrintUIElements(XpsDocumentWriter xpsWriter, List<UIElement> uiElements) 
    { 
     FixedDocumentSequence fixedDocSeq = new FixedDocumentSequence(); 

     foreach (UIElement element in uiElements) 
      (fixedDocSeq as IAddChild).AddChild(toDocumentReference(element)); 

     // write the FixedDocumentSequence as an XPS Document 
     xpsWriter.Write(fixedDocSeq); 
    } 

    /// <summary> 
    /// encapsulater for a UIElement in an DocumentReference 
    /// DocumentReference(FixedDocument(PageContent(FixedPage(UIElement)))) 
    /// to simplify the print of multiple pages 
    /// </summary> 
    /// <param name="uiElement">the UIElement which</param> 
    /// <returns>creates a DocumentReference</returns> 
    private DocumentReference toDocumentReference(UIElement uiElement) 
    { 
     if (uiElement == null) 
      throw new NullReferenceException("the UIElement has to be not null"); 

     FixedPage fixedPage = new FixedPage(); 
     PageContent pageContent = new PageContent(); 
     FixedDocument fixedDoc = new FixedDocument(); 
     DocumentReference docRef = new DocumentReference(); 

     #region Step1 

     // add the UIElement object the FixedPage 
     fixedPage.Children.Add(uiElement); 

     #endregion 

     #region Step2 

     // add the FixedPage to the PageContent collection 
     pageContent.BeginInit(); 
     ((IAddChild)pageContent).AddChild(fixedPage); 
     pageContent.EndInit(); 

     #endregion 

     #region Step 3 

     // add the PageContent to the FixedDocument collection 
     ((IAddChild)fixedDoc).AddChild(pageContent); 

     #endregion 

     #region Step 4 


     // add the FixedDocument to the document reference collection 
     docRef.BeginInit(); 
     docRef.SetDocument(fixedDoc); 
     docRef.EndInit(); 

     #endregion 

     return docRef; 
    } 
    #endregion 

и я использую его как этот

  var pDialog = new PrintDialog(); 

      if (pDialog.ShowDialog() == true) 
      { 
       List<UIElement> list = new List<UIElement>(); 

       foreach (CostumerVM item in Itemlist.Where(item => item.isChecked == true)) 
       { 
        var vm = new CostumerpageVM(item.VName, item.NName, item.DebNr, item.Original.Id, plan, User.Einrichtungen.refSpeiseplantypId, selectedKW.Key); 
        var window = new PageV{ DataContext = vm }; 
        list.Add(window); 
       } 

       var xpsDocWriter = PrintQueue.CreateXpsDocumentWriter(pDialog.PrintQueue); 
       PrintUIElements(xpsDocWriter, list); 
      } 

чем я создал небольшую тестовую версию, чтобы проверить мой метод печати и результат, это хорошо работает, поэтому я подумал, что, может быть, мой LazyLoad является проблемой, поэтому я создал метод init

// in my CostumerpageVM 
    public void Init() 
    { 
     var properties = this.GetType().GetProperties(); 

     foreach (var p in properties) 
     { 
      if (p.Name != "Item") // is part of the IDataError and it must not be called 
      { var a = p.GetValue(this, null); } 
     } 
    } 

, но я перед еще такой же проблемой, поэтому дальнейшие предложения были бы весьма признателен

, что я также Allready проверки

  • this solution for binding errors (не знает, как реализовать в моем случае)
  • добавил Загруженное событие в моем PAGEV который не дозвонился

ответ

0

ок я установил его случайно :) я изменил мой метод печати после прочтения что-то больше о FixedDocumen t и моя привязка больше не теряется в пространстве

/// <summary> 
    /// Used the XpsDocumentWriter to write a FixedDocument which get created and contains the UIElements as single pages 
    /// </summary> 
    /// <param name="xpsWriter">XpsDocumentWriter</param> 
    /// <param name="uiElements">List of UIElement</param> 
    private void PrintUIElements(XpsDocumentWriter xpsWriter, List<UIElement> uiElements) 
    { 
     var fixedDoc = new FixedDocument(); 

     foreach (UIElement element in uiElements) 
     { 
      var fixedPage = new FixedPage(); 
      var pageContent = new PageContent(); 

      // add the UIElement object the FixedPage 
      fixedPage.Children.Add(element); 

      // add the FixedPage object the PageContent 
      pageContent.Child = fixedPage; 

      // add the PageContent object the FixedDocument 
      fixedDoc.Pages.Add(pageContent); 
     } 

     xpsWriter.Write(fixedDoc); 
    } 
Смежные вопросы