Я знаю, как это сделать в коде, но можно ли это сделать в XAML?
Window1.xaml:
<Window x:Class="WpfApplication1.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300"> <Grid> <ComboBox Name="ComboBox1" HorizontalAlignment="Left" VerticalAlignment="Top"> <ComboBoxItem>ComboBoxItem1</ComboBoxItem> <ComboBoxItem>ComboBoxItem2</ComboBoxItem> </ComboBox> </Grid> </Window>
Window1.xaml.cs:
using System.Windows; using System.Windows.Controls; namespace WpfApplication1 { public partial class Window1 : Window { public Window1() { InitializeComponent(); double width = 0; foreach (ComboBoxItem item in ComboBox1.Items) { item.Measure(new Size( double.PositiveInfinity, double.PositiveInfinity)); if (item.DesiredSize.Width > width) width = item.DesiredSize.Width; } ComboBox1.Measure(new Size( double.PositiveInfinity, double.PositiveInfinity)); ComboBox1.Width = ComboBox1.DesiredSize.Width + width; } } }
Подход Алана Харфорда, на практике:
<Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <!-- hidden listbox that has all the items in one grid --> <ListBox ItemsSource="{Binding Items, ElementName=uiComboBox, Mode=OneWay}" Height="10" VerticalAlignment="Top" Visibility="Hidden"> <ListBox.ItemsPanel><ItemsPanelTemplate><Grid/></ItemsPanelTemplate></ListBox.ItemsPanel> </ListBox> <ComboBox VerticalAlignment="Top" SelectedIndex="0" x:Name="uiComboBox"> <ComboBoxItem>foo</ComboBoxItem> <ComboBoxItem>bar</ComboBoxItem> <ComboBoxItem>fiuafiouhoiruhslkfhalsjfhalhflasdkf</ComboBoxItem> </ComboBox> </Grid>
Я сам искал ответ, когда наткнулся на метод UpdateLayout(), который есть у каждого UIElement.
UpdateLayout()
UIElement
Теперь все очень просто, к счастью!
Просто позвоните ComboBox1.Updatelayout(); после того, как вы установите или измените ItemSource.
ComboBox1.Updatelayout();
ItemSource