在多列中显示ComboBoxItems

时间:2013-08-13 14:07:50

标签: c# .net wpf vb.net xaml

我希望我的ComboBox在多列中显示ComboBoxItem,如下所示:

有人可以告诉我该怎么做?

我可以用这个:

        <ComboBox.ItemsPanel>
            <ItemsPanelTemplate>
                <UniformGrid Columns="3"/>
            </ItemsPanelTemplate>
        </ComboBox.ItemsPanel>

但它不允许我指定我想要结束列的位置。

有没有办法让ComboBox使用Grid.Column中的ComboBoxItem属性,以便我可以在不同的列中添加ComboBoxItem

2 个答案:

答案 0 :(得分:1)

将ItemsPanelTemplate更改为WrapPanel。

<ComboBox>
    <ComboBox.Resources>
        <Style TargetType="ComboBox">
            <Setter Property="ItemsPanel">
                <Setter.Value>
                    <ItemsPanelTemplate>
                        <WrapPanel IsItemsHost="True" Orientation="Vertical" Width="100" Height="50" />
                    </ItemsPanelTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <Style TargetType="ComboBoxItem">
            <Setter Property="Width" Value="50" />
        </Style>
    </ComboBox.Resources>

    <ComboBoxItem Content="Item 1" />
    <ComboBoxItem Content="Item 2" />
    <ComboBoxItem Content="Item 3" />
    <ComboBoxItem Content="Item 4" />
    <ComboBoxItem Content="Item 5" />
    <ComboBoxItem Content="Item 5" />

</ComboBox>

答案 1 :(得分:0)

您需要向项目添加自定义Panel,并将其设置为ItemsPanel,如下所示:

<ComboBox>
    <ComboBox.ItemsPanel>
        <ItemsPanelTemplate>
            <Controls:ColumnPanel />
        </ItemsPanelTemplate>
    </ComboBox.ItemsPanel>
</ComboBox>

您可以了解如何在this tutorial中创建自定义Panel

编辑&gt;&gt;&gt;

我只是觉得你可以从现有的Panel获得这个简单的布局:WrapPanel ...在我研究这个时给我一点时间。

进一步编辑&gt;&gt;&gt;

好的,WrapPanel上有这些属性; ItemWidthItemHeight。这有点像黑客,但是如果你将ItemWidth的{​​{1}}属性设置为WrapPanel的{​​{1}}的一半,那么你将拥有一个基本的两列Width。唯一的问题是你必须对这些值进行硬编码。

就个人而言,我建议您花点时间创建一个简单的可重用WrapPanel控件,该控件允许您设置所需的列数。我有一个并且已经找到它的许多用途......它们也可以进入Panel和其他集合控件。