0

私はグリッドとして itemspaneltemplate を使用して約 1000 個のユーザー コントロールをバインドしているリストボックスを持っており、正常に動作している行と列を指定して各ユーザー コントロールを配置しています。しかし、問題は、ロードに時間がかかりすぎることです。バックグラウンドワーカープロセスも使用しましたが、役に立ちませんでした。上記の問題の解決策を教えてください。


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

ありがとうございます

4

1 に答える 1

0

ちょっと奇妙に聞こえます。まず、質問に答える必要があります...1000 個の項目を UI に表示する必要があるリストにバインドする必要は本当にありますか? 使い勝手は最高とは言えません。おそらく、遅延ロードを使用したアプローチを選択できます。

次に、 で を無効にVirtualizationしましたListBoxか? 通常、表示される要素のビジュアルのみがレンダリングされます。コントロールはスクロールの場合に再利用されます。

于 2013-01-21T13:11:22.097 に答える