当我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”按钮会出现巨大的延迟。