【问题标题】:Binding 1000usercontrols to listbox is slow wpf将 1000 个用户控件绑定到列表框很慢 wpf
【发布时间】:2013-01-21 22:34:26
【问题描述】:

我有一个列表框,我将大约 1000 个用户控件与 itempaneltemplate 作为网格绑定到该列表框,并且我通过指定行和列来放置每个用户控件,这工作正常。 但问题是加载需要太多时间,我什至使用了后台工作进程,但也没有用。 请帮我解决上述问题的方法。


<ListBox VerticalAlignment="Top" ItemsSource="{Binding Session.LstPlannedLightChkEntity,ElementName=uc, IsAsync=True}"  Grid.Row="0" 
                               VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling"
                              local:DragDropHelper.IsDragSource="true" local:DragDropHelper.IsDropTarget="true" 
                              local:DragDropHelper.DragDropTemplate="{StaticResource planetTemplateDrag}"  
                              ScrollViewer.VerticalScrollBarVisibility="Hidden" ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
                              ScrollViewer.CanContentScroll="True"  
                            >
  <ListBox.ItemContainerStyle>
    <Style TargetType="ListBoxItem">
      <Setter Property="Grid.Row" Value="{Binding Row}"/>
      <Setter Property="Grid.Column" Value="{Binding Column}"/>
      <Setter Property="Grid.ColumnSpan" Value="{Binding ColumnSpan}" />
    <Style.Resources>
    <!-- Background of selected item when focussed -->
    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent"/>
    <!-- Background of selected item when not focussed -->
    <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent" />
      </Style.Resources>
    </Style>
  </ListBox.ItemContainerStyle>
  <ListBox.ItemsPanel>
    <ItemsPanelTemplate>
      <local:GridControl x:Name="gcMenuPlanned" VerticalAlignment="Stretch"  Margin="-1,-1,0,0"
         ShowCustomGridLines="True" GridLineBrush="#FFE4E7EB" GridLineThickness="0.5" SnapsToDevicePixels="True">
        <local:GridControl.ContextMenu>
        <ContextMenu >
          <MenuItem Foreground="Black"  Header="Add Task" Click="AddTask_Click" Tag="{Binding CheckType}"  />
          <MenuItem Foreground="Black"  Header="Goto..."  Click="miGoto_Click" Tag="{Binding CheckType}"  />
        </ContextMenu>
      </local:GridControl.ContextMenu>
    </local:GridControl>
  </ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
  <DataTemplate>
    <local:LightFCCheckBlockControl  CheckColor="#FFA2CAEB" MouseLeftButtonDown="LightFCCheckBlockControl_MouseLeftButtonDown">
      <local:LightFCCheckBlockControl.ContextMenu>
        <ContextMenu >
          <MenuItem Foreground="Black"  Header="Edit" Click="miEdit_Click" Tag="{Binding CheckType}" Visibility="{Binding Path=OpacityForCCheck,Converter={StaticResource opacityToVisibility}}"/>
          <MenuItem Foreground="Black" Style="{StaticResource MenuItemBindingStyle }"  Click="miFreeze_Click" Tag="{Binding CheckType}" Visibility="{Binding Path=OpacityForCCheck,Converter={StaticResource opacityToVisibility}}">
          </MenuItem>
          <MenuItem Foreground="Black" Click="RemoveChecks_Click"  Header="Remove Checks" Tag="{Binding CheckType}"/>
          <MenuItem Foreground="Black" Click="DeleteChecks_Click"  Header="Delete Checks" Tag="{Binding CheckType}" Visibility="{Binding Path=OpacityForCCheck,Converter={StaticResource opacityToVisibility}}"/>
          <MenuItem Foreground="Black"  Header="Goto..."  Click="miGoto_Click" Tag="{Binding CheckType}" Visibility="{Binding Path=OpacityForCCheck,Converter={StaticResource opacityToVisibility}}"/>
        </ContextMenu>
      </local:LightFCCheckBlockControl.ContextMenu>
    </local:LightFCCheckBlockControl>
  </DataTemplate>
</ListBox.ItemTemplate>
</ListBox>

谢谢 尤加拉吉一世

【问题讨论】:

标签: wpf


【解决方案1】:

这听起来有点奇怪。首先,你应该回答这个问题......真的有必要将1000个项目绑定到一个列表中,它应该在UI中显示吗?可用性不会是最好的。也许您可以选择延迟加载的方法。

其次,您是否禁用了ListBox 中的Virtualization?通常,只渲染元素的视觉效果,这些视觉效果是可见的。滚动时控件将被重用。

【讨论】:

  • 是的,我禁用了 VirtualizingStackPanel,因为我希望列表框背景为网格,以便我可以相应地放置我的项目。它就像一个甘特图。
  • @Yogaraj 我不明白,抱歉。你能说明一下你的意图吗?
  • 我已经禁用了 VirtualizingStackPanel 并代替它添加了 Grid,它可以帮助我将列表框中的用户控件添加到网格的指定行和列。所以现在我将 observablecollection 绑定到列表框项目源。
  • @Yogaraj 好的,您同时渲染了数千个元素,因为它们都是可见的?底层视图模型是什么样的?
  • 如果我绑定 1000 个用户控件,只有几个属性,假设每个用户控件大约 5 个属性,然后列表框在 5 秒内加载,有时甚至更短,但是大约 50 个属性和大约 10 个属性的转换器大约需要 55 秒。那么问题在于加载了太多的控件,或者是绑定了太多的属性到用户控件。
猜你喜欢
  • 1970-01-01
  • 2011-02-22
  • 2011-10-16
  • 1970-01-01
  • 2011-08-28
  • 2014-11-28
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多