如何在WPF中获取生成的ListView中所有项目的屏幕截图

时间:2019-05-17 11:33:46

标签: c# wpf listview screenshot

我有一个包含150个项目的列表视图。每个项目都有不同的背景颜色。如果我向下滚动列表视图的垂直滚动条,则可以将项目分为三部分:

  1. 隐藏的项目最多,项目隐藏在列表视图的顶部。
  2. 显示的项目。
  3. 底部隐藏的项目,项目隐藏在列表视图的底部。

我想将所有项目保存到图像中。

我尝试根据本指南How to render a WPF UserControl to a bitmap without creating a window实施 MainWindow.xaml:

id(Test.a)

MainWindow.xaml.cs:

<Window x:Class="CaptureListEx.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:CaptureListEx"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="80"/>
        </Grid.RowDefinitions>
        <ListView Grid.Row="0"
                  Name="ListViewCtrl"
                  Margin="10"
                  BorderThickness="1"
                  ItemsSource="{Binding listViewItem}"
                  ScrollViewer.VerticalScrollBarVisibility="Auto"
                  ScrollViewer.HorizontalScrollBarVisibility="Auto">

        </ListView>
        <Button Grid.Row="1"
                Width="60"
                Height="30"
                Content="Capture"
                Name="Capture"
                Click="Capture_Click"
                >

        </Button>
    </Grid>
</Window>

我希望我将获得UI中显示的具有背景色的所有项目的图像,但实际上,我仅会获得显示的项目和底部隐藏项目的图像。

问题:底部隐藏的项目没有背景颜色格式。顶部隐藏的项目不在图像中。 有人可以帮我做出正确的形象。谢谢!

1 个答案:

答案 0 :(得分:0)

  

我只得到显示的项目和底部隐藏项目的图像

之所以会这样,是因为ListView在不受容器尺寸限制的情况下,只会尝试调整自身大小以适合从显示的第一个项目开始的尽可能多的项目。换句话说,它不会尝试以某种方式显示“顶部隐藏的项目”(您如何称呼它们)。

我不确定是否可以更改此行为以使 true 自动调整大小ListView,但是一个简单的解决方法是滚动到第一项,然后截屏并然后恢复位置。

在测量之前添加此内容(您需要FindChild method):

var scroll = ListViewCtrl.FindChild<ScrollViewer>(); 
var offset = scroll.VerticalOffset; // store offset
scroll.ScrollToTop();
Dispatcher.Invoke(() => { }, DispatcherPriority.Background); // do events

然后在渲染还原位置之后:

scroll.ScrollToVerticalOffset(offset);

为什么要“做事件”?您必须等到wpf实际执行滚动才能进行测量。在wpf中,许多事情也会被推迟,即不会立即发生。