如何检测WPF中的ListView是否需要滚动?

时间:2018-11-15 22:36:55

标签: c# wpf listview wpf-listview

我在WPF的列表视图中有几个项目。当它们超出查看区域时,我想将一些项目添加到下一个“页面”中。但是,我不想滚动。我禁用了滚动。

<ListView ScrollViewer.HorizontalScrollBarVisibility="Disabled">

我根本不想滚动,我只想知道滚动之外是否还有其他项目。目前,我通过页面上的项目数来限制列表,但是我的项目大小不一样,我也不知道屏幕的大小,因此需要进行调整。

1 个答案:

答案 0 :(得分:0)

尽管这是一个解决方案,并且可行,但在性能上似乎并不好。需要另一个答案

为了提高性能,我现在 tempNumItemsPerPage = tempNumItemsPerPage -2;

1)在构造函数中为scrollchange添加了一个事件处理程序

public ViewName()
{
    InitializeComponent();

    // Handler to add scroll change event
    Items.AddHandler(ScrollViewer.ScrollChangedEvent, new ScrollChangedEventHandler(Items_ScrollChanged));

    Init();            
}

2)将活动添加到我的列表视图中

<ListView ScrollViewer.ScrollChanged="OrderItems_ScrollChanged">

3)添加滚动更改的代码

private void OrderItems_ScrollChanged(object sender, ScrollChangedEventArgs scrollChangedEventArgs)
{
    ScrollViewer scrollViewer = Extensions.WPFExtensions.GetChildOfType<ScrollViewer>(Items);

    if (scrollViewer.ComputedHorizontalScrollBarVisibility == Visibility.Visible)
    {
        GetItemsOnPage();

        tempNumItemsPerPage--;               
    }
}

我唯一的问题是,每次查看滚动条是否关闭时,它都会重置页面[肉眼看不见]。

public static class WPFExtensions
{
    public static T GetChildOfType<T>(this DependencyObject depObj)
        where T : DependencyObject
    {
        if (depObj == null) return null;

        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
        {
            var child = VisualTreeHelper.GetChild(depObj, i);

            var result = (child as T) ?? GetChildOfType<T>(child);
            if (result != null) return result;
        }

        return null;

    }
}