仮想化を有効にして作成ListBox
し、すべてのアイテムの外観を更新すると、非常に高速に動作します。しかし、すべてのアイテムをゆっくりと下にスクロールしてListBox
から、すべてのアイテムの外観を更新すると、多くの時間がかかります。VirtualizingStackPanel
ビューポートを使い果たしたときにアイテムを破壊しないためだと思います。この動作を再現する簡単なアプリを作成しました。
コード:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
for(int i = 0; i < 5000; ++i) // creating 5k text boxes
MyList.Items.Add(new TextBox() { Text = CurrText });
}
private void Button_Click(object sender, RoutedEventArgs e)
{
GC.Collect();
n = (n + 1) % 2; // switch 0 to 1 or 1 to 0
foreach (var item in MyList.Items)
((TextBox)item).Text = CurrText; // set new text
}
static int n = 0;
string CurrText { get { return new string(n.ToString()[0], 50); } }
}
XAML:
<Window x:Class="VPanel.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="700" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="5*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<ListBox Name="MyList" VirtualizingStackPanel.IsVirtualizing="True"/>
<Button Grid.Row="1" Content="UpdateText" Click="Button_Click"/>
</Grid>
</Window>
「UpdateText」ボタンをクリックすると、すべてのテキストボックスのテキストが更新されます。スクローラーをドラッグして最後までゆっくりスクロールすると、「UpdateText」ボタンのクリックが非常に遅くなります。