首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >一个ListView,它显示元素的确切数量,逐元素滚动元素。

一个ListView,它显示元素的确切数量,逐元素滚动元素。
EN

Stack Overflow用户
提问于 2013-12-05 07:49:33
回答 2查看 888关注 0票数 0

我会尽量简短的。

我需要的是一个ListView

  • 我将提供的元素的确切数量。
  • 可滚动
  • 禁用了ScrollBar
  • 当在ListView上使用Scroll Wheel时,Children Elements会滚动
  • 逐元素滚动列表元素,但我不认为这是一个问题,因为ListView有一个属性,它告诉它只显示完整的元素,而不是部分元素。

我尝试了什么:

  • ListViewUniformGrid作为其ItemsTemplate,但UniformGrid允许您定义实际Grid有多少rows,而不是List显示了多少元素。另外,我在滚动方面有问题,但也许我做错了什么。

有什么想法吗?谢谢!

编辑:

我想我找到了一种让Children Elements鼓起Scroll Event的方法。

Child elements of scrollviewer preventing scrolling with mouse wheel?

但这会迫使我在名单上的每一个小控制上使用这种行为。还有别的办法吗?

Edit2:

Mark Feldman已经解决了我的大部分问题。其中一项仍在继续:

  • 我将提供的元素的确切数量。我需要我的ListView来显示,比如说6个元素。最后,ListView的高度必须是6*ChildElement。我猜我得手工计算。我想我可以在XAMLcodeBehind中做到这一点。我真的很想在XAML中这样做,我想我必须绑定到配置中的元素,该元素表示应该有多少元素是可见的,并将其乘以ActualHeight of ItemTemplate。是可行的吗?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-05 08:12:57

只要禁用垂直滚动条的可见性,其他一切都应如您所描述的那样工作。

代码语言:javascript
运行
复制
<ListBox ScrollViewer.VerticalScrollBarVisibility="Disabled">
票数 3
EN

Stack Overflow用户

发布于 2014-01-16 01:31:28

我遇到了一个需要想出解决你第二个问题的办法。该解决方案非常容易受到布局更改的影响,不建议使用,但它似乎是完成任务的唯一方法:

代码语言:javascript
运行
复制
private void List_OnSizeChanged(object sender, SizeChangedEventArgs e)
{
        var list = sender as ListViewBase;   // works with ListView or GridView
        if (list == null || list.Items == null)
        {
            return;
        }

        var nMax = 6; // set this to your desired number of items
        var n = list.Items.Count;
        var gen = list.ItemContainerGenerator;
        if (gen != null)
        {
            var height = 0.0;
            DependencyObject o;
            for (var i = 0;
                 i < nMax
                 && i < n
                 && (o = gen.ContainerFromIndex(i)) != null;
                 i++)
            {
                // calculate running height
                var h = o.GetValue(ActualHeightProperty) as double? ?? 0;
                height += h+2;
            }

            // set height, unsub and resub to listeners otherwise endless layout cycle
            if (height > 0)
            {
                list.SizeChanged -= List_OnSizeChanged;
                list.Height = height;
                list.SizeChanged += List_OnSizeChanged;
            }
        }
    }

使用上述事件处理程序订阅列表的SizeChanged事件,并将nMax更改为所需的项数。

如果您的列表项正在虚拟化,并且ItemsContainerGenerator为null,则可能必须通过将ItemsPanel更改为StackPanel这样的具体元素来强制实现:

代码语言:javascript
运行
复制
   <ListView>
        <ListView.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel/>
            </ItemsPanelTemplate>
        </ListView.ItemsPanel>
    </ListView>

在我的例子中,我还需要允许动态数量的项目,以便它们完全填充容器(而不是固定数量的项目),这个解决方案是从上面修改的,但是更容易受到布局更改的影响,并且可能需要更仔细的集成:

代码语言:javascript
运行
复制
 private void List_OnSizeChanged(object sender, SizeChangedEventArgs e)
 {
        var list = sender as ListViewBase;
        if (list == null || list.Items == null)
        {
            return;
        }

        var n = list.Items.Count;
        var containingFixedGrid = FindVisualParent<Grid>(list);  // this is an attempt to get the first container that is bounded by the actual height of the UI, in my case and the general case it is probably going to be a grid, but you may need to update this to whatever element makes sense; you can also use a named element
        if (containingFixedGrid == null || containingFixedGrid.ActualHeight > this.ActualHeight)
        {
            return;
        }

        var gen = list.ItemContainerGenerator;
        if (gen != null)
        {
            var adjustOffset = 2;  // small adjustment needed for alignment, adjust for your needs
            var height = 0.0;
            DependencyObject o;
            for (var i = 0; i < n && (o = gen.ContainerFromIndex(i)) != null; i++)
            {
                var item = o as FrameworkElement;
                if (item != null)
                {
                    // calculate the offset of this item to its containing grid
                    var t = item.TransformToVisual(containingFixedGrid) as MatrixTransform;
                    if (t != null && t.Matrix.OffsetY + item.ActualHeight < containingFixedGrid.ActualHeight)
                    {
                        height += item.ActualHeight + adjustOffset;
                    }
                }
            }

            // set height, unsub and resub to listeners otherwise endless layout cycle
            if (height > 0)
            {
                list.SizeChanged -= List_OnSizeChanged;
                list.Height = height;
                list.SizeChanged += List_OnSizeChanged;
            }
        }
    }

    public static T FindVisualParent<T>(DependencyObject element) where T : DependencyObject
    {
        var parent = element; 
        while (parent != null)
        {
            T type = parent as T; if (type != null)
            {
                return type;
            }
            parent = VisualTreeHelper.GetParent(parent) as UIElement;
        } 
        return null;
    }

订阅所需的列表到处理程序,现在每个列表中的项目数应该完全填充列表,而不需要裁剪任何项。调整adjustOffset以说明任何微小的差异。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20394306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档