2009-04-29 2 views
2

Hy.WPF/C# Textwrapping в scrollviewer делает изменение размера окна laggy

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

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

+0

Опубликуйте свой XAML или упрощенную версию PLS. –

ответ

0

Лучший способ улучшить производительность ИЗМЕНРАЗМ , использовать VirtualizingStackPanel в вашем ScrollContentPresenter. Вы можете переопределить это в шаблоне данных, например, в ListBox или, в общем, ItemsPanel.

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

Работает отлично для меня.

0

Следующие определяет, является ли элемент в данное смещение видимым или нет:

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; 
} 
+0

Я не знаю, работает ли это для меня, потому что мне нужна эта проверка для каждой прокрутки и для каждого события с измененным размером (на событие перемещения мыши, и это довольно часто). Я думаю, что это замедлит производительность, по крайней мере, оставив все элементы видимыми и не рухнувшими. – dalind

+0

Почему вы не фильтруете содержимое своего списка по некоторым критериям? (например, по первой букве каждого элемента) – CSharper

+0

Я фильтрую его, но, на мой взгляд, это не имеет ничего общего с видимостью. Видимость элемента может измениться при каждом перемещении дорожки scrollviewer, поэтому фильтрация не имеет смысла, я думаю. Или я чего-то не понимаю? – dalind

Смежные вопросы