从Win RT应用程序打印(Windows 8.1应用程序)

时间:2016-01-27 06:35:31

标签: printing winrt-xaml windows-applications epson

我正在开发Windows 8.1(通用应用程序)中的POS应用程序。 订单收据将从应用程序打印,甚至我能够这样做。

打印机 - EPSON TM-U220D

输入 - 正在使用ViewModel中的动态内容实际创建网格。所以这个网格是打印机的输入

输出 - 在打印预览(Attahced pic 1)中看起来都不错但是当实际打印收据时,内容会从结尾处被截断(Attahced pic 2)

PIC 1 enter image description here

PIC 2 enter image description here

观察 -

  1. 如果我使用打印命令手动打印普通文本文件(右键单击文件然后打印),则所有内容都将完美打印。
  2. 如果我从应用程序打印SAME内容,通过创建动态网格,然后使用小字体打印是好的,但是更大的字体大小内容再次切断。
  3. 尝试 -

    1. 通过指定高度
    2. 优化了创建Gird的代码

      问题 -

      1. 如果预览都很好,那么为什么不输出
      2. 是否有人尝试过使用ePOS-Print_SDK_141020E进行Windows应用商店应用?
      3. 生成动态网格代码

         private void AddRows(Grid grid, int count)
            {
                for (int i = 0; i < count; i++)
                {
                    RowDefinition row = new RowDefinition();
                    row.Height = GridLength.Auto;
                    grid.RowDefinitions.Add(row);
                }
            }
        
            private void AddColumns(Grid grid, int count)
            {
                for (int i = 0; i < count; i++)
                {
                    grid.ColumnDefinitions.Add(new ColumnDefinition());
        
                }
            }
        
            private TextBlock CreateTextBlock(string text, Color color, FontWeight fw, double fs = 10, int thick = 5)
            {
                if (color == null) color = Colors.Black;
                TextBlock txtBlock1 = new TextBlock();
                txtBlock1.Text = text;
                txtBlock1.FontSize = fs;
                txtBlock1.FontWeight = fw;
                txtBlock1.Foreground = new SolidColorBrush(color);
                txtBlock1.VerticalAlignment = VerticalAlignment.Center;
                txtBlock1.Margin = new Thickness(thick);
                return txtBlock1;
            }
        
        
            private async Task<Grid> CreateDynamicWPFGrid()
            {
                Grid ParentGrid = new Grid();
                AddRows(ParentGrid, 8);
                /* Start First Grid*/
                Grid DynamicGrid = new Grid();
                DynamicGrid.Width = 230;
                DynamicGrid.HorizontalAlignment = HorizontalAlignment.Left;
                DynamicGrid.VerticalAlignment = VerticalAlignment.Top;
                DynamicGrid.Margin = new Thickness(24, 0, 0, 0);
        
                AddColumns(DynamicGrid, 2);
                AddRows(DynamicGrid, 3);
        
                TextBlock txtBlock1 = CreateTextBlock(DateTime.Now.ToString("M/d/yy"), Colors.Black, FontWeights.Normal);
                Grid.SetRow(txtBlock1, 0);
                Grid.SetColumn(txtBlock1, 1);
                .
                .
                .
                .
                Return ParentGrid;
            }
        

        打印机事件代码

               //Register Print Contract
            async Task RegisterPrintContract()
            {
                PrintManager manager = PrintManager.GetForCurrentView();
                manager.PrintTaskRequested += OnPrintTaskRequested;
                await PrintManager.ShowPrintUIAsync();
            }
            //Unregister Print Contract
            void UnregisterPrintContract()
            {
                PrintManager printMan = PrintManager.GetForCurrentView();
                printMan.PrintTaskRequested -= OnPrintTaskRequested;
            }
            void OnPrintTaskRequested(PrintManager sender, PrintTaskRequestedEventArgs args)
            {
                // If I need to be asynchronous, I can get a deferral. I don't *need*  
                // to do this here, I'm just faking it.  
                var deferral = args.Request.GetDeferral();
        
                PrintTask printTask = args.Request.CreatePrintTask("My Print Job", OnPrintTaskSourceRequestedHandler);
        
                printTask.Completed += OnPrintTaskCompleted;
        
                deferral.Complete();
            }
            void OnPrintTaskCompleted(PrintTask sender, PrintTaskCompletedEventArgs args)
            {
                // TODO: Tidy up.  
                this._document = null;
                this._pages = null;
            }
            async void OnPrintTaskSourceRequestedHandler(PrintTaskSourceRequestedArgs args)
            {
                var deferral = args.GetDeferral();
        
                await Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
                  () =>
                  {
                      this._document = new PrintDocument();
                      this._document.Paginate += OnPaginate;
                      this._document.GetPreviewPage += OnGetPreviewPage;
                      this._document.AddPages += OnAddPages;
        
                      // Tell the caller about it.  
                      args.SetSource(this._document.DocumentSource);
                  });
                deferral.Complete();
            }
            void OnAddPages(object sender, AddPagesEventArgs e)
            {
                // Loop over all of the preview pages and add each one to  add each page to be printied
                // We should have all pages ready at this point...
                foreach (var page in this._pages)
                {
                    //this._pages[page.Key]
                    this._document.AddPage(this._pages[page.Key]);
                }
        
                PrintDocument printDoc = (PrintDocument)sender;
                // Indicate that all of the print pages have been provided
                printDoc.AddPagesComplete();
            }
        
            async void OnGetPreviewPage(object sender, GetPreviewPageEventArgs e)
            {
                Grid x = await CreateDynamicWPFGrid();
                await Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
                  () =>
                  {
                      // NB: assuming it's ok to keep all these pages in  
                      // memory. might not be the right thing to do  
                      // of course.  
                      if (this._pages == null)
                      {
                          this._pages = new Dictionary<int, UIElement>();
                      }
                      if (!this._pages.ContainsKey(e.PageNumber))
                      {
        
                          this._pages[e.PageNumber] = x;
                      }
                      if (this._document == null)
                          this._document = new PrintDocument();
                      this._document.SetPreviewPage(e.PageNumber, this._pages[e.PageNumber]);
                  }
                );
            }
            async void OnPaginate(object sender, PaginateEventArgs e)
            {
                await Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
                  () =>
                  {
                      // I have one page and that's *FINAL* !  
                      this._document.SetPreviewPageCount(e.CurrentPreviewPageNumber, PreviewPageCountType.Final);
                  });
            }
        

0 个答案:

没有答案