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