Перенос текста WPF / C # в scrollviewer замедляет изменение размера окна

StackOverflow https://stackoverflow.com/questions/802103

Вопрос

Хы.

У меня есть 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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top