2010-06-10 34 views
8

WPF'de azami aşağı açılır yükseklikten ziyade maksimum açılan öğe sayısını ayarlamak zaten var mı? Teşekkürler! -KevinWPF ComboBox MaxDropDownItems

+0

Neden don' Yüklediğiniz miktarı sadece "ComboBox" ile sınırlandırıyor musunuz? Sadece maks. Kontrolün maksimumu aşarken ne yapmasını beklerdiniz? Bir istisna atmak mı? Sadece eklemez misin? – Kelsey

+0

Hayır ... Sabit kodlamadan ziyade maksimum açılır yükseklik. Görüntülenecek maksimum açılır menü miktarını ayarlamayı tercih ederim. Üzgünüm, garip bir şekilde, VB'nin bir kerede sergilenen azami açılır menüye sahip birleşik kutularını düşünüyordum. – Kevin

cevap

2

X öğe sayısını göstermenin doğrudan bir yolu yoktur. Boyutu sınırlamak için MaxDropDownHeight özelliğini kullanmanız gerekir. Bu özellik kontrol tarafından hesaplanmadığından ve tam olarak özelleştirilebildiğinden, bir öğenin yüksekliğini hesaplamak için bir şey yazabilir ve sonra görüntülemek istediğiniz maksimum öğelerle o kadar çok olabilir ve ardından MaxDropDownHeight değerini temel alarak ayarlayabilirsiniz.

+1

+1 Tüm öğeler aynı yükseklikte olduğu sürece doğru fikir. Bu muhtemelen ekli bir mülkte yapılmalıdır. Bunu yapmak için gerçek koda sahip bir cevap ekleyeceğim. –

10

Bu soru ancak tüm öğelerinizin aynı yüksekliğe sahip olması durumunda anlamlı olabilir. Aksi takdirde, ComboBox'ınızı öğe listesinin farklı bölümlerini görmek için yukarı ve aşağı kaydırırken, ComboBox'unuzun kaydırdıkça daha büyük ve daha küçük olacağını görürsünüz. aynı yükseklikte olan sizin tüm öğeleri, bu iliştirilmiş bir özellik kullanarak bunu yapmak için çok kolaysa

: Bu özellik sayesinde

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

yazabilirsiniz:

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

Bu kodu doğrudan test ettim. XAML bir hata ya da bir şey üretmiyor ama uygulamayı çalıştırdığımda açılan kutu listesi yüksekliği yaklaşık 5 öğede kalıyor ve 15 değerini denedi. – steviesama

+0

Açılan kutucuklar ilk açıldığında görünür olan boyutlar arasında bir atlama var. DispatcherPriotiry'yi Normal olarak ayarlayın. Ve şimdi tam olarak ihtiyacım olduğu gibi çalışıyor. Teşekkür ederim :) – adminSoftDK