को प्रश्नमुद्रण BlockUIContainer XpsDocument/FixedDocument
- आप कैसे एक FlowDocument कि
BlockUIContainer
प्रिंट करूं? - मैं फ़्लो डॉक्यूमेंट पर एक उपाय/अपडेट/व्यवस्था कैसे कर सकता हूं?
पृष्ठभूमि
मैं एक जेनरेट किया है पाठ के पैराग्राफ के साथ FlowDocument
एक संसाधन शब्दकोश से DrawingBrushes
और BlockUIContainer
भरा कस्टम नियंत्रण के साथ कुछ Rectangle
तत्वों के साथ। जब FlowDocument * में से किसी में देखी
दस्तावेज़ सही ढंग से प्रस्तुत करने को नियंत्रित करता है हालांकि जब दस्तावेज़ FixedDocument/XpsDocument में बदल जाती है, Rectangle
या BlockUIContainer
तत्वों में से कोई भी प्रस्तुत करना।
मैं ऐसा इसलिए है क्योंकि नियंत्रण मापा नहीं किया गया है लगभग कुछ कर रहा हूँ/व्यवस्था की, तथापि को समझ नहीं सकता कैसे इससे पहले कि यह XpsDocument में बदल जाती है तो होना ही है कि मजबूर करने के लिए।
मैं
LogicalTree
रिकर्सिवलीUIElement element = (UIElement)d; element.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity)); element.Arrange(new Rect(element.DesiredSize)); element.UpdateLayout();
चला गया है और निम्नलिखित किये, जहां
d
एकDependencyObject
है। मैं देख सकता हूं कि यह डीबगर में ब्रेक-पॉइंट होने परActualWidth
औरActualHeight
गुण सेट करता है।मैं के रूप में Will ♦ ने सुझाव दिया रेंडर करने के लिए मजबूर कर रहा
Dispatcher
कोशिश की है।
कोड XpsDocument
public class XpsDocumentConverter
{
public static XpsDocumentReference CreateXpsDocument(FlowDocument document)
{
// Need to clone the document so that the paginator can work
FlowDocument clonedDocument = DocumentHelper.Clone<FlowDocument>(document);
Uri uri = new Uri(String.Format("pack://temp_{0}.xps/", Guid.NewGuid().ToString("N")));
MemoryStream ms = new MemoryStream();
Package pkg = Package.Open(ms, FileMode.Create, FileAccess.ReadWrite);
PackageStore.AddPackage(uri, pkg);
XpsDocument xpsDocument = new XpsDocument(pkg, CompressionOption.Normal, uri.AbsoluteUri);
XpsSerializationManager rsm = new XpsSerializationManager(new XpsPackagingPolicy(xpsDocument), false);
DocumentPaginator paginator = new FixedDocumentPaginator(clonedDocument, A4PageDefinition.Default);
rsm.SaveAsXaml(paginator);
return new XpsDocumentReference(ms, xpsDocument);
}
}
मुद्रित करने के लिए आप मैं भी एक कस्टम DocumentPaginator
'FixedDocumentPaginator' नाम का उपयोग कर रहा देख सकते हैं इस्तेमाल किया; हालांकि मैं उस कोड को पोस्ट नहीं करूंगा क्योंकि मुझे संदेह है कि समस्या तब तक है जब तक यह GetPage(int pageNumber)
में दस्तावेज़ को पेजिंग करना शुरू कर देता है, सब कुछ पहले से ही Visual
रूपांतरित कर दिया गया है और यह लेआउट के लिए बहुत देर हो चुकी है।
संपादित
हम्म। जैसा कि मैंने इसे टाइप किया था, एक विचार सिर्फ मेरे सामने हुआ कि क्लोन दस्तावेज़ में Measure/Arrange/UpdateLayout
नहीं हो सकता है।
प्रश्न: मैं फ़्लो डॉक्यूमेंट पर एक उपाय/अपडेट/व्यवस्था कैसे कर सकता हूं?
एक संभावित हैक जिसे मैं काम कर सकता हूं, क्लॉल्ड दस्तावेज़ को फ़्लो डॉक्यूमेंट व्यूअर (शायद ऑफ-स्क्रीन) में से एक में दिखाएगा।
एक अन्य संभावित समाधान है कि मैं सिर्फ के बारे में सीखा और प्रयास नहीं किया है कॉल करने के लिए होगा: ContextLayoutManager.From(Dispatcher.CurrentDispatcher).UpdateLayout();
ContextLayoutManager
आप के लिए तार्किक पेड़ चलता है और लेआउट अद्यतन करता है।
कोड दस्तावेज़
public static FlowDocument Clone(FlowDocument originalDocument)
{
FlowDocument clonedDocument = new FlowDocument();
TextRange sourceDocument = new TextRange(originalDocument.ContentStart, originalDocument.ContentEnd);
TextRange clonedDocumentRange = new TextRange(clonedDocument.ContentStart, clonedDocument.ContentEnd);
try
{
using (MemoryStream ms = new MemoryStream())
{
sourceDocument.Save(ms, DataFormats.XamlPackage);
clonedDocumentRange.Load(ms, DataFormats.XamlPackage);
}
clonedDocument.ColumnWidth = originalDocument.ColumnWidth;
clonedDocument.PageWidth = originalDocument.PageWidth;
clonedDocument.PageHeight = originalDocument.PageHeight;
clonedDocument.PagePadding = originalDocument.PagePadding;
clonedDocument.LineStackingStrategy = clonedDocument.LineStackingStrategy;
return clonedDocument;
}
catch (Exception)
{
}
return null;
}
इस के लिए धन्यवाद, सिर्फ अपने आप को इस नरक के माध्यम से किया गया है, तो आप एक बहुत =) – JMK
क्या 'XpsDocumentReference' में हो रहा है मदद की? मैं से प्रिंट करने का प्रयास रखना एक '' GetFixedDocumentSequence()। DocumentPaginator' के माध्यम से एक्सपीएस दस्तावेज़ से 'DocumentPaginator' खींच कर PrintDialog'। मुझे एक अमान्युरि अपवाद के परिणामस्वरूप एक एक्समल पार्स अपवाद मिलता है। जाहिर है कि निश्चित दस्तावेज यूआरआई किसी भी तरह उलझा हुआ है। –
@ ऑस्टिनमुलिन्स http://stackoverflow.com/questions/9647401/documentviewer-to-richtextbox-binding-error पर मेरे उत्तर पर एक नज़र डालें, यह 'XpsDocumentReference' के कार्यान्वयन को दिखाता है। XPS को देखने के बाद से यह कुछ सालों से रहा है। पुन: प्रयास करने और मदद करने के लिए खुश।ओपन सोर्स लाइब्रेरी बनाने का यह एक अच्छा मौका होगा। – Dennis