Xamlでは直接行うことはできませんが、この付随する動作を使用できます。 (幅はデザイナーに表示されます)
<ComboBox behaviors:ComboBoxWidthFromItemsBehavior.ComboBoxWidthFromItems="True">
<ComboBoxItem Content="Short"/>
<ComboBoxItem Content="Medium Long"/>
<ComboBoxItem Content="Min"/>
</ComboBox>
添付行動ComboBoxWidthFromItemsProperty
public static class ComboBoxWidthFromItemsBehavior
{
public static readonly DependencyProperty ComboBoxWidthFromItemsProperty =
DependencyProperty.RegisterAttached
(
"ComboBoxWidthFromItems",
typeof(bool),
typeof(ComboBoxWidthFromItemsBehavior),
new UIPropertyMetadata(false, OnComboBoxWidthFromItemsPropertyChanged)
);
public static bool GetComboBoxWidthFromItems(DependencyObject obj)
{
return (bool)obj.GetValue(ComboBoxWidthFromItemsProperty);
}
public static void SetComboBoxWidthFromItems(DependencyObject obj, bool value)
{
obj.SetValue(ComboBoxWidthFromItemsProperty, value);
}
private static void OnComboBoxWidthFromItemsPropertyChanged(DependencyObject dpo,
DependencyPropertyChangedEventArgs e)
{
ComboBox comboBox = dpo as ComboBox;
if (comboBox != null)
{
if ((bool)e.NewValue == true)
{
comboBox.Loaded += OnComboBoxLoaded;
}
else
{
comboBox.Loaded -= OnComboBoxLoaded;
}
}
}
private static void OnComboBoxLoaded(object sender, RoutedEventArgs e)
{
ComboBox comboBox = sender as ComboBox;
Action action =() => { comboBox.SetWidthFromItems(); };
comboBox.Dispatcher.BeginInvoke(action, DispatcherPriority.ContextIdle);
}
}
何それがないと、それは(目に見えない)が膨張して自分自身を崩壊コンボボックスと呼ばれるSetWidthFromItemsための拡張メソッドを呼び出すことです生成されたComboBoxItemsに基づいてWidthを計算します。この拡張方法は、コンボボックス内のコードビハインドで
comboBox.SetWidthFromItems();
を呼び出す機能(例えばに提供そして
拡張メソッドSetWidthFromItems
public static class ComboBoxExtensionMethods
{
public static void SetWidthFromItems(this ComboBox comboBox)
{
double comboBoxWidth = 19;// comboBox.DesiredSize.Width;
// Create the peer and provider to expand the comboBox in code behind.
ComboBoxAutomationPeer peer = new ComboBoxAutomationPeer(comboBox);
IExpandCollapseProvider provider = (IExpandCollapseProvider)peer.GetPattern(PatternInterface.ExpandCollapse);
EventHandler eventHandler = null;
eventHandler = new EventHandler(delegate
{
if (comboBox.IsDropDownOpen &&
comboBox.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated)
{
double width = 0;
foreach (var item in comboBox.Items)
{
ComboBoxItem comboBoxItem = comboBox.ItemContainerGenerator.ContainerFromItem(item) as ComboBoxItem;
comboBoxItem.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
if (comboBoxItem.DesiredSize.Width > width)
{
width = comboBoxItem.DesiredSize.Width;
}
}
comboBox.Width = comboBoxWidth + width;
// Remove the event handler.
comboBox.ItemContainerGenerator.StatusChanged -= eventHandler;
comboBox.DropDownOpened -= eventHandler;
provider.Collapse();
}
});
comboBox.ItemContainerGenerator.StatusChanged += eventHandler;
comboBox.DropDownOpened += eventHandler;
// Expand the comboBox to generate all its ComboBoxItem's.
provider.Expand();
}
}
(IExpandCollapseProviderはUIAutomationProvider.dllへの参照を必要とします)。ロードされたイベント)
私もコードでこのアプローチを試しましたが、測定値はVistaとXPで異なることがわかりました。 Vistaでは、DesiredSizeには通常、ドロップダウンの矢印サイズが含まれていますが、XPでは幅にドロップダウン矢印が含まれていないことがよくあります。私の結果は、親ウィンドウが見える前に測定を試みているためです。 Measureの前にUpdateLayout()を追加すると、アプリで他の副作用が発生する可能性があります。 あなたが共有したいと思っているソリューションを見てみたいと思っています。 – jschroedl
どのように問題を解決しましたか? –
http://stackoverflow.com/questions/826985/make-wpf-comboboxes-fill-a-whole-column-widthで同様の行の別の記事をチェックしてください。これがあなたの質問に答える場合は、あなたの質問に「回答済み」と記入してください。 – Sudeep