가상화가 활성화 된 ListBox
을 생성하고 모든 항목 모양을 업데이트하면 매우 빠르게 작동합니다. 그러나 내가 천천히 ListBox
의 모든 항목을 스크롤 한 다음 모든 항목 모양을 업데이트하는 데 많은 시간이 걸립니다. VirtualizingStackPanel
은 뷰포트가 떨어질 때 아이템을 파괴하지 않기 때문에 생각합니다. 이 동작을 재현 할 수있는 간단한 응용 프로그램을 작성했습니다.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"버튼이 큰 지연을 가지고 클릭합니다.