data binding - XpsDocument को छपाई करते समय मेरे डाटाबेसिंग को क्यों खोया जा रहा है?




data-binding fixedpage (2)

इस बग का कारण यह है कि फिक्स्ड पेज के लेआउट को लिखने से पहले अद्यतन नहीं किया जा रहा है। इससे फिक्स्ड डॉक्यूमेंट स्यूक्वेंस में पहले फिक्स्ड पेज पर पहले फिक्स्ड पेज को गलत तरीके से लिखा जाना है। इससे परिणामस्वरूप दस्तावेज़ में कोई अन्य पृष्ठ प्रभावित नहीं होता है , जिसने इस बग / किनारे का मामला कठिन बना दिया है जो नीचे की ओर खिसक गया है।

निम्नलिखित कार्य (गैर-कार्यरत उदाहरण का दोबारा संस्करण):

FixedPage fp = CreateFixedPageWithBinding();
fp.DataContext = CreateDataContext();
var fd = new FixedDocument();

/* PAY ATTENTION HERE */
// set the page size on our fixed document 
fd.DocumentPaginator.PageSize =
   new System.Windows.Size()
   {
       Width = DotsPerInch * PageWidth,
       Height = DotsPerInch * PageHeight
   };
// Update the layout of our FixedPage
var size = fd.DocumentPaginator.PageSize;
page.Measure(size);
page.Arrange(new Rect(new Point(), size));
page.UpdateLayout();    
/* STOP PAYING ATTENTION HERE */

var pc = new PageContent();
((IAddChild)pc).AddChild(fp);
fd.Pages.Add(pageContent);
// Create a fixed document sequence and add the fixed document to it
FixedDocumentSequence fds = CreateFixedDocumentSequence();
var dr = new DocumentReference();
dr.BeginInit();
dr.SetDocument(fd);
dr.EndInit();
(fds as IAddChild).AddChild(dr);
// Create an xps document and write the fixed document sequence to it
var p = Package.Open("c:\\output.xps", FileMode.CreateNew);
var doc = new XpsDocument(p);
var writer = XpsDocument.CreateXpsDocumentWriter(doc);
wri2.Write(fds);
p.Flush();
p.Close();

अद्यतन करें!

बाध्यकारी काम करता है मुद्दा यह है कि XpsDocumentWriter फिक्स्ड डॉक्यूमेंट स्यूक्वेंस के पहले दस्तावेज़ के पहले पेज को ठीक से नहीं लिखता है। ऐसा लगता है कि बहुत से लोगों ने इस तरह की बात करते हुए एक समस्या का सामना किया (अर्थात्, दुनिया भर में पांच डेवलपर्स)। समाधान थोड़ा अजीब है। मैं इसे एक उत्तर के रूप में शामिल करता हूं

ठीक है, सवाल से थोड़ा अधिक सूक्ष्म लगता है

मुझे फिक्स्ड पेजेज की एक श्रृंखला मिल गई है, प्रत्येक में प्रत्येक के डेटाटॉन्टेक्स्ट को व्यक्तिगत रूप से सेट किया गया है। प्रत्येक फिक्स्ड पेज में एक या एक से अधिक नियंत्रण होते हैं जो संदर्भ के लिए बाध्य होते हैं।

अगर मैं इन फिक्स्ड पेजेज को एक फिक्स्ड डॉकोड में जोड़ता हूं और यह एक फिक्स्ड डॉक्यूमेंट को एक्सपीएस डॉक्युमेंट में लिखता हूं, तो मेरे बाइंड्स को डी-रेफरेन्डेड (ऐसा करने के लिए बोलना) होता है और सही मूल्य एक्सपीएस डॉक्युमेंट में प्रस्तुत किया जाता है।

अगर मैं इन फिक्स्डपेज को व्यक्तिगत फिक्स्ड डॉक्यूमेंट्स में जोड़ता हूं (प्रत्येक एफपी को नए एफडी में जोड़ा जाता है), तो ये फिक्स्डड डॉक्यूमेंट्स को फिक्स्ड डॉक्यूमेंट स्यूक्वेंस में जोड़ दिया जाता है, और यह अनुक्रम तब एक्सपीएस डॉक्युमेंट में लिखा जाता है, मेरे बाइंड्स को डी-रेफ्रेंस नहीं किया जाता है और मेरा फिक्स्ड पेज खाली दिखाई देता है ।

डिबगिंग मुझे बताता है कि मैं अपनी बाइंडिंग या मेरे बाध्यकारी संदर्भ को नहीं खो रहा हूं, इसलिए इस विफलता का कारण नहीं है।

यह स्पष्ट करने के लिए यहां कुछ नमूना कोड दिए गए हैं:

// This works
FixedPage fp = CreateFixedPageWithBinding();
fp.DataContext = CreateDataContext();
// Add my databound fixed page to a new fixed document
var fd = new FixedDocument();
var pc = new PageContent();
((IAddChild)pc).AddChild(fp);
fd.Pages.Add(pageContent);
// Create an xps document and write my fixed document to it
var p = Package.Open("c:\\output.xps", FileMode.CreateNew);
var doc = new XpsDocument(p);
var writer = XpsDocument.CreateXpsDocumentWriter(doc);
wri2.Write(fd);
p.Flush();
p.Close();

// This does NOT work
FixedPage fp = CreateFixedPageWithBinding();
fp.DataContext = CreateDataContext();
// Add my databound fixed page to a new fixed document
var fd = new FixedDocument();
var pc = new PageContent();
((IAddChild)pc).AddChild(fp);
fd.Pages.Add(pageContent);
// Create a fixed document sequence and add the fixed document to it
FixedDocumentSequence fds = CreateFixedDocumentSequence();
var dr = new DocumentReference();
dr.BeginInit();
dr.SetDocument(fd);
dr.EndInit();
(fds as IAddChild).AddChild(dr);
// Create an xps document and write the fixed document sequence to it
var p = Package.Open("c:\\output.xps", FileMode.CreateNew);
var doc = new XpsDocument(p);
var writer = XpsDocument.CreateXpsDocumentWriter(doc);
wri2.Write(fds);
p.Flush();
p.Close();

आप देख सकते हैं कि दोनों के बीच एकमात्र अंतर यह है कि मैं निश्चित दस्तावेज़ को एक निश्चित दस्तावेज़ अनुक्रम में जोड़ रहा हूं, जो तब लिखा जाता है।

जाहिर है, जो भी जादू होता है, डेटाबेस का मूल्यांकन करने का कारण बनता है और बाउंड वैल्यू डाली जा रही है, जब मेरे निश्चित दस्तावेज़ Xps दस्तावेज़ में नहीं लिखे जा रहे हैं। मुझे एक से अधिक निश्चित दस्तावेज लिखने में सक्षम होने की आवश्यकता है, और लिखने की विधि को केवल एक बार कहा जा सकता है, इस प्रकार मैं फिक्स्डडॉल्ड को फिक्स्ड डॉक्यूमेंट स्यूक्वेंस में जोड़ता हूं, जिसे मैं लिखता हूं। लेकिन मुझे यह भी काम करने के लिए मेरे खराब डाटाबेसिंग की आवश्यकता है!

इस स्थिति में किसी भी मदद की सराहना की जाएगी। मुझे पता है कि इसकी रूपरेखा का सबसे आम हिस्सा नहीं है; मैं सिर्फ उम्मीद कर रहा हूं कि यहां किसी के साथ कुछ परिचालनात्मक अनुभव है (मैं आपको देख रहा हूं, एमएस कर्मचारी को छिपाने)।


एक कारण है कि आप एक बाध्यकारी खो देते हैं कि आप कहीं अपवाद फेंक देते हैं - दुर्भाग्य से, यह अपवाद चुपचाप निगल लिया जाता है और आपके बाइंडिंग में "कार्य बंद हो जाता है" पहले-मौका अपवादों को चालू करें और देखें कि कुछ भी हिट हो जाता है।