2016-08-22 17 views
5

मैं अपने यूडब्ल्यूपी ऐप से कुछ प्रिंट करने की कोशिश कर रहा हूं। मूल रूप से मैंने कुछ FrameworkElement (Windows.UI.Xaml.Shapes.Rectangle) पर कुछ डेटा खींचने के लिए वेबव्यूब्रश का उपयोग किया है - और मैं प्रत्येक पृष्ठ पर एक आयत (एक प्रति आयताकार)यूडब्ल्यूपी ऐप में कैसे प्रिंट करें?

पर इन आयतों में से एक प्रिंट करना चाहता हूं

मैं वास्तव में उम्मीद कर रहा था कि कोई यूडब्ल्यूपी काम करता है कि कैसे एक बहुत ही सरल उदाहरण प्रदान कर सकता है। मैं इसे अपने आप की कोशिश की है और मैं अपने कोड प्रदान करने के लिए खुश हूँ, लेकिन वहाँ ईमानदारी से लाइनों के हजारों कर रहे हैं - जो सभी के मैं माइक्रोसॉफ्ट GitHub उदाहरण से लिया गया है और सुधार करने की कोशिश की:

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

धन्यवाद। मुझे लगता है कि कोई भी व्यक्ति जो इस प्रश्न का उत्तर सरल तरीके से दे सकता है, वह भविष्य में एक निश्चित संदर्भ बिंदु बन जाएगा - क्योंकि इस विषय के बारे में ऑनलाइन जानकारी बहुत दुर्लभ है।

उत्तर

8

यूडब्ल्यूपी ऐप्स में प्रिंट करने के लिए, आप Print from your app में चरणों का पालन कर सकते हैं। और गिटहब पर Printing sample का भी संदर्भ लें। निम्नलिखित सरल नमूना दर्शाता है कि पृष्ठ पर एक आयताकार कैसे मुद्रित करें।

एक्सएएमएल में, एक प्रिंट बटन और आयत मुद्रित करने के लिए जोड़ें।

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition /> 
    </Grid.RowDefinitions> 
    <Button HorizontalAlignment="Center" Click="PrintButtonClick">Print</Button> 
    <Rectangle x:Name="RectangleToPrint" 
       Grid.Row="1" 
       Width="500" 
       Height="500"> 
     <Rectangle.Fill> 
      <ImageBrush ImageSource="Assets/img.jpg" /> 
     </Rectangle.Fill> 
    </Rectangle> 
</Grid> 

और कोड-पीछे में, प्रिंट तर्क को संभाल लें।

public sealed partial class MainPage : Page 
{ 
    private PrintManager printMan; 
    private PrintDocument printDoc; 
    private IPrintDocumentSource printDocSource; 

    public MainPage() 
    { 
     this.InitializeComponent(); 
    } 

    #region Register for printing 

    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     // Register for PrintTaskRequested event 
     printMan = PrintManager.GetForCurrentView(); 
     printMan.PrintTaskRequested += PrintTaskRequested; 

     // Build a PrintDocument and register for callbacks 
     printDoc = new PrintDocument(); 
     printDocSource = printDoc.DocumentSource; 
     printDoc.Paginate += Paginate; 
     printDoc.GetPreviewPage += GetPreviewPage; 
     printDoc.AddPages += AddPages; 
    } 

    #endregion 

    #region Showing the print dialog 

    private async void PrintButtonClick(object sender, RoutedEventArgs e) 
    { 
     if (PrintManager.IsSupported()) 
     { 
      try 
      { 
       // Show print UI 
       await PrintManager.ShowPrintUIAsync(); 
      } 
      catch 
      { 
       // Printing cannot proceed at this time 
       ContentDialog noPrintingDialog = new ContentDialog() 
       { 
        Title = "Printing error", 
        Content = "\nSorry, printing can' t proceed at this time.", 
        PrimaryButtonText = "OK" 
       }; 
       await noPrintingDialog.ShowAsync(); 
      } 
     } 
     else 
     { 
      // Printing is not supported on this device 
      ContentDialog noPrintingDialog = new ContentDialog() 
      { 
       Title = "Printing not supported", 
       Content = "\nSorry, printing is not supported on this device.", 
       PrimaryButtonText = "OK" 
      }; 
      await noPrintingDialog.ShowAsync(); 
     } 
    } 

    private void PrintTaskRequested(PrintManager sender, PrintTaskRequestedEventArgs args) 
    { 
     // Create the PrintTask. 
     // Defines the title and delegate for PrintTaskSourceRequested 
     var printTask = args.Request.CreatePrintTask("Print", PrintTaskSourceRequrested); 

     // Handle PrintTask.Completed to catch failed print jobs 
     printTask.Completed += PrintTaskCompleted; 
    } 

    private void PrintTaskSourceRequrested(PrintTaskSourceRequestedArgs args) 
    { 
     // Set the document source. 
     args.SetSource(printDocSource); 
    } 

    #endregion 

    #region Print preview 

    private void Paginate(object sender, PaginateEventArgs e) 
    { 
     // As I only want to print one Rectangle, so I set the count to 1 
     printDoc.SetPreviewPageCount(1, PreviewPageCountType.Final); 
    } 

    private void GetPreviewPage(object sender, GetPreviewPageEventArgs e) 
    { 
     // Provide a UIElement as the print preview. 
     printDoc.SetPreviewPage(e.PageNumber, this.RectangleToPrint); 
    } 

    #endregion 

    #region Add pages to send to the printer 

    private void AddPages(object sender, AddPagesEventArgs e) 
    { 
     printDoc.AddPage(this.RectangleToPrint); 

     // Indicate that all of the print pages have been provided 
     printDoc.AddPagesComplete(); 
    } 

    #endregion 

    #region Print task completed 

    private async void PrintTaskCompleted(PrintTask sender, PrintTaskCompletedEventArgs args) 
    { 
     // Notify the user when the print operation fails. 
     if (args.Completion == PrintTaskCompletion.Failed) 
     { 
      await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async() => 
      { 
       ContentDialog noPrintingDialog = new ContentDialog() 
       { 
        Title = "Printing error", 
        Content = "\nSorry, failed to print.", 
        PrimaryButtonText = "OK" 
       }; 
       await noPrintingDialog.ShowAsync(); 
      }); 
     } 
    } 

    #endregion 
} 
+1

शानदार उदाहरण! माइक्रोसॉफ्ट उदाहरण बहुत जटिल हैं। –

+0

मुझे वास्तव में आपका उदाहरण पसंद है, हालांकि जब मैं प्रिंट बटन पर क्लिक करता हूं तो मुझे यह अपवाद मिल रहा है: System.AccessViolationException: 'संरक्षित स्मृति को पढ़ने या लिखने का प्रयास किया गया। यह अक्सर एक संकेत है कि अन्य स्मृति भ्रष्ट है। ' यह त्रुटि printDoc.SetPreviewPage होती है। मुझे इस मुद्दे का समाधान नहीं मिल रहा है, क्या आप जानते हैं कि इसे कैसे हल किया जाए। –

+0

@TravisPettry मैं आपकी तरफ से अपनी समस्या का पुनरुत्पादन नहीं कर सकता। आप कुछ अन्य उपकरणों के साथ परीक्षण करने का प्रयास कर सकते हैं। यदि आपके पास अभी भी यह समस्या है, तो मैं सुझाव दूंगा कि आप एक [mcve] के साथ एक नया प्रश्न पूछें जो आपकी समस्या को पुन: उत्पन्न कर सकता है। –

1

मैं इसके साथ भी संघर्ष कर रहा हूं। मैं एसडीके उदाहरण से ऊपर चला गया हूं। यह समाधान आपके लिए उपयोगी हो सकता है। यदि कोई तरीका है कि आप एक रिचटेक्स्टबॉक्स में प्रिंट करना चाहते हैं, तो आप इसे प्रोग्रामेटिक रूप से पैराग्राफ बना सकते हैं। और एसडीके उदाहरण में RichTextBox को एक रिक्त स्टैकपैनल के साथ प्रतिस्थापित करें जिसे आपने ग्रिड आवश्यकताओं को निर्धारित किया है, और यह आपकी समस्या का समाधान करेगा। मेरा बिल्कुल एक ही मुद्दा नहीं था, क्योंकि मैंने इसे 2 कॉलम वाली किराने की सूची बनाने के साथ भी किया है। यह चाल मेरे उदाहरण में एक निश्चित चौड़ाई फ़ॉन्ट, कूरियरन्यू का उपयोग करना था।

अपने पृष्ठ कि प्रिंट पुस्तकालयों कॉल में, आप आप सही निर्माता में इस सामग्री का निर्माण कर सकते XAML

<Canvas x:Name="PrintCanvas" Opacity="0"/>

पेज कि PageToPrint के लिए प्रतिस्थापन है में इस की आवश्यकता है,। मैं पेज के इन्स्टेन्शियशन में एक संग्रह गुजरती हैं, और उसके बाद PageToPrint विकल्प नहीं है, इस तरह के लेआउट सही गणना ,,,

private void MakeThePrintOut() 
    { 


     RichTextBlock gutOne = initBlock(); 
     PopulateBlock(gutOne); 
     ContentStack.Children.Add(gutOne); 


    } 
    private RichTextBlock initBlock() 
    { 

     RichTextBlock gutInitBlock = new RichTextBlock(); 
     gutInitBlock.Foreground = new SolidColorBrush(Windows.UI.Colors.Black); 
     gutInitBlock.FontSize = 18; 
     gutInitBlock.OverflowContentTarget = FirstLinkedContainer; 
     gutInitBlock.FontFamily = new FontFamily("Courier New"); 
     gutInitBlock.VerticalAlignment = VerticalAlignment.Top; 
     gutInitBlock.HorizontalAlignment = HorizontalAlignment.Left; 
     return gutInitBlock; 

    } 
    private void PopulateBlock(RichTextBlock Blocker) 
    { 


     bool firstItem = true; 
     int firstLength = 0; 
     Paragraph paraItem = null; 
     Run itemRun = null; 

     string CurrentIsle = "None"; 

     foreach(Grocery j in Grocs) 
     { 
      if (j.Isle != CurrentIsle) 
      { 
       if ((CurrentIsle != "None") && (!firstItem)) 
       { 
        paraItem.Inlines.Add(itemRun); 
        Blocker.Blocks.Add(paraItem); 

       } 
       CurrentIsle = j.Isle; 
       firstItem = true; 
       Paragraph paraIsle = new Paragraph(); 
       Run paraRan = new Run(); 
       paraRan.Text = "  " + j.Isle; 
       paraIsle.Inlines.Add(paraRan); 
       Blocker.Blocks.Add(paraIsle); 


      } 
      if (firstItem) 
      { 
       paraItem = new Paragraph(); 
       itemRun = new Run(); 
       itemRun.Text = "  [] " + j.Item; 
       firstLength = j.Item.Length; 
       firstItem = false; 
      } else 
      { 
       firstItem = true; 
       string s = new string(' ', 30 - firstLength); 
       itemRun.Text += s + "[] " + j.Item; 
       paraItem.Inlines.Add(itemRun); 
       Blocker.Blocks.Add(paraItem); 

      } 





      } 
     if (!firstItem) 
     { 
      paraItem.Inlines.Add(itemRun); 
      Blocker.Blocks.Add(paraItem); 
     } 
    } 

यह वास्तव में क्या आप देख रहे हैं नहीं कर रहा है, लेकिन मैं जानता हूँ कि यह कितना मुश्किल है प्रिंटिंग प्रश्न का उत्तर देने के लिए कुछ समझने के लिए। यदि आप पूरा उदाहरण देखना चाहते हैं तो यह मेरे GitHub.com/Gibbloggen GutenbergOne प्रोजेक्ट पर है, मेरा प्रोटोटाइप था कि मैंने यह सामान विकसित किया था। और मैंने अपने मुख्य प्रोजेक्ट EssentialGrocer में भी आयात किया है, यह भी एक ही स्थान पर खुला स्रोत है। वह, आज रात, खरीदारी सूची की छपाई शामिल है।

आशा है कि इनमें से कुछ मदद करता है, मैंने वास्तव में भी इस के साथ संघर्ष किया है।

संबंधित मुद्दे