2010-10-26 16 views
2

J'ai combobox lié à la chaîne []. Je n'ai pas d'éléments de liste déroulante clairs. Mais je veux mesurer mes objets perdus. Comment puis-je obtenir la largeur des éléments dans la zone de liste déroulante lors de l'exécution. J'ai besoin de ça pour gérer la largeur de mon combo.Obtenir la largeur de ComboBoxItem

Répondre

5

Si vous voulez faire et vous n'êtes pas sûr si tous vos ComboBoxItems ont été générés, vous pouvez utiliser ce code. Il va développer le ComboBox dans le code derrière et lorsque tous les ComboBoxItems à l'intérieur de celui-ci sont chargés, mesurer leur taille, puis fermez le ComboBox.

Le IExpandCollapseProvider est en UIAutomationProvider

public void SetComboBoxWidthFromItems() 
{ 
    double comboBoxWidth = c_comboBox.DesiredSize.Width; 

    // Create the peer and provider to expand the c_comboBox in code behind. 
    ComboBoxAutomationPeer peer = new ComboBoxAutomationPeer(c_comboBox); 
    IExpandCollapseProvider provider = (IExpandCollapseProvider)peer.GetPattern(PatternInterface.ExpandCollapse); 
    EventHandler eventHandler = null; 
    eventHandler = new EventHandler(delegate 
    { 
     if (c_comboBox.IsDropDownOpen && 
      c_comboBox.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated) 
     { 
      double width = 0; 
      foreach (var item in c_comboBox.Items) 
      { 
       ComboBoxItem comboBoxItem = c_comboBox.ItemContainerGenerator.ContainerFromItem(item) as ComboBoxItem; 
       comboBoxItem.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); 
       if (comboBoxItem.DesiredSize.Width > width) 
       { 
        width = comboBoxItem.DesiredSize.Width; 
       } 
      } 
      c_comboBox.Width = comboBoxWidth + width; 
      // Remove the event handler. 
      c_comboBox.ItemContainerGenerator.StatusChanged -= eventHandler; 
      c_comboBox.DropDownOpened -= eventHandler; 
      provider.Collapse(); 
     } 
    }); 
    // Anonymous delegate as event handler for ItemContainerGenerator.StatusChanged. 
    c_comboBox.ItemContainerGenerator.StatusChanged += eventHandler; 
    c_comboBox.DropDownOpened += eventHandler; 
    // Expand the c_comboBox to generate all its ComboBoxItem's. 
    provider.Expand(); 
} 

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    SetComboBoxWidthFromItems(); 
} 
+0

parfait. Où dou savoir à propos de ce tour? Je l'ai essayée pendant deux jours –

+0

Oui, ça m'a pris du temps aussi. Je l'ai un peu intrigué ensemble morceau par morceau. Le ItemContainerGenerator.StatusChanged est très commun mais dans ce cas, il n'était pas suffisant pour environ 1% des cas, j'ai donc dû ajouter aussi l'événement DropDownOpened. La façon de développer et de réduire a été trouvée par google :-) –

+0

Ce serait génial comme une propriété jointe, ou juste l'implémentation d'un ComboBox sous-classé – JJS

0

Essayez cette fonction:

foreach(var item in MyComboBox.Items){ 

    double width = item.ActualWidth; 

} 
+0

élément est une chaîne, il n'a pas la propriété ActualWidth –