Перенос текста WPF / C # в scrollviewer замедляет изменение размера окна
Вопрос
Хы.
У меня есть ListBox с scrollviewer в нем.Каждый элемент (40++ элементов) списка содержит текстовый блок и небольшое изображение.Когда я изменяю размер окна, изменение размера происходит очень медленно.Если я установлю видимость текстового блока элементов в "свернутом виде", изменение размера будет в порядке.Мой первый подход состоял в том, чтобы установить видимость каждого элемента, не отображаемого в scrollviewer, на "свернутый", но я не смог найти индикатор, когда элемент виден пользователю.
У кого-нибудь есть идея сделать процесс изменения размера менее медленным, может быть, какой-нибудь другой элемент управления вместо текстового блока?Спасибо вам за вашу помощь.
Решение 2
Лучший способ повысить производительность изменения размера - это использовать Панель виртуализации StackPanel в вашем ScrollContentPresenter.Вы можете переопределить это в шаблоне данных, например, вашего ListBox или, вообще, вашей ItemsPanel.
Он НЕ отображает элементы, которые не видны, по сравнению с обычной StackPanel, которая отображает все элементы постоянно, независимо от того, видны они пользователю или нет.
У меня это работает вполне нормально.
Другие советы
Следующее указывает, виден ли элемент с заданным смещением или нет:
public bool IsItemVisible(ListBox listBox, int index)
{
if (listBox.Items.Count != 0)
{
VirtualizingStackPanel vsp = (VirtualizingStackPanel)VisualTreeHelper.GetParent(listBox.ItemContainerGenerator.ContainerFromIndex(0));
int FirstVisibleItem = (int)vsp.VerticalOffset, VisibleItemCount = (int)vsp.ViewportHeight;
return index >= FirstVisibleItem && index <= FirstVisibleItem + VisibleItemCount;
}
return false;
}
Вы можете использовать его следующим образом:
private void Button_Click(object sender, RoutedEventArgs e)
{
for (int i = listbox1.Items.Count - 1; i >= 0; i--)
if (!IsItemVisible(listbox1, i))
((ListBoxItem)listbox1.Items[i]).Visibility = Visibility.Collapsed;
}