C# 如何在UWP应用程序中打印?

C# 如何在UWP应用程序中打印?,c#,printing,uwp,windows-10-universal,C#,Printing,Uwp,Windows 10 Universal,我正试图从我的UWP应用程序打印出一些东西。基本上,我使用WebViewBrush将一些数据绘制到一些框架元素上(Windows.UI.Xaml.Shapes.Rectangle)-我想在每页上打印一个矩形(每页一个矩形) 我真的希望有人能提供一个非常简单的例子,说明UWP中的打印是如何工作的。我自己也尝试过,我很乐意提供我的代码,但实际上有数千行代码——所有这些都是我从Microsoft GitHub示例中提取的,并尝试过调整: 老实说,我认为这些例子太复杂了。我想要的只是一种非常简单的

我正试图从我的UWP应用程序打印出一些东西。基本上,我使用WebViewBrush将一些数据绘制到一些
框架元素上(Windows.UI.Xaml.Shapes.Rectangle)-我想在每页上打印一个矩形(每页一个矩形)

我真的希望有人能提供一个非常简单的例子,说明UWP中的打印是如何工作的。我自己也尝试过,我很乐意提供我的代码,但实际上有数千行代码——所有这些都是我从Microsoft GitHub示例中提取的,并尝试过调整:

老实说,我认为这些例子太复杂了。我想要的只是一种非常简单的打印方式。我也找不到关于这个主题的任何教程,但我想如果有人有一个小代码片段,我可以开始工作,也许我可以在它的基础上构建它,这样它就可以与矩形一起工作(而不是我现在正在做的事——从微软举一个巨大的例子,试图找出我不需要的部分)


多谢各位。我想任何能以简单方式回答这个问题的人都会发现,这将成为未来一个明确的参考点,因为有关这个主题的在线信息非常稀少。

有关如何在UWP应用程序中打印,您可以按照中的步骤进行操作。也可以参考GitHub上的。下面是一个简单的示例,演示如何在页面上打印矩形

在XAML中,添加打印按钮和要打印的矩形

<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>

我也一直在努力解决这个问题。我已经一遍又一遍地介绍了SDK示例。此解决方案可能对您有所帮助。如果有某种方法可以将要打印的内容放入RichTextBox,则可以通过编程方式为其构建段落。并将SDK示例中的RichTextBox替换为一个空白的StackPanel,您已经在其中列出了网格需求,它将解决您的问题。我的不是完全相同的问题,因为我创建了一个甚至两列的杂货清单。在我的例子中,诀窍是使用固定宽度的字体CourierNew

在调用打印库的页面中,需要将其保存在XAML中

在替换PageTopPrint的页面中,您可以在构造函数中构建这些内容。我将一个集合传递到页面的实例化中,然后计算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导入到我的主要项目中,这也是同一位置的开源项目。就在今晚,包括打印购物清单


希望这些能有所帮助,我也一直在努力解决这个问题。

很好的例子!Microsoft示例太复杂了。我非常喜欢您的示例,但是当我单击“打印”按钮时,我总是遇到以下异常:System.AccessViolationException:“试图读取或写入受保护的内存。”。这通常表示其他内存已损坏。此错误发生在printDoc.SetPreviewPage。我似乎找不到解决这个问题的办法,你知道怎么解决吗。@TravisPettry我无法在我身边重现你的问题。您可以尝试使用其他设备进行测试。如果你仍然有这个问题,我建议你问一个新的问题,可以复制你的问题。我刚刚有这么多的麻烦与UWP打印。我已经切换到HTML WebView并从用户浏览器打印。更加高效和灵活。
   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);
        }
    }