Browse Source

repro performance issue on listbox resizing.

repro/1707-listbox-virtualization-resize-performance
Dan Walmsley 8 years ago
parent
commit
c4543c4a65
  1. 63
      samples/VirtualizationDemo/MainWindow.xaml
  2. 9
      samples/VirtualizationDemo/ViewModels/MainWindowViewModel.cs

63
samples/VirtualizationDemo/MainWindow.xaml

@ -2,43 +2,7 @@
Title="AvaloniaUI Virtualization Test"
Width="800"
Height="600">
<DockPanel LastChildFill="True" Margin="16">
<StackPanel DockPanel.Dock="Right"
Margin="16 0 0 0"
MinWidth="150"
Gap="4">
<DropDown Items="{Binding VirtualizationModes}"
SelectedItem="{Binding VirtualizationMode}"/>
<DropDown Items="{Binding Orientations}"
SelectedItem="{Binding Orientation}"/>
<TextBox Watermark="Item Count"
UseFloatingWatermark="True"
Text="{Binding ItemCount}"/>
<TextBox Watermark="Extent"
UseFloatingWatermark="True"
Text="{Binding #listBox.Scroll.Extent, Mode=OneWay}"/>
<TextBox Watermark="Offset"
UseFloatingWatermark="True"
Text="{Binding #listBox.Scroll.Offset, Mode=OneWay}"/>
<TextBox Watermark="Viewport"
UseFloatingWatermark="True"
Text="{Binding #listBox.Scroll.Viewport, Mode=OneWay}"/>
<TextBlock>Horiz. ScrollBar</TextBlock>
<DropDown Items="{Binding ScrollBarVisibilities}"
SelectedItem="{Binding HorizontalScrollBarVisibility}"/>
<TextBlock>Vert. ScrollBar</TextBlock>
<DropDown Items="{Binding ScrollBarVisibilities}"
SelectedItem="{Binding VerticalScrollBarVisibility}"/>
<TextBox Watermark="Item to Create"
UseFloatingWatermark="True"
Text="{Binding NewItemString}"/>
<Button Command="{Binding AddItemCommand}">Add Item</Button>
<Button Command="{Binding RemoveItemCommand}">Remove Item</Button>
<Button Command="{Binding RecreateCommand}">Recreate</Button>
<Button Command="{Binding SelectFirstCommand}">Select First</Button>
<Button Command="{Binding SelectLastCommand}">Select Last</Button>
</StackPanel>
<Grid RowDefinitions="4*,3*,4*">
<ListBox Name="listBox"
Items="{Binding Items}"
SelectedItems="{Binding SelectedItems}"
@ -59,5 +23,28 @@
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</DockPanel>
<Grid Grid.Row="1" Background="LightBlue" />
<ListBox Name="listBox1" Grid.Row="2"
Items="{Binding Items2}"
ScrollViewer.HorizontalScrollBarVisibility="{Binding HorizontalScrollBarVisibility, Mode=TwoWay}"
ScrollViewer.VerticalScrollBarVisibility="{Binding VerticalScrollBarVisibility, Mode=TwoWay}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Expander ExpandDirection="Down">
<StackPanel Background="#FFFEFEFE">
<Panel Background="Red" Height="200" Width="200" />
</StackPanel>
</Expander>
<Grid ColumnDefinitions="400, *, 100" Margin="30 0 0 0">
<TextBlock Text="{Binding Header}" />
</Grid>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</Window>

9
samples/VirtualizationDemo/ViewModels/MainWindowViewModel.cs

@ -17,6 +17,7 @@ namespace VirtualizationDemo.ViewModels
private string _newItemString = "New Item";
private int _newItemIndex;
private IReactiveList<ItemViewModel> _items;
private IReactiveDerivedList<ItemViewModel> _items2;
private string _prefix = "Item";
private ScrollBarVisibility _horizontalScrollBarVisibility = ScrollBarVisibility.Auto;
private ScrollBarVisibility _verticalScrollBarVisibility = ScrollBarVisibility.Auto;
@ -58,6 +59,12 @@ namespace VirtualizationDemo.ViewModels
private set { this.RaiseAndSetIfChanged(ref _items, value); }
}
public IReactiveDerivedList<ItemViewModel> Items2
{
get { return _items2; }
private set { this.RaiseAndSetIfChanged(ref _items2, value); }
}
public Orientation Orientation
{
get { return _orientation; }
@ -104,6 +111,7 @@ namespace VirtualizationDemo.ViewModels
var items = Enumerable.Range(0, count)
.Select(x => new ItemViewModel(x));
Items = new ReactiveList<ItemViewModel>(items);
Items2 = Items.CreateDerivedCollection(c => c);
}
else if (count > Items.Count)
{
@ -143,6 +151,7 @@ namespace VirtualizationDemo.ViewModels
var items = Enumerable.Range(0, _itemCount)
.Select(x => new ItemViewModel(x, _prefix));
Items = new ReactiveList<ItemViewModel>(items);
Items2 = Items.CreateDerivedCollection(c => c);
}
private void SelectItem(int index)

Loading…
Cancel
Save