对齐堆栈面板中的项目?

Posted

技术标签:

【中文标题】对齐堆栈面板中的项目?【英文标题】:Align items in a stack panel? 【发布时间】:2011-01-02 15:38:53 【问题描述】:

我想知道我是否可以在水平方向的 StackPanel 中有 2 个控件,以便正确的项目应该停靠在 StackPanel 的右侧。

我尝试了以下方法,但没有成功:

<StackPanel Orientation="Horizontal">
    <TextBlock>Left</TextBlock>
    <Button Width="30" HorizontalAlignment="Right">Right<Button>
</StackPanel>

在上面的 sn-p 中,我希望 Button 停靠在 StackPanel 的右侧。

注意:我需要使用 StackPanel,而不是 Grid 等来完成。

【问题讨论】:

您明确提到没有网格,但这正是我实现此目的的方式。我很想看看其他人是否有适合我自己需求的非网格答案。 是的,我刚刚有人给了我一个这样的堆栈面板项目,这就是他想要修复它的方式。 我知道这(非常)晚了,但你能不能在堆栈面板中放置一个停靠面板? @Kian,你的评论完全正确,我自己想出来的,试过了,效果很好。 【参考方案1】:

如果您遇到的问题类似于我在垂直堆栈面板中的标签居中的问题,请确保使用全宽度控件。删除 Width 属性,或将按钮放在允许内部对齐的全角容器中。 WPF 就是使用容器来控制布局。

<StackPanel Orientation="Vertical">
    <TextBlock>Left</TextBlock>
    <DockPanel>
        <Button HorizontalAlignment="Right">Right</Button>
    </DockPanel>
</StackPanel>

Vertical StackPanel with Left Label followed by Right Button

我希望这会有所帮助。

【讨论】:

【参考方案2】:

对于那些偶然发现这个问题的人,以下是如何使用Grid

实现此布局
<Grid>
    <TextBlock Text="Server:"/>
    <TextBlock Text="http://127.0.0.1" HorizontalAlignment="Right"/>
</Grid>

创造

Server:                                                                   http://127.0.0.1

【讨论】:

【参考方案3】:

您可以通过DockPanel 实现此目的:

<DockPanel Width="300">
    <TextBlock>Left</TextBlock>
    <Button HorizontalAlignment="Right">Right</Button>
</DockPanel>

区别在于StackPanel will arrange child elements into single line(垂直或水平)而DockPanel defines an area where you can arrange child elements either horizontally or vertically, relative to each other(Dock 属性会更改元素相对于同一容器中其他元素的位置。对齐属性,例如@987654330 @,改变元素相对于其父元素的位置)。

更新

正如 cmets 中所指出的,您还可以使用 StackPanelFlowDirection 属性。请参阅@D_Bester 的answer。

【讨论】:

这就是我所说的“等”。我想答案是否定的,并且必须以艰难的方式做到这一点,请阅读我上面对 JMD 的评论 好吧,StackPanel 根本做不到你想要的布局。 Grid 将为您提供最大的灵活性,但从 StackPanel 更改为 DockPanel 似乎并不太难。 Windows 8没有DockPanel,还有其他解决办法吗? @DirkVollmar 实际上 StackPanel 效果很好,请参阅我的回答。 如果想让item最右对齐,设置LastChildFill="False"&lt;DockPanel LastChildFill="False"&gt;,见***.com/a/9599290/4573839【参考方案4】:

这对我来说非常有效。只需将按钮放在第一位,因为您从右侧开始。如果 FlowDirection 成为问题,只需在其周围添加一个 StackPanel 并为该部分指定 FlowDirection="LeftToRight"。或者简单地为相关控件指定 FlowDirection="LeftToRight"。

<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" FlowDirection="RightToLeft">
    <Button Width="40" HorizontalAlignment="Right" Margin="3">Right</Button>
    <TextBlock Margin="5">Left</TextBlock>
    <StackPanel FlowDirection="LeftToRight">
        <my:DatePicker Height="24" Name="DatePicker1" Width="113" xmlns:my="http://schemas.microsoft.com/wpf/2008/toolkit" />    
    </StackPanel>
    <my:DatePicker FlowDirection="LeftToRight" Height="24" Name="DatePicker1" Width="113" xmlns:my="http://schemas.microsoft.com/wpf/2008/toolkit" />    
</StackPanel>

【讨论】:

【参考方案5】:

无法按照我想要的方式使用 DockPanel 完成这项工作,并且反转 StackPanel 的流向很麻烦。使用网格不是一个选项,因为其中的项目可能在运行时被隐藏,因此我不知道设计时的总列数。我能想到的最好和最简单的解决方案是:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>
    <StackPanel Grid.Column="1" Orientation="Horizontal">
        <!-- Right aligned controls go here -->
    </StackPanel>
</Grid>

这将导致 StackPanel 内部的控件与可用空间的右侧对齐,无论控件的数量是多少 - 在设计和运行时都是如此。耶! :)

【讨论】:

如果 FlowDirection 是一个问题,只需放入另一个 StackPanel 并指定 FlowDirection。看我的回答。 我认为这是一个比弄乱嵌套流向更清洁的解决方案【参考方案6】:

适用于 Windows 10 使用 relativePanel 代替堆栈面板,并使用

relativepanel.alignrightwithpanel="true"

对于包含的元素。

【讨论】:

【参考方案7】:
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <TextBlock Text="Left"  />
    <Button Width="30" Grid.Column="1" >Right</Button>
</Grid>

【讨论】:

对于我的内容,我在第一个 columnDefinition 上使用了 Width="*",在第二个 columnDefinition 上使用了 Width="Auto"。这样一来,第一列占用的空间就比第二列少了。【参考方案8】:

你可以将Stack panel中的FlowDirection设置为RightToLeft,然后所有的项目都会向右对齐。

【讨论】:

但是请注意,这会改变(反转)StackPanel 中控件的顺序。 @slattery 如果 FlowDirection 有问题,只需放入另一个 StackPanel 并指定 FlowDirection。看我的回答。 @rumblefx0:注意,如果控件停靠在右侧或底部,DockPanel 也会反转控件的顺序。这是因为第一个控件首先停靠。【参考方案9】:

如果您需要避免硬编码大小值,这可能不是您想要的,但有时我为此使用“垫片”(分隔符):

<Separator Width="42"></Separator>

【讨论】:

以上是关于对齐堆栈面板中的项目?的主要内容,如果未能解决你的问题,请参考以下文章

相对面板/网格无法对齐项目模板选择器中的水平对齐方式

如何隐藏/显示堆栈面板中的项目?

WPF ListBox WPF XAML 内的顶部对齐

在中心的任一侧对齐 2 套/项目

左对齐的水平堆栈视图和顶部对齐的垂直堆栈视图

在 WPF 的堆栈面板中对齐左侧和右侧的控件