2014-08-27 9 views
5

StackPanel을 사용하여 여러 컨트롤 (예 : 제목, 하위 제목, 목록 상자, 구분 기호, 목록 상자 등)을 세로로 배치합니다.StackPanel의 거대한 ListBox의 성능을 향상시킬 수 있습니까?

StackPanel은 내용을 항상 스크롤 할 수 있도록 ScrollViewer의 하위 항목입니다.

StackPanel의 컨트롤 중 하나는 ListBox입니다.

ItemsSource는 거대한 컬렉션에 바인딩 된 데이터이고 복잡한 DataTemplate은 각 항목을 실현하는 데 사용됩니다.

불행히도, 나는 성능이 열악 해지고 있습니다 (높은 CPU/메모리).

은 내가 VirtualizingStackPanel에 목록 상자의 ItemsPanel을 설정

  • 시도하고,
  • 는 (리스트 박스의에서 ScrollViewer를 제거) 만 ItemsPresenter 그것의 ControlTemplate을 무시.

그러나 성능에는 차이가 없었습니다. StackPanel은 내부 자식을 측정하는 동안 무한한 높이를 제공합니다.

ScrollViewer 및 StackPanel을 다른 패널/레이아웃 (예 : Grid, DockPanel)으로 대체하고 성능이 크게 향상되면 솔루션뿐만 아니라 병목 현상도 가상화에 있다고 생각하게됩니다.

이보기의 CPU/메모리 성능을 향상시킬 수있는 방법이 있습니까?

enter image description here

은 [업데이트 1]

원래 샘플 프로젝트 : http://s000.tinyupload.com/index.php?file_id=29810707815310047536

내가 재 스타일/템플릿 트 리뷰/TreeViewItems을 시도

[2 업데이트]을 마련하기 다음 예제. 그것은 시작/동일, 높은 메모리 사용에 여전히 오랜 시간이 걸립니다. 그러나 일단로드되면 스크롤링은 원본 샘플보다 훨씬 반응이 좋습니다.

시작 시간/메모리 사용을 더 향상시킬 수있는 다른 방법이 있다면 궁금하십니까?

재 스타일 트 리뷰의 프로젝트 : http://s000.tinyupload.com/index.php?file_id=00117351345725628185

[업데이트 2]

pushpraj의 솔루션은

  • 원래 매력처럼 작동합니다
    • 시작 : 35S,
    • 메모리 : 393MB
    • 스크롤 : 느린
  • 트 리뷰 :
    • 시작 : 18 세,
    • 메모리 377메가바이트,
    • 스크롤 : 빠른
  • pushpraj의 솔루션 :
    • 시작 : < 1 초,
    • 메모리 : 20메가바이트,
    • 스크롤 : 빠른

답변

9

당신은 아마도 거대한 목록 상자의 최대 크기를 제한하고 가능하게 할 수있다 Virtualization

예를 들어

<ListBox MaxHeight="500" 
     VirtualizingPanel.IsVirtualizing="true" 
     VirtualizingPanel.VirtualizationMode="Recycling" /> 

이렇게하면 ListBox에서 몇 가지 항목 만로드 할 수있게되어 scro를 사용할 수있게됩니다 목록 상자의 llbar를 사용하여 필요한 경우 나머지 항목으로 스크롤합니다.

동시에 설정하면 VirtualizationMode에서 Recycling까지이므로 복잡한 데이터 템플릿을 다시 사용하면 모든 항목에 대해 다시 만들어야 할 필요가 없습니다.


EDIT 여기

가 샘플 기반으로하는 솔루션, 내가 원하는 달성하기 위해 VirtualizationCompositeCollection을 사용했다.

XAML 우리는 문자열에 대한 데이터 템플릿을 만들 수 없기 때문에

<Grid xmlns:sys="clr-namespace:System;assembly=mscorlib" 
     xmlns:l="clr-namespace:PerfTest"> 
    <Grid.Resources> 
     <DataTemplate DataType="{x:Type l:Permission}"> 
      <StackPanel Orientation="Horizontal"> 
       <CheckBox /> 
       <TextBlock Text="{Binding Name}" /> 
       <Button Content="+" /> 
       <Button Content="-" /> 
       <Button Content="..." /> 
      </StackPanel> 
     </DataTemplate> 
     <CompositeCollection x:Key="data"> 
      <!-- Content 1 --> 
      <TextBlock Text="Title" 
         FontSize="24" 
         FontWeight="Thin" /> 
      <!-- Content 2 --> 
      <TextBlock Text="Subtitle" 
         FontSize="16" 
         FontWeight="Thin" /> 
      <!-- Content 3 --> 
      <CollectionContainer Collection="{Binding DataContext, Source={x:Reference listbox}}" /> 
      <!-- Content 4 --> 
      <TextBlock Text="User must scroll past the entire list box before seeing this" 
         FontSize="16" 
         FontWeight="Thin" 
         Padding="5" 
         TextWrapping="Wrap" 
         Background="#99000000" 
         Foreground="White" /> 
     </CompositeCollection> 
    </Grid.Resources> 
    <ListBox x:Name="listbox" 
      VirtualizingPanel.IsVirtualizing="True" 
      VirtualizingPanel.VirtualizationMode="Recycling" 
      ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
      ItemsSource="{StaticResource data}" /> 
</Grid> 

코드

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     var items = new ObservableCollection<Permission>(); 
     foreach (var i in Enumerable.Range(0, 10000).Select(i => new Permission() { Name = "Permission " + i })) 
     { items.Add(i); } 
     DataContext = items; 
    } 
} 

public class Permission 
{ 
    public string Name { get; set; } 
} 

은 그래서 Permission 컬렉션에 문자열 수집을 변경했습니다. 나는 당신의 실제 프로젝트에서 그것이 비슷한 것이되기를 바랍니다.

시도해보고 이것이 필요한 것에 가까운 지보십시오.

참고 : (http://i.imgur.com/s1MJ6BO.png?1 참조) 표시 2 스크롤바를 야기 목록 상자의 최대 높이를 고정 Collection="{Binding DataContext, Source={x:Reference listbox}}"

+0

에 어떤 디자이너 경고가있는 경우 안전하게 무시할 수 – jayars

+1

이 사실이지만 가상화는 높이가 고정되거나 최대 높이가 정의 된 경우에만 작동 할 수 있지만 무제한 높이에서는 작동하지 않습니다. 아마도 복합 컬렉션을 사용하여 스택 패널에있는 모든 항목을 결합하고 가상화가 활성화 된 목록 상자에 모든 항목을 표시 할 수 있습니다. 코드를 공유해 주시겠습니까? 그 일을 도와 드리겠습니다. – pushpraj

+0

샘플 프로젝트 – jayars