将ListView数据导出到WPF中的图像

时间:2013-11-18 17:42:50

标签: wpf vb.net listview

我正在尝试将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>

1 个答案:

答案 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