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