Если вы хотите сделать это и не уверены, что все ваши ComboBoxItems были сгенерированы, вы можете использовать этот код. Это расширит ComboBox в коде позади, и когда все ComboBoxItems в нем будут загружены, измерить их размер и затем закрыть ComboBox.
IExpandCollapseProvider находится в 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();
}