Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 打印DockPanel并将其安装到页面_Wpf_Vb.net - Fatal编程技术网

Wpf 打印DockPanel并将其安装到页面

Wpf 打印DockPanel并将其安装到页面,wpf,vb.net,Wpf,Vb.net,我目前正在浪费大量的纸张试图弄明白这一点。我有一个名为Dock的Dockpanel,它带有堆叠面板、边框和文本框,我希望整个Dock打印到一页 Private Sub Button_Click_1(sender As Object, e As RoutedEventArgs) 'Define Printer Dialog Dim dialog As New PrintDialog 'Define Printer Capabilities Dim capab

我目前正在浪费大量的纸张试图弄明白这一点。我有一个名为Dock的Dockpanel,它带有堆叠面板、边框和文本框,我希望整个Dock打印到一页

    Private Sub Button_Click_1(sender As Object, e As RoutedEventArgs)
    'Define Printer Dialog
    Dim dialog As New PrintDialog
    'Define Printer Capabilities
    Dim capabil As PrintCapabilities = dialog.PrintQueue.GetPrintCapabilities(dialog.PrintTicket)
    'Scale content to capabilities of printer
    Dim scale As Double = Math.Min(capabil.PageImageableArea.ExtentWidth / Dock.ActualWidth, capabil.PageImageableArea.ExtentHeight /
                Dock.ActualHeight)
    Dock.LayoutTransform = New ScaleTransform(scale, scale)
    'Create a margin
    Dim pagemargin As Integer = 20
    'Define the size of the page
    Dim pagesize As New Size(capabil.PageImageableArea.ExtentWidth - pagemargin, capabil.PageImageableArea.ExtentHeight - pagemargin)
    Dock.Measure(pagesize)
    'Resize dock to optimal page size
    Dock.Arrange(New Rect(New Point(capabil.PageImageableArea.OriginWidth, capabil.PageImageableArea.OriginHeight), pagesize))
    'Prompt and Print
    If dialog.ShowDialog = True Then
        dialog.PrintVisual(Dock, "Printed Page.")
    End If
End Sub
我不明白这背后的道理吗?我还有别的办法吗


编辑:我面临的问题是,即使dock看起来大小正确,但打印时仍有巨大的左下边距。我试过调整利润率,但似乎起点还是错了。页面的顶部和右侧也被剪掉

这就是我从中得到的一些线索。这可能是你想要的,也可能不是,但在任何情况下都可以给你一些想法:

Private Sub Button_Click_1(sender As Object, e As RoutedEventArgs)
  Dim dialog As New PrintDialog
  If dialog.ShowDialog = True Then
    Dim dockParent As StackPanel = Dock.Parent
    dockParent.Children.Remove(Dock)

    Dim vis = PerformTransform(Dock, dialog.PrintQueue)
    dialog.PrintVisual(vis, "Printed Page.")

    vis.Children.Remove(Dock)
    dockParent.Children.Add(Dock)
  End If
End Sub

Private Function PerformTransform(v As Visual, pq As PrintQueue) As ContainerVisual
  Dim root As ContainerVisual = New ContainerVisual()
  Const inch As Double = 96 'DPI

  'Set the margins
  Dim xMargin = 1.25 * inch
  Dim yMargin = 1 * inch

  'Get the user print ticket and media dimensions
  Dim pt = pq.UserPrintTicket()
  Dim printableWidth = pt.PageMediaSize.Width.Value
  Dim printableHeight = pt.PageMediaSize.Height.Value

  Dim xScale = (printableWidth - xMargin * 2) / printableWidth
  Dim yScale = (printableHeight - yMargin * 2) / printableHeight

  root.Children.Add(v)
  root.Transform = New MatrixTransform(xScale, 0, 0, yScale, xMargin, yMargin)

  Return root
End Function

你认为你能详细说明你目前所得到的东西有什么问题吗?@Doc抱歉,很快就会更新。不太清楚,但这肯定是朝着正确方向迈出的一步。我会继续使用页边距,直到我把它弄对为止。我仍然遇到的一个大问题是页面左侧和底部的巨大页边距。我该如何定义页面上开始打印的位置?@GamerJ5这对你来说很奇怪,因为我一点页边空白都没有。今晚我无法运行一些测试,但可能是基于您的用户设置。我将在调试器中检查
pt
变量,并查看它实际包含的内容。这似乎是基于您的机器的打印设置。@GamerJ5好吧,使用上面的代码,在打印之前,码头将从其容器中拉出。。。也许你需要在
性能转换
函数中使用
测量
重新排列
。我想出来了,可能很愚蠢。出于某种原因,它考虑了码头的对齐方式,我将其保留为默认状态,但当我将其切换为左对齐时,我的问题就消失了。谢谢你的帮助!