【问题标题】:wrapping content in a StackPanel wpf在 StackPanel wpf 中包装内容
【发布时间】:2012-04-13 18:35:13
【问题描述】:

是否可以将内容包装在 StackPanel 中?

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

那么,有没有办法让StackPanel 中的项目在说 5 个项目后包装...... 谢谢!

【问题讨论】:

  • 为什么必须使用StackPanel 而不是WrapPanel
  • 我们已经定制了堆栈面板的某些功能..所以我们的堆栈面板支持我们自己的虚拟化..我不想重新发明轮子来虚拟化包装面板..

标签: c# wpf wpf-controls


【解决方案1】:

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

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

不在StackPanel 或任何其他容器内。在某些情况下,将 Width 设置为常数值可能会更好,因为将其绑定到 ActualWidth 可以防止缩小尺寸(例如,当父控件缩小尺寸时, WrapPanel 不是)

【讨论】:

  • 这非常适合每行没有固定数量的项目 =)
【解决方案2】:

创建嵌套的StackPanels,其中包含所需数量的项目。

在下面的示例中,您有两行,分别由 &lt;StackPanel Orientation="Horizontal"&gt; 元素占据,而这些元素又包含五个将水平相邻显示的项目。

<StackPanel Orientation="Vertical">
    <StackPanel Orientation="Horizontal">
        <Item1 />
        <Item2 />
        <Item3 />
        <Item4 />
        <Item5 />
    </StackPanel>
    <StackPanel Orientation="Horizontal">
        <Item1 />
        <Item2 />
        <Item3 />
        <Item4 />
        <Item5 />
    </StackPanel>
</StackPanel>

【讨论】:

    【解决方案3】:
    <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>
    

    【讨论】:

    • :) 我听到了,里奇! ..但是,很难说为什么要在没有任何上下文的情况下保留stackPanel!所以那里!这是一个 typeof(StackPanel),其中 WrapPanel 是内部癌症!
    • 严重吗?
    【解决方案4】:

    根据您的情况,您可以使用UniformGrid。一些例子也可以在here找到。

    您可以将其定义为像这样在 5 个项目之后换行。

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

    每个项目都会得到完全相同的宽度,所以不确定这是否适合您。

    【讨论】:

      【解决方案5】:

      我认为没有包装面板就无法做到这一点。也许您可以尝试在堆栈面板内放置一个 wrapPanel - 将其宽度设置为堆栈面板的实际宽度。你可以像Width="{Binding ActualWidth, ElementName=StackPanel1}"一样绑定它

      但这只是一个小技巧 - 我认为 wrap 面板最适合您的需求。

      【讨论】:

        【解决方案6】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2015-06-21
          • 1970-01-01
          • 2018-03-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多