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


71

我有以下代码:

<DockPanel>
    <StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
        <RadioButton Content="_Programs" 
                    IsChecked="{Binding Path=ProgramBanksSelected}" IsEnabled="{Binding Path=ProgramsEnabled}" Margin="8" />
        <StackPanel>
            <Label Content="Master" Height="28" Name="MasterFileStatus" VerticalContentAlignment="Center"/>
        </StackPanel>
    </StackPanel>
    ...

单选按钮应放置在堆栈面板的左侧(我删除了一些按钮,以免使示例不混乱),标签(我暂时将其放置在嵌套的StackPanel中)应该在右侧。

我已经尝试过很多对齐方式的组合,但是无法在右侧获得标签。我应该添加些什么来做到这一点?


2
您真的不能要求太多的堆叠面板,只要您想要任何一种半先进的结构就可以用于网格
Kevin DiTraglia,2012年

7
正确的答案是使用DockPanel中作为这篇文章: stackoverflow.com/questions/2023201/...
PASX

Answers:


94

只要不使用StackPanelStackPanels 堆栈。由于明显的原因,它们确实不允许沿其堆叠方向对齐。使用Grid带有列定义的,如下所示:

<Grid.ColumnDefinitions>
    <ColumnDefinition Width="Auto" />
    <ColumnDefinition Width="*" />
    <ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>

我想这会行得通,但是我将等待更多答案,因为有了StackPanels,我的好处是,当屏幕变小时,项目会包裹起来,而当我使用网格时,这些物品会散开。
2012年

2
@MichelKeijzers:如果您想要类似的东西,则可能需要实现自己的面板。
HB

感谢您的回答...我不知道我是否更喜欢您的解决方案,以防止在这种情况下无法正确对齐,但这超出了我提出的问题。
Michel Keijzers,2012年

工作良好。谢谢!
Knasterbax

感谢小费。我把所有的ColumnDefinition Width =“ *”都平均分配了
Mrinmoy

41

即使这很旧,如果有人像我一样遇到这种情况,这是一个简单的解决方案。

制作一个新网格,并在该网格内放置两个具有不同水平对齐方式的堆叠面板。

<Grid>
    <StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
        <!--Code here-->
    </StackPanel>
    <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
        <!--Code here-->
    </StackPanel>
</Grid>

可能的问题是,现在如果不进行额外的处理,两者可能会相互重叠。


这是一个很棒的解决方案。StackPanels如果每个面板只有一个孩子,则实际上并不需要。
乔纳森·图兹曼

5

当您将StackPanel的方向设置为时Horizontal,该HorizontalAlignment属性将不适用于子元素。StackPanel如果需要其他控件,可以保留,尽管我建议切换到Grid(其中包括)构建所需的布局。

此外,还可Grid让您控制每列的​​实际宽度:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="50" />
        <ColumnDefinition Width="150" />
    </Grid.ColumnDefinitions>

    <RadioButton
        Grid.Column="0"
        ...
    />

    <Label
        Grid.Column="1"
        ...
    />
</Grid>


1
您的第一个示例将不起作用,它们会在空间允许的情况下仍然水平堆叠,并且对齐方式不会执行任何操作。
凯文·迪特里亚

@KDiTraglia是的,刚刚经过测试-您是对的;何时Orientation="Horizontal",它忽略了HorizontalAlignment; 现在删除,谢谢=]
newfurniturey 2012年

4

用户@pasx是正确的。您应该使用DockPanel并将RadioButton停靠在左侧,并将带有标签的StackPanel停靠在右侧。

<DockPanel>

    <DockPanel 
        DockPanel.Dock="Top" 
        LastChildFill="False" >

        <RadioButton 
            DockPanel.Dock="Left" 
            Content="_Programs" 
            IsChecked="{Binding Path=ProgramBanksSelected}"
            IsEnabled="{Binding Path=ProgramsEnabled}" 
            Margin="8" />

        <StackPanel
            DockPanel.Dock="Right">

            <Label 
                Content="Master" 
                Height="28" 
                Name="MasterFileStatus" 
                VerticalContentAlignment="Center"/>

        </StackPanel>

    </DockPanel>
    ...
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.