2010-06-10 7 views
8

Est-il possible de définir le nombre maximal d'éléments déroulants plutôt que la hauteur de liste déroulante maximale dans WPF? Merci! -KevinWPF ComboBox MaxDropDownItems

+0

Pourquoi n » t limitez-vous simplement le montant que vous chargez dans le 'ComboBox'? Ajoutez seulement jusqu'à votre max. Que voulez-vous que le contrôle fasse quand vous allez au-delà du maximum? Lève une exception? Juste ne pas l'ajouter? – Kelsey

+0

Non ... Plutôt que de coder en dur la hauteur maximale du drop down. Je préfère être en mesure de définir la quantité d'éléments déroulants max à afficher. Désolé je l'ai formulé bizarrement, je pensais aux boîtes à liste déroulante de VB où elles ont une liste déroulante maximum affichée immédiatement. – Kevin

Répondre

2

Il n'y a pas de moyen direct d'afficher X nombre d'éléments. Vous devez utiliser la propriété MaxDropDownHeight pour limiter sa taille. Puisque cette propriété n'est pas calculée par le contrôle et est entièrement personnalisable, vous pouvez écrire quelque chose pour calculer la hauteur d'un objet, puis multiplier ce nombre par les éléments maximum que vous souhaitez afficher, puis définir MaxDropDownHeight en fonction de celui-ci.

+1

+1 Bonne idée, tant que tous les articles ont la même hauteur. Cela devrait probablement être fait dans une propriété jointe. Je vais ajouter une réponse qui a le code réel pour le faire. –

10

Cette question peut être significative uniquement si tous vos articles ont la même hauteur. Sinon, lorsque vous faites défiler votre ComboBox de haut en bas pour voir différentes parties de la liste des éléments, votre ComboBox deviendra de plus en plus petit au fur et à mesure que vous faites défiler.

Si tous vos articles sont la même hauteur, il est très facile de le faire en utilisant une propriété attachée:

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); 
     })); 
    } 
} 

Avec cette propriété, vous pouvez écrire:

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

J'ai testé ce code directement. Le XAML ne génère pas d'erreur ou quoi que ce soit mais quand je lance l'application la liste déroulante reste à environ 5 items et essaye une valeur de 15. – steviesama

+0

Il y a un saut entre les tailles visibles, quand la combobox est ouverte pour la première fois, Définissez DispatcherPriotiry sur Normal. Et maintenant ça fonctionne exactement comme j'en ai besoin. Je vous remercie :) – adminSoftDK