【问题标题】:WPF/C# Textwrapping in a scrollviewer makes window resizing laggy滚动查看器中的 WPF/C# Textwrapping 使窗口大小调整滞后
【发布时间】:2009-04-29 12:20:18
【问题描述】:

Hy.

我有一个带有滚动查看器的列表框。列表框的每一项(40++ 项)都包含一个文本块和一个小图像。 当我调整窗口大小时,调整大小非常滞后。如果我将项目的文本块可见性设置为“折叠”,则调整大小是可以的。我的第一种方法是将滚动查看器中未显示的每个项目的可见性设置为“折叠”,但是当用户可见项目时我找不到指示符。

有没有人有想法让调整大小的过程不那么滞后,也许是其他一些控件而不是文本块? 谢谢你的帮助。

【问题讨论】:

  • 请发布您的 XAML 或简化的重现。

标签: c# .net wpf listbox word-wrap


【解决方案1】:

以下指定给定偏移量处的项目是否可见:

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

【讨论】:

  • 我不知道这是否适合我,因为我需要对每个滚动活动和每个大小更改事件(每个鼠标移动事件,这很常见)进行检查。我认为这至少会降低性能,因为所有项目都可见而不是折叠。
  • 为什么不按某些标准过滤列表框的内容? (例如,每个项目的第一个字母)
  • 我会过滤它,但在我看来,这与可见性无关。项目的可见性会随着滚动查看器轨道的每一次移动而改变,所以我认为过滤是没有意义的。还是我误会了什么?
【解决方案2】:

提高调整大小性能的最佳方法是在 ScrollContentPresenter 中使用 VirtualizingStackPanel。您可以在数据模板中覆盖它,例如您的 ListBox,或者通常是您的 ItemsPanel。

与普通的 StackPanel 相比,它不会呈现不可见的项目,后者始终呈现所有项目,无论它们是否对用户可见。

对我来说很好用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-08
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    相关资源
    最近更新 更多