WPF组合框最大下拉项数

9
有没有办法在WPF中设置下拉列表项的最大数量而不是最大下拉高度呢? 谢谢! -Kevin

为什么不限制你加载到“ComboBox”中的数量?只添加最大数量。当超过最大值时,您希望控件做什么?抛出异常?还是仅仅不添加它? - Kelsey
不要硬编码最大下拉高度,我宁愿能够设置要显示的最大下拉项数。抱歉我的措辞有些奇怪,我在想 VB 的组合框,它们一次显示最大的下拉列表。 - Kevin
3个回答

12

如果你的所有项都具有相同的高度,那么这个问题才有意义。否则,当你滚动ComboBox以查看项目列表的不同部分时,ComboBox会随着滚动而变大和缩小。

如果你的所有项都是相同高度,使用一个附加属性非常容易实现:

public class ComboBoxHelper : DependencyObject
{
  public static int GetMaxDropDownItems(DependencyObject obj) { return (int)obj.GetValue(MaxDropDownItemsProperty); }
  public static void SetMaxDropDownItems(DependencyObject obj, int value) { obj.SetValue(MaxDropDownItemsProperty, value); }
  public static readonly DependencyProperty MaxDropDownItemsProperty = DependencyProperty.RegisterAttached("MaxDropDownItems", typeof(int), typeof(ComboBoxHelper), new PropertyMetadata
  {
    PropertyChangedCallback = (obj, e) =>
    {
      var box = (ComboBox)obj;
      box.DropDownOpened += UpdateHeight;
      if(box.IsDropDownOpen) UpdateHeight(box, null);
    }
  });

  private static void UpdateHeight(object sender, EventArgs e)
  {
    var box = (ComboBox)sender;
    box.Dispatcher.BeginInvoke(DispatcherPriority.Input, new Action(() =>
      {
        var container = box.ItemContainerGenerator.ContainerFromIndex(0) as UIElement;
        if(container!=null && container.RenderSize.Height>0)
          box.MaxDropDownHeight = container.RenderSize.Height * GetMaxDropDownItems(box);
      }));
  }
}

使用此属性,您可以编写以下内容:

<ComboBox ...
   my:ComboBoxHelper.MaxDropDownItems="8" />

我直接测试了这段代码。XAML 没有生成错误或其他任何问题,但当我运行应用程序时,组合框列表高度仍保持在大约 5 个项目,我已尝试将其值设置为 15。 - steviesama
1
当下拉框首次打开时,大小之间存在跳跃现象,我将DispatcherPriority设置为Normal。现在它完全按照我的需求工作。谢谢 :) - adminSoftDK

2

没有直接的方法来显示X个项目。您必须使用MaxDropDownHeight属性来限制其大小。由于此属性不是由控件计算的,并且完全可自定义,因此您可以编写一些代码来计算项目的高度,然后将其乘以要显示的最大项目数,然后根据此设置MaxDropDownHeight


1
+1 对的想法,只要所有项目的高度相同。这可能应该在一个附加属性中完成。我会添加一个包含实际代码的答案来完成这个任务。 - Ray Burns

0

我曾经遇到过类似的问题,即组合框下拉列表无法占据整个垂直空间 - 即使有足够的垂直空间可以容纳20个项目,但在3到4个项目后仍会出现垂直滚动条。我创建了一个tempList,并将comboboxitems添加到该列表中。将此tempList分配给ComboBox的ItemsControl绑定,这样就可以给组合框设置初始下拉高度。 现在,组合框可以显示20个项目而不需要垂直滚动条。

MaxDropDownHeight无效,无论在视图初始化之前还是之后都是如此。

希望对某些人有所帮助!

谢谢,

RDV


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接