WPF/C# Обтекание текстом в средстве просмотра прокрутки делает изменение размера окна запаздывающим

Hy.

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

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


person dalind    schedule 29.04.2009    source источник
comment
Опубликуйте свой XAML или упрощенный репродукцию.   -  person Kent Boogaart    schedule 29.04.2009


Ответы (2)


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

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;
}
person CSharper    schedule 29.04.2009
comment
Я не знаю, сработает ли это для меня, потому что мне понадобится эта проверка для каждого действия прокрутки и для каждого отдельного события изменения размера (для каждого события перемещения мыши, и это довольно часто). Я думаю, что это замедлит производительность, по крайней мере, если все элементы останутся видимыми, а не свернутыми. - person dalind; 29.04.2009
comment
Почему вы не фильтруете содержимое своего списка по некоторым критериям? (например, по первой букве каждого элемента) - person CSharper; 29.04.2009
comment
Я его фильтрую, но, на мой взгляд, это не имеет ничего общего с видимостью. Видимость элемента может меняться при каждом движении дорожки прокрутки, поэтому я думаю, что фильтрация не имеет смысла. Или я что-то не понял? - person dalind; 03.05.2009

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

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

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

person dalind    schedule 14.07.2009