我试过谷歌,我试过Bing无济于事。有没有人知道如何防止部分项目出现在WPF的列表框中?如果没有意义,这里是一个例子:列表框高200像素 - 每个项目高35像素。这意味着我可以显示5.7项。 7/10的项目是不可取的。我想限制它只显示5个项目。然后,用户可以滚动以查看其他项目。
我应该A)尝试动态调整列表框或ScrollViewer ViewPort的大小以使其完全适合吗?或者B)实现一个自定义面板,该面板不会安排所需高度超过剩余垂直空间的孩子?
任何想法都将不胜感激。最后一点:如果有人知道这样做的第三方控件(列表框或网格),我也会对此感兴趣。
答案 0 :(得分:1)
只需在设计器中调整大小,直到您没有获得部分行。实现自定义面板对于类似的事情来说太过分了。
您也可以尝试使用ListView
代替ListBox
。我可能会错误地记住这一点,但我认为ListView
没有显示部分,或者可能有选项不显示部分行。
答案 1 :(得分:1)
由于我的项目一直在解决这个问题,所以我今天一直在考虑这个问题。我的想法与我的项目有关但应该适用。我假设一个MVVM ViewModel,但没有它就能工作。
将属性绑定到ListBox所在容器的高度,然后使用ValueConverter将ListBox的高度绑定到该高度,以使ListBox根据单个项目的高度分阶段扩展或缩小。调整大小时看起来有点滑稽,但简短的动画效果可能会很好。
答案 2 :(得分:1)
你可以通过在dispather中查找列表框内容的实际高度并调整列表框的高度来实现这一点,但是,它会使列表框大小增大或缩小取决于实现。
答案 3 :(得分:1)
我的投票是每个项目的自定义面板。如果无法完全显示,则此面板不会显示。该列表可以根据需要调整大小,因为它唯一的工作是成为可调整大小的容器,为面板提供区域。面板可以根据需要增长和缩小。
答案 4 :(得分:0)
我的解决方案是使用多值转换器,该多值转换器将层次结构中的ListBox
,ScrollViewer
和ListBoxItem
以及列表框{{ 1}},滚动查看器ActualHeight
和列表框项目VerticalOffset
并返回可见性。最后的树形(双精度)值仅用于确保在任何重要值发生更改时将调用转换器的ActualHeight
方法。基本上,如果项目的底部大于滚动查看器的底部,则返回的Convert
为Visibility
,否则为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"/>