2013-03-15 62 views
0

我想创建一个有顺利滚动的列表视图(5'000项+)。 我在inet中发现了一个解决方案,即“virtualizationmode = Recycling”可以做到这一点。WPF列列表虚拟化与列

嗯,我完全迷路了,因为我在我的旧应用中使用了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> 

预先感谢您!

回答

1

Listviews默认应该虚拟化。 然而,有一些情况使其效果无效。 我会设置一个maxheight并确保设置了ScrollViewer.VerticalScrollBarVisibility =“Visible”。

+0

嗯,我不认为这是问题,我的listviews高度和宽度是由它的父母定义的,所以我有一个固定的大小。当我打开“ScrollViewer.VerticalScrollBarVisibility”时 - >没有任何变化。我激活了“ScrollViewer.IsDeferredScrollingEnabled”,使其至少有一点可用。关闭它时,大约需要5秒从元素1滚动到1000. – 2013-03-15 11:34:02

+0

从我对虚拟化的了解来看,父级设置的高度和宽度很重要。幽默我,并设置高度,甚至最大高度的东西,你可以看到并再试一次。 – TYY 2013-03-15 12:47:28

+0

谢谢......我实际上有一个从父母给定的固定高度!但你是对的!虚拟化在默认情况下处于开启状态,实际上我只是意识到我可以顺利滚动,但我不知道为什么。我也删除了“ScrollViewer.IsDeferredScrollingEnabled”,但它正常。我的电脑一定没有足够的内存或其他东西...谢谢 – 2013-03-15 13:17:31