在WPF中将内容包装在StackPanel中

23

能否在StackPanel中包装内容?

我知道我们可以使用 WrapPanel。但出于代码修改原因,我必须使用StackPanel

那么,有没有一种方法可以让StackPanel中的项目在5个项目后自动换行...谢谢!


3
为什么你必须使用 StackPanel 而不是 WrapPanel - Rachel
我们已经自定义了 Stack Panel 的某些功能...因此我们拥有自己的支持虚拟化的 Stack Panel..我不想为实现 Wrap Panel 的虚拟化而重新发明轮子.. - user1202434
7个回答

32

对我来说,一个简单的 WrapPanel 就可以胜任:

<WrapPanel Orientation="Horizontal" Width="500" />

不在StackPanel或任何其他容器中。有时将Width设置为固定值可能更优,因为将其绑定到ActualWidth可能会防止缩小(例如,当父控件缩小时,WrapPanel不会缩小)。


这非常适合当你的每行项目数量不固定的时候 =) - mikelt21

18
创建嵌套的 StackPanel,其中包含所需数量的项。
在下面的示例中,您有两行,分别由 <StackPanel Orientation="Horizontal"> 元素占用,这些元素又各自包含五个项,这些项将水平并排显示。
<StackPanel Orientation="Vertical">
    <StackPanel Orientation="Horizontal">
        <Item1 />
        <Item2 />
        <Item3 />
        <Item4 />
        <Item5 />
    </StackPanel>
    <StackPanel Orientation="Horizontal">
        <Item1 />
        <Item2 />
        <Item3 />
        <Item4 />
        <Item5 />
    </StackPanel>
</StackPanel>

9
<StackPanel>
        <StackPanel.Style>
            <Style TargetType="{x:Type StackPanel}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type StackPanel}">
                            <WrapPanel/>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </StackPanel.Style>
    </StackPanel>

4
我明白你的意思,Ritch!但是很难确定为什么问题中会如此坚持保留没有任何上下文的stackPanel!所以在这里!这里有一个typeof(StackPanel),其中包含WrapPanel作为内部元素。 - denis morozov
这是认真的吗? - Martin Capodici

6

根据您的情况,您可以使用UniformGrid。这里还可以找到一些示例

您可以像这样定义它在5个项目后换行。

<UniformGrid Columns="5">
 <Button />
 <Button />
 <Button />
</UniformGrid>

每个项目的宽度都相同,因此不确定这是否适用于您。


0

我在按钮上放了一个StackPanel,它不会影响按钮的背景。然后在VB代码中,我使用了Chr(12)来表示换行:

Button1.Content = "first line" + Chr(12) + "second line"

您可以使用Chr(12)添加更多行。

0

我认为你不能没有WrapPanel实现它。也许你可以尝试在StackPanel内部放置一个WrapPanel-将其宽度设置为StackPanel的实际宽度。你可以像这样绑定它:Width="{Binding ActualWidth, ElementName=StackPanel1}"

但这只是一种hack方法-我认为WrapPanel最适合你的需求。


0
对我来说,这是最好和最简单的解决方案。设置 ItemsPanel 属性。
    <ItemsControl>
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel Orientation="Horizontal" />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>

    </ItemsControl>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接