2010-06-10 26 views
8

Esiste comunque la possibilità di impostare il numero massimo di voci a discesa anziché l'altezza massima a discesa in WPF? Grazie! -KevinWPF ComboBox MaxDropDownItems

+0

Perché don' t limiti solo la quantità che stai caricando al 'ComboBox'? Aggiungi solo al massimo. Cosa ti aspetti dal controllo quando superi il limite massimo? Lanciare un'eccezione? Non aggiungerlo? – Kelsey

+0

No ... Piuttosto che l'altezza massima di codifica hard disc down. Preferirei essere in grado di impostare la quantità di elementi a discesa massima da visualizzare. Mi spiace di averlo pronunciato in modo strano, stavo pensando alle caselle combinate di VB in cui hanno un drop down massimo visualizzato contemporaneamente. – Kevin

risposta

2

Non esiste un modo diretto per visualizzare il numero X di elementi. È necessario utilizzare la proprietà MaxDropDownHeight per limitare la sua dimensione. Dal momento che questa proprietà non è calcolata dal controllo ed è completamente personalizzabile, potresti scrivere qualcosa per calcolare l'altezza di un oggetto e poi moltiplicarla per le voci massime che desideri visualizzare e quindi impostare MaxDropDownHeight in base ad essa.

+1

+1 Idea giusta, purché tutti gli elementi abbiano la stessa altezza. Questo dovrebbe probabilmente essere fatto in una proprietà allegata. Aggiungerò una risposta che ha il codice effettivo per farlo. –

10

Questa domanda può essere significativa solo se tutti i tuoi articoli hanno la stessa altezza. Altrimenti mentre scorri il tuo ComboBox su e giù per vedere diverse parti dell'elenco, il tuo ComboBox diventerà sempre più piccolo mentre scorri.

Se tutti i vostri articoli sono la stessa altezza, è molto semplice per farlo utilizzando una proprietà associata:

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

Con questa struttura si può scrivere:

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

Ho testato questo codice direttamente. XAML non genera un errore o altro, ma quando eseguo l'applicazione l'altezza dell'elenco delle caselle combinate rimane a circa 5 elementi e ho provato un valore di 15. – steviesama

+0

C'è un salto tra le dimensioni visibili, quando la casella combinata è aperta per la prima volta, I imposta DispatcherPriotiry su Normal. E ora funziona esattamente come ne ho bisogno. Grazie :) – adminSoftDK