WPF ComboBox MaxDropDownItems - PullRequest
       6

WPF ComboBox MaxDropDownItems

8 голосов
/ 11 июня 2010

Есть ли способ установить максимальное количество выпадающих элементов, а не максимальную высоту выпадающего меню в WPF? Спасибо! * 1001 Кевин *

Ответы [ 3 ]

12 голосов
/ 12 июня 2010

Этот вопрос может иметь смысл только в том случае, если все ваши предметы имеют одинаковую высоту.В противном случае, когда вы прокручиваете ваш 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" />
2 голосов
/ 11 июня 2010

Нет прямого способа сказать, отображать Х количество предметов. Вы должны использовать свойство MaxDropDownHeight, чтобы ограничить его размер. Поскольку это свойство не рассчитывается элементом управления и полностью настраиваемо, вы можете написать что-нибудь, чтобы рассчитать высоту элемента, а затем умножить его на максимальное количество элементов, которые вы хотите отобразить, а затем установить MaxDropDownHeight на его основе.

0 голосов
/ 29 августа 2018

У меня была похожая проблема, когда выпадающий список не занимал все вертикальное пространство - я получал бы вертикальную полосу прокрутки после 3–4 элементов, несмотря на то, что для 20 элементов было бы достаточно вертикального пространства. Я создал tempList и добавил comboboxitems в этот список. Присвоил этот tempList привязке ItemsControl ComboBox, который дал начальную высоту выпадающего списка. Теперь поле со списком может отображать 20 элементов без вертикальной полосы прокрутки.

MaxDropDownHeight не работал ни до, ни после инициализации представления.

Надеюсь, это кому-нибудь поможет!

Спасибо

RDV

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...