【问题标题】:WPF listview virtualization with columns带有列的 WPF 列表视图虚拟化
【发布时间】:2013-03-04 00:42:35
【问题描述】:

我正在尝试创建一个具有平滑滚动的列表视图(5'000 项以上)。 我在 inet 中找到了一个解决方案,“virtualizationmode=Recycling”可以解决问题。

我完全迷路了,因为我在旧应用程序中使用了 gridview。 现在要虚拟化列表,我不能再使用 gridview,正如我在另一篇文章中所读到的。

我怎样才能让它发挥作用?我想使用 observalcollection 绑定项目,我需要一个 Header。

这是我使用 gridview 的旧列表视图:

<ListView x:Name="ListView_Main" Grid.Column="4" Grid.RowSpan="18" BorderBrush="#FFE87E00" Foreground="#FFE87E00" Background="Transparent" VirtualizingStackPanel.IsVirtualizing="true"  VirtualizingStackPanel.VirtualizationMode="Recycling">
                <ListView.View>
                    <GridView x:Name="GridView_ListHeader" AllowsColumnReorder="False">
                        <!--CheckBox-->
                        <GridViewColumn x:Name="GridViewColumn_Check" Width="25" Header=""><GridViewColumn.CellTemplate><DataTemplate><StackPanel>
                            <!---Tag = Index-->
                            <CheckBox IsChecked="{Binding Checked}" Tag="{Binding Index}"/></StackPanel></DataTemplate></GridViewColumn.CellTemplate>
                        </GridViewColumn>

                        <!--CheckImage-->
                        <GridViewColumn x:Name="GridViewColumn_CheckFake" Width="25" Header=""><GridViewColumn.CellTemplate><DataTemplate><StackPanel>
                                        <Grid Height="17" Width="17" VerticalAlignment="Center" HorizontalAlignment="center">
                                            <Canvas Background="{Binding Color}" Margin="3" Cursor="Hand" Tag="{Binding Index}" MouseLeftButtonDown="Canvas_ListIcon_MouseLeftButtonDown" MouseEnter="Canvas_ListIcon_MouseEnter" MouseLeave="Canvas_ListIcon_MouseLeave"><Canvas.OpacityMask>
                                                    <ImageBrush Stretch="UniformToFill" ImageSource="{Binding ImageCheckbox}" RenderOptions.BitmapScalingMode="NearestNeighbor" RenderOptions.EdgeMode="Aliased"/></Canvas.OpacityMask></Canvas></Grid></StackPanel></DataTemplate></GridViewColumn.CellTemplate>
                        </GridViewColumn>

                        <!--Source-->
                        <GridViewColumn x:Name="GridViewColumn_Icon"  Header="" Width="25"><GridViewColumn.CellTemplate><DataTemplate><StackPanel>
                                        <Grid Height="17" Width="17" VerticalAlignment="Center" HorizontalAlignment="center">
                                            <Canvas Background="{Binding Color}" Tag="{Binding Index}" Margin="3" MouseEnter="Canvas_SourceIcon_MouseEnter" MouseLeave="Canvas_SourceIcon_MouseLeave"><Canvas.OpacityMask>
                                                    <ImageBrush ImageSource="{Binding ImageSource}" Stretch="UniformToFill" RenderOptions.BitmapScalingMode="NearestNeighbor" RenderOptions.EdgeMode="Aliased"/></Canvas.OpacityMask></Canvas></Grid></StackPanel></DataTemplate> </GridViewColumn.CellTemplate>
                        </GridViewColumn>

                        <!--Pos-->
                        <GridViewColumn DisplayMemberBinding="{Binding Position}" x:Name="GridViewColumn_Pos" Width="50" Header="Pos"/>
                            <!--Entry-->
                        <GridViewColumn DisplayMemberBinding="{Binding Id}" x:Name="GridViewColumn_Entry" Width="200" Header="Eingabe"/>
                        <!--Sap-->
                        <GridViewColumn DisplayMemberBinding="{Binding SaperionNr}" x:Name="GridViewColumn_Sap" Width="100" Header="Saperion"/>
                        <!--Sup-->
                        <GridViewColumn DisplayMemberBinding="{Binding SupisNr}" x:Name="GridViewColumn_Sup" Width="100" Header="Navision"/>
                        <!--Path-->
                        <GridViewColumn DisplayMemberBinding="{Binding Path}" x:Name="GridViewColumn_Path" Width="150" Header="Pfad"/>
                        <!--Format-->
                        <GridViewColumn DisplayMemberBinding="{Binding Format}"  x:Name="GridViewColumn_Format" Width="50" Header="Format"/>
                        <!--Page-->
                        <GridViewColumn DisplayMemberBinding="{Binding Page}" x:Name="GridViewColumn_Page" Width="40" Header="Blatt"/>
                        <!--Stat-->
                        <GridViewColumn DisplayMemberBinding="{Binding Status}" x:Name="GridViewColumn_Stat" Width="175" Header="Status"/>
                    </GridView>
                </ListView.View>
            </ListView>

提前谢谢你!!!

【问题讨论】:

    标签: wpf listview gridview virtualization recycle


    【解决方案1】:

    默认情况下,列表视图应该启用虚拟化。 然而,有些情况会使它们的效果无效。 我会设置一个 maxheight 并确保设置了 ScrollViewer.VerticalScrollBarVisibility="Visible"。

    【讨论】:

    • hmm,我不认为这是问题所在,我的列表视图的高度和宽度是由它的父级定义的,所以我有一个固定的大小。当我打开“ScrollViewer.VerticalScrollBarVisibility”时 - >没有任何变化。我激活了“ScrollViewer.IsDeferredScrollingEnabled”以使其至少有点可用。关闭它时,从元素 1 滚动到 1000 大约需要 5 秒。
    • 根据我对虚拟化的了解,父级设置的高度和宽度很重要。笑话我,将高度甚至最大高度设置为你可以看到的有形的东西,然后再试一次。
    • 谢谢...我实际上有一个固定的高度从父母那里得到!但你是对的!虚拟化默认是开启的,事实上我刚刚意识到我可以流畅地滚动,但我不知道为什么。我还删除了“ScrollViewer.IsDeferredScrollingEnabled”,但它可以正常工作。我的电脑一定是内存不足之类的...谢谢
    • 让虚拟化发挥作用的魔法触发器是删除或更改 ScrollViewer.CanContentScroll="False" 为 True(来自
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    相关资源
    最近更新 更多