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 如何拍摄ScrollViewer内容的屏幕截图_Wpf_Vb.net - Fatal编程技术网

Wpf 如何拍摄ScrollViewer内容的屏幕截图

Wpf 如何拍摄ScrollViewer内容的屏幕截图,wpf,vb.net,Wpf,Vb.net,我想拍摄ScrollViewer中的任何内容的屏幕截图,而不仅仅是视口中的内容。但到目前为止,我所尝试的一切都会产生完全黑色的图像,或者只显示部分内容而其他内容都是黑色的图像。我认为这可能是因为我没有指定任何背景,但是将我的窗口或树视图的背景更改为白色并没有改变任何事情。 你能告诉我哪里出了问题,或者我如何拍摄ScrollViewer的完整内容的屏幕截图吗 下面是我整理的一个小示例(显示主窗口后按“p”) 主窗口(仅是窗口中的树状视图,太小,无法显示全部内容): 以及窗口后面的代码: Cla

我想拍摄
ScrollViewer
中的任何内容的屏幕截图,而不仅仅是
视口
中的内容。但到目前为止,我所尝试的一切都会产生完全黑色的图像,或者只显示部分内容而其他内容都是黑色的图像。我认为这可能是因为我没有指定任何背景,但是将我的
窗口
树视图的背景更改为
白色
并没有改变任何事情。 你能告诉我哪里出了问题,或者我如何拍摄
ScrollViewer
的完整内容的屏幕截图吗

下面是我整理的一个小示例(显示主窗口后按“p”)

主窗口(仅是
窗口中的
树状视图
,太小,无法显示全部内容):


以及窗口后面的代码:

Class MainWindow

Private Sub Window_KeyDown(sender As Object, e As KeyEventArgs)
    If e.Key <> Key.P Then
        Exit Sub
    End If

    Dim sv As ScrollViewer = GetFirstChildOfType(Of ScrollViewer)(Me.Tree)
    Me.CaptureScreen(sv.Content, "C:\Temp\Screenshot.png")
End Sub

Private Shared Function GetFirstChildOfType(Of T As DependencyObject)(obj As DependencyObject) As T
    Dim result As T
    Dim child As DependencyObject

    If (obj Is Nothing) Then
        Return Nothing
    End If

    If (VisualTreeHelper.GetChildrenCount(obj) = 0) Then
        Return Nothing
    End If

    For index As Integer = 0 To VisualTreeHelper.GetChildrenCount(obj)
        child = VisualTreeHelper.GetChild(obj, index)
        result = TryCast(child, T)

        If (result Is Nothing) Then
            result = GetFirstChildOfType(Of T)(child)
        End If

        If (result IsNot Nothing) Then
            Return result
        End If
    Next index

    Return Nothing
End Function

Private Sub CaptureScreen(source As UIElement, filename As String)
    Dim height As Double
    Dim renderHeight As Double
    Dim width As Double
    Dim renderWidth As Double
    Dim renderTarget As RenderTargetBitmap
    Dim vb As VisualBrush
    Dim dv As DrawingVisual
    Dim encoder As PngBitmapEncoder

    Try
        height = source.RenderSize.Height
        renderHeight = height
        width = source.RenderSize.Width
        renderWidth = width

        renderTarget = New RenderTargetBitmap(Convert.ToInt32(renderWidth), Convert.ToInt32(renderHeight), 96, 96, PixelFormats.Pbgra32)
        vb = New VisualBrush(source)

        dv = New DrawingVisual

        Using dc As DrawingContext = dv.RenderOpen
            dc.DrawRectangle(vb, Nothing, New Rect(New Point(0, 0), New Point(width, height)))
        End Using

        renderTarget.Render(dv)

        encoder = New PngBitmapEncoder
        encoder.Frames.Add(BitmapFrame.Create(renderTarget))

        Using fs As IO.FileStream = New IO.FileStream(filename, IO.FileMode.Create, IO.FileAccess.Write)
            encoder.Save(fs)
        End Using
    Catch ex As Exception
        Stop
    End Try
End Sub

End Class
Class主窗口
私有子窗口\u KeyDown(发送方作为对象,e作为KeyEventArgs)
如果e.Key.P那么
出口接头
如果结束
Dim sv As ScrollViewer=GetFirstChildOfType(属于ScrollViewer)(Me.Tree)
Me.CaptureScreen(sv.Content,“C:\Temp\Screenshot.png”)
端接头
私有共享函数GetFirstChildOfType(作为DependencyObject的T的)(作为DependencyObject的obj)作为T
模糊结果为T
将子对象设置为DependencyObject
如果(obj不算什么),那么
一无所获
如果结束
如果(VisualTreeHelper.GetChildrenCount(obj)=0),则
一无所获
如果结束
对于VisualTreeHelper.GetChildrenCount(obj),索引为整数=0
child=VisualTreeHelper.GetChild(对象,索引)
结果=TryCast(子项,T)
如果(结果是零),那么
结果=GetFirstChildOfType(共T个)(子项)
如果结束
如果(结果不是什么)那么
返回结果
如果结束
下一个索引
一无所获
端函数
私有子CaptureScreen(源作为UIElement,文件名作为字符串)
双高
昏暗的渲染灯光为双色
双色调暗宽度
将渲染宽度设置为双精度
将渲染目标变暗为渲染目标位图
将vb设置为VisualBrush
暗dv作为绘图视觉
作为PngBitmapEncoder的Dim编码器
尝试
高度=source.RenderSize.height
renderHeight=高度
宽度=source.renderize.width
渲染宽度=宽度
renderTarget=新的RenderTargetBitmap(Convert.ToInt32(renderWidth)、Convert.ToInt32(RenderRight)、96、96、PixelFormats.Pbgra32)
vb=新的VisualBrush(源代码)
dv=新绘图可视化
使用dc作为DrawingContext=dv.RenderOpen
DrawRectangle(vb,无,新矩形(新点(0,0),新点(宽度,高度)))
终端使用
renderTarget.Render(dv)
编码器=新的PngBitmapEncoder
编码器.Frames.Add(BitmapFrame.Create(renderTarget))
将fs用作IO.FileStream=New IO.FileStream(文件名,IO.FileMode.Create,IO.FileAccess.Write)
编码器保存(fs)
终端使用
特例
停止
结束尝试
端接头
末级

我对C#的答案也很满意。

经过多次尝试和错误后,我发现我错了几件事

首先,我使用了错误的
UIElement
。我不得不使用第一个
StackPanel
,而不是第一个
ScrollViewer

第二,虽然我的
窗口
的背景设置为白色,但是
窗口
中的所有控件都没有背景,这可能就是我生成的图片是黑色的原因

因此,将代码中的一个函数更改为

Private Sub Window_KeyDown(sender As Object, e As KeyEventArgs)
    Dim panel As StackPanel

    If e.Key <> Key.P Then
        Exit Sub
    End If

    panel = GetFirstChildOfType(Of StackPanel)(Me.Tree)
    panel.Background = Brushes.White
    panel.UpdateLayout()

    Me.CaptureScreen(panel, "C:\Temp\Screenshot.png")
End Sub
Private子窗口\u KeyDown(发送方作为对象,e作为KeyEventArgs)
将面板调暗为StackPanel
如果e.Key.P那么
出口接头
如果结束
panel=GetFirstChildOfType(StackPanel的)(Me.Tree)
panel.Background=画笔.White
panel.UpdateLayout()
Me.CaptureScreen(面板,“C:\Temp\Screenshot.png”)
端接头
做了这个把戏,现在我至少得到了一张白色背景的图片和我的
树视图的所有元素,而不仅仅是屏幕上可见的元素

现在我有一些其他问题,但这是另一个问题的问题

Private Sub Window_KeyDown(sender As Object, e As KeyEventArgs)
    Dim panel As StackPanel

    If e.Key <> Key.P Then
        Exit Sub
    End If

    panel = GetFirstChildOfType(Of StackPanel)(Me.Tree)
    panel.Background = Brushes.White
    panel.UpdateLayout()

    Me.CaptureScreen(panel, "C:\Temp\Screenshot.png")
End Sub