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

我有以下密码:

<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>
...

单选按钮应该放在堆栈面板的左侧(我删除了一些按钮,因为它们没有把示例弄得乱七八糟) ,标签(暂时放在嵌套的堆栈面板中)应该放在右侧。

我已经尝试了很多组合的比对,但我不能得到正确的方面的标签。 为了达到这个目的,我应该加些什么呢?

90320 次浏览

因为您已经将 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>

只是不要使用 StackPanelStackPanels 堆栈。出于显而易见的原因,它们不允许在堆栈的方向上对齐。使用 Grid,列定义如下:

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

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

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

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

可能的问题是,如果没有额外的处理,这两者可能会相互重叠。

User@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>
...

以嵌套的方式使用 Stackpanel 方向类型,如示例所示。网格宽度设置为父宽度,以实现全宽。

<StackPanel x:Name="stackBlah" Orientation="Vertical">
<StackPanel Orientation="Horizontal">
<Grid Width="{Binding ActualWidth, ElementName=stackBlah}" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
</Grid.RowDefinitions>


<StackPanel Grid.Column="0" HorizontalAlignment="Left" >
<Button Content="Some button" />
</StackPanel>
<StackPanel Grid.Column="1" HorizontalAlignment="Right">
<ToggleSwitch Header="Some toggle" AutomationProperties.Name="ToggleNotifications"/>
</StackPanel>
</Grid>
</StackPanel>
</StackPanel>