不要在WPF列表框中显示部分项目

时间:2010-03-30 15:48:54

标签: wpf listbox

我试过谷歌,我试过Bing无济于事。有没有人知道如何防止部分项目出现在WPF的列表框中?如果没有意义,这里是一个例子:列表框高200像素 - 每个项目高35像素。这意味着我可以显示5.7项。 7/10的项目是不可取的。我想限制它只显示5个项目。然后,用户可以滚动以查看其他项目。

我应该A)尝试动态调整列表框或ScrollViewer ViewPort的大小以使其完全适合吗?或者B)实现一个自定义面板,该面板不会安排所需高度超过剩余垂直空间的孩子?

任何想法都将不胜感激。最后一点:如果有人知道这样做的第三方控件(列表框或网格),我也会对此感兴趣。

5 个答案:

答案 0 :(得分:1)

只需在设计器中调整大小,直到您没有获得部分行。实现自定义面板对于类似的事情来说太过分了。

您也可以尝试使用ListView代替ListBox。我可能会错误地记住这一点,但我认为ListView没有显示部分,或者可能有选项不显示部分行。

答案 1 :(得分:1)

由于我的项目一直在解决这个问题,所以我今天一直在考虑这个问题。我的想法与我的项目有关但应该适用。我假设一个MVVM ViewModel,但没有它就能工作。

将属性绑定到ListBox所在容器的高度,然后使用ValueConverter将ListBox的高度绑定到该高度,以使ListBox根据单个项目的高度分阶段扩展或缩小。调整大小时看起来有点滑稽,但简短的动画效果可能会很好。

答案 2 :(得分:1)

你可以通过在dispather中查找列表框内容的实际高度并调整列表框的高度来实现这一点,但是,它会使列表框大小增大或缩小取决于实现。

答案 3 :(得分:1)

我的投票是每个项目的自定义面板。如果无法完全显示,则此面板不会显示。该列表可以根据需要调整大小,因为它唯一的工作是成为可调整大小的容器,为面板提供区域。面板可以根据需要增长和缩小。

答案 4 :(得分:0)

我的解决方案是使用多值转换器,该多值转换器将层次结构中的ListBoxScrollViewerListBoxItem以及列表框{{ 1}},滚动查看器ActualHeight和列表框项目VerticalOffset并返回可见性。最后的树形(双精度)值仅用于确保在任何重要值发生更改时将调用转换器的ActualHeight方法。基本上,如果项目的底部大于滚动查看器的底部,则返回的ConvertVisibility,否则为Hidden

这是转换器的代码:

Visible

其声明:

using System;
using System.Globalization;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;

public class ListBoxItemToVisibilityConverter : IMultiValueConverter
{
    public object Convert(
        object[] values,
        Type targetType,
        object parameter,
        CultureInfo culture)
    {
        if ((values?.Length ?? 0) != 6)
            return Visibility.Collapsed;

        var listBox = values.OfType<ListBox>().FirstOrDefault();
        var scrollViewer = values.OfType<ScrollViewer>().FirstOrDefault();
        var listBoxItem = values.OfType<ListBoxItem>().FirstOrDefault();

        var heights = values.OfType<double>().ToArray();

        if (new object[] { listBox, scrollViewer, listBoxItem }.Any(item => item == null) || heights.Length != 3)
            return Visibility.Collapsed;

        var scrollViewerBottom = scrollViewer.PointToScreen(new Point(0, scrollViewer.ActualHeight)).Y;
        var listBoxItemBottom = listBoxItem.PointToScreen(new Point(0, listBoxItem.ActualHeight)).Y;

        return listBoxItemBottom > scrollViewerBottom ? Visibility.Hidden : Visibility.Visible;
    }

    public object[] ConvertBack(
        object value,
        Type[] targetTypes,
        object parameter,
        CultureInfo culture) =>
        throw new NotSupportedException();
}

它在项目模板中的用法:

<local:ListBoxItemToVisibilityConverter x:Key="ListBoxItemToVisibility"/>