我正在尝试将listview数据导出到图像。 我不能使用 PrintVisual 方法,因为listview是可滚动的,listview可以是rtl或ltr, PrintVisual 不支持我测试过的rtl listview。
这是我的ListView
<ListView Name="TimeListView" Height="359" Width="470">
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="Margin" Value="0,0,0,0"/>
<Setter Property="Padding" Value="0,2"/>
<Setter Property="BorderBrush" Value="LightGray"/>
<Setter Property="BorderThickness" Value="0,0,0,1"/>
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
<Setter Property="VerticalContentAlignment" Value="Stretch"></Setter>
</Style>
</ListView.ItemContainerStyle>
<ListView.View>
<GridView>
<GridViewColumn x:Name="DayCol" Header="{Binding ElementName=TimeListView, Path=DataContext.DayHeader}" Width="40">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Border BorderBrush="LightGray" BorderThickness="0,0,1,0" Margin="-6,-2,-6,-2">
<StackPanel Margin="6,2,6,2">
<TextBlock Text="{Binding Path=Days}"></TextBlock>
</StackPanel>
</Border>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn x:Name="FCol" Header="{Binding ElementName=TimeListView, Path=DataContext.FajirHeader}" Width="68">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Border BorderBrush="LightGray" BorderThickness="0,0,1,0" Margin="-6,-2,-6,-2">
<StackPanel Margin="6,2,6,2">
<TextBlock Text="{Binding Path=FT}"></TextBlock>
</StackPanel>
</Border>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn x:Name="SCol" Header="{Binding ElementName=TimeListView, Path=DataContext.SunriseHeader}" Width="68">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Border BorderBrush="LightGray" BorderThickness="0,0,1,0" Margin="-6,-2,-6,-2">
<StackPanel Margin="6,2,6,2">
<TextBlock Text="{Binding Path=ST}"></TextBlock>
</StackPanel>
</Border>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn x:Name="DCol" Header="{Binding ElementName=TimeListView, Path=DataContext.DhuhrHeader}" Width="68">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Border BorderBrush="LightGray" BorderThickness="0,0,1,0" Margin="-6,-2,-6,-2">
<StackPanel Margin="6,2,6,2">
<TextBlock Text="{Binding Path=DT}"></TextBlock>
</StackPanel>
</Border>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn x:Name="ACol" Header="{Binding ElementName=TimeListView, Path=DataContext.AsrHeader}" Width="68">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Border BorderBrush="LightGray" BorderThickness="0,0,1,0" Margin="-6,-2,-6,-2">
<StackPanel Margin="6,2,6,2">
<TextBlock Text="{Binding Path=AT}"></TextBlock>
</StackPanel>
</Border>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn x:Name="MCol" Header="{Binding ElementName=TimeListView, Path=DataContext.MaghribHeader}" Width="68">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Border BorderBrush="LightGray" BorderThickness="0,0,1,0" Margin="-6,-2,-6,-2">
<StackPanel Margin="6,2,6,2">
<TextBlock Text="{Binding Path=MT}"></TextBlock>
</StackPanel>
</Border>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn x:Name="ICol" Header="{Binding ElementName=TimeListView, Path=DataContext.IshaHeader}" Width="68">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Border BorderBrush="LightGray" BorderThickness="0,0,1,0" Margin="-6,-2,-6,-2">
<StackPanel Margin="6,2,6,2">
<TextBlock Text="{Binding Path=IsT}"></TextBlock>
</StackPanel>
</Border>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
答案 0 :(得分:0)
好的,我是这样做的:
Private Sub ExportToImage()
Dim flowDoc As New FlowDocument
flowDoc.FontFamily = New FontFamily("Arial")
flowDoc.PageWidth = 826
flowDoc.PageHeight = 1152
flowDoc.ColumnWidth = "999999" 'To fill the whole page
flowDoc.PagePadding = New Thickness(48) '
Dim myTable As New Table
myTable.FontSize = 12
myTable.Padding = New Thickness(0)
myTable.CellSpacing = 0
myTable.TextAlignment = TextAlignment.Center
myTable.BorderThickness = New Thickness(1)
myTable.BorderBrush = CType(New BrushConverter().ConvertFrom("#ccc"), SolidColorBrush)
myTable.Background = CType(New BrushConverter().ConvertFrom("#eaebec"), SolidColorBrush)
For x As Integer = 0 To 6
myTable.Columns.Add(New TableColumn())
Next
' Create and add an empty TableRowGroup to hold the table's Rows.
myTable.RowGroups.Add(New TableRowGroup())
' Add the first (title) row.
myTable.RowGroups(0).Rows.Add(New TableRow())
Dim currentRow As New TableRow()
currentRow = myTable.RowGroups(0).Rows(0)
Dim view As GridView = MyListView.View
Dim nColCount As Integer = view.Columns.Count
currentRow.Background = CType(New BrushConverter().ConvertFrom("#ededed"), SolidColorBrush)
currentRow.FontWeight = FontWeights.Bold
For i As Integer = 0 To nColCount - 1
' Add the header row with content
Dim cellH As New TableCell
cellH.Padding = New Thickness(6)
cellH.Blocks.Add(New Paragraph(New Run(GetHeader(view, i))))
currentRow.Cells.Add(cellH)
Next
Dim nItemsCount As Integer = GetItemsCount()
For i As Integer = 0 To nItemsCount - 1
myTable.RowGroups(0).Rows.Add(New TableRow())
currentRow = myTable.RowGroups(0).Rows(i + 1)
currentRow.Cells.Add(New Paragraph(New Run(new Class Instance))
Next
flowDoc.Blocks.Add(myTable)
Dim fdSize As Size = New Size(flowDoc.PageWidth, flowDoc.PageHeight)
Dim paginator = (CType(flowDoc, IDocumentPaginatorSource)).DocumentPaginator
paginator.PageSize = fdSize
Dim visual = New DrawingVisual
Using drawingtext As DrawingContext = visual.RenderOpen
drawingtext.DrawRectangle(Brushes.White, Nothing, New Rect(fdSize))
End Using
visual.Children.Add(paginator.GetPage(0).Visual)
vis = visual
rtb = New RenderTargetBitmap(fdSize.Width, fdSize.Height, 96, 96, PixelFormats.Pbgra32)
rtb.Render(visual)
Dim bmpEncoder As BmpBitmapEncoder = New BmpBitmapEncoder
bmpEncoder.Frames.Add(BitmapFrame.Create(rtb))
Using stream As FileStream = New FileStream("Image.bmp", FileMode.Create)
bmpEncoder.Save(stream)
End Using
End Sub