WPF / C # Textwrapping в scrollviewer делает изменение размера окна запаздывающим - PullRequest
2 голосов
/ 29 апреля 2009

Hy.

У меня есть ListBox с прокруткой в ​​нем. Каждый элемент (40 ++ элементов) списка содержит текстовый блок и небольшое изображение. Когда я изменяю размер окна, изменение размеров происходит очень медленно. Если я поместил видимость элементов в текстовом блоке в «свернутый», то изменение размера будет в порядке. Мой первый подход состоял в том, чтобы установить видимость каждого элемента, не отображаемого в окне просмотра прокрутки, как «свернутого», но я не смог найти индикатор, когда элемент виден пользователю.

У кого-нибудь есть идея сделать процесс изменения размера менее медленным, может быть, какой-то другой элемент управления вместо текстового блока? Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 14 июля 2009

Лучший способ повысить производительность изменения размера - использовать VirtualizingStackPanel в ScrollContentPresenter. Вы можете переопределить это в шаблоне данных, например, вашего ListBox или, вообще, своей ItemsPanel.

Он НЕ отображает элементы, которые не видны, по сравнению с обычной StackPanel, которая отображает все элементы постоянно, независимо от того, видны они пользователю или нет.

Работает у меня вполне нормально.

0 голосов
/ 29 апреля 2009

Следующее указывает, является ли элемент с заданным смещением видимым или нет:

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;
}
...