C# WPF XAML 状态栏对齐
C# WPF XAML status bar alignment
启动时默认文本时一切正常before, but when I add song name, status is moving to right and status bar are outside area. after
<StatusBar Margin="0,730,0,0" DockPanel.Dock="Bottom" >
<WrapPanel >
<Label x:Name="tytulUtworu" HorizontalAlignment="Left">music: none </Label>
<Label x:Name="lblstatusPolaczenia" Margin="200,0,0,0" HorizontalAlignment="Center">status: disconnected</Label>
<ProgressBar Width="100" Height="15" Value="50" Margin="200,0,0,0" HorizontalAlignment="Right" />
</WrapPanel>
</StatusBar>
我该如何修复?
不要使用 WrapPanel
,请尝试使用 Grid
。这样,如果添加文本,您将拥有不会影响其他元素的固定列
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Label x:Name="tytulUtworu" HorizontalAlignment="Left">music: none </Label>
<Label x:Name="lblstatusPolaczenia" Grid.Column="1" HorizontalAlignment="Center">status: disconnected</Label>
<ProgressBar Width="100" Height="15" Value="50" Grid.Column="2" HorizontalAlignment="Right" />
</Grid>
您可以调整每个 ColumnDefinition 上的 Width
以获得更适合您使用的大小的列
首先,去掉边距。
他们没有帮助,他们只是让事情变得不那么明显,因为他们应该如何对齐。
根据您的边距值,我猜您希望状态栏在左侧显示标签,在中间显示另一个标签,在右侧显示进度条。
下面显示了如何使用第二个停靠面板执行此操作。
停靠面板在这里非常理想,因为它向子组件报告其大小的方式是一致的。
如果您想将此状态面板放置在另一个 DockPanel
上,在它按您的需要呈现之前,必须完成一些操作。
首先,您的主停靠面板必须有内容,否则边界面板将无法在正确的位置呈现。
其次,如果您设置了LastChildFill=True
,您必须将您的主要内容添加到最后一项。
如果您设置主要内容然后添加您的状态栏,即使您已将其停靠在底部,它仍会尝试填充面板。
我在测试后更新了代码片段(我的第一次尝试是直接输入 SO,抱歉,它没有用)。
<StatusBar DockPanel.Dock="Bottom"
Name="statusBar"
Height="50"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch">
<DockPanel LastChildFill="True"
Width="{Binding ActualWidth, ElementName=statusBar, Mode=OneWay}">
<ProgressBar DockPanel.Dock="Right"
Width="100"
Value="50" />
<Label x:Name="tytulUtworu"
DockPanel.Dock="Left"
ContentStringFormat="music: {0}"
Content="none" />
<Label x:Name="lblstatusPolaczenia"
HorizontalContentAlignment="Center"
Content="disconnected"
ContentStringFormat="status: {0}" />
</DockPanel>
</StatusBar>
启动时默认文本时一切正常before, but when I add song name, status is moving to right and status bar are outside area. after
<StatusBar Margin="0,730,0,0" DockPanel.Dock="Bottom" >
<WrapPanel >
<Label x:Name="tytulUtworu" HorizontalAlignment="Left">music: none </Label>
<Label x:Name="lblstatusPolaczenia" Margin="200,0,0,0" HorizontalAlignment="Center">status: disconnected</Label>
<ProgressBar Width="100" Height="15" Value="50" Margin="200,0,0,0" HorizontalAlignment="Right" />
</WrapPanel>
</StatusBar>
我该如何修复?
不要使用 WrapPanel
,请尝试使用 Grid
。这样,如果添加文本,您将拥有不会影响其他元素的固定列
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Label x:Name="tytulUtworu" HorizontalAlignment="Left">music: none </Label>
<Label x:Name="lblstatusPolaczenia" Grid.Column="1" HorizontalAlignment="Center">status: disconnected</Label>
<ProgressBar Width="100" Height="15" Value="50" Grid.Column="2" HorizontalAlignment="Right" />
</Grid>
您可以调整每个 ColumnDefinition 上的 Width
以获得更适合您使用的大小的列
首先,去掉边距。 他们没有帮助,他们只是让事情变得不那么明显,因为他们应该如何对齐。
根据您的边距值,我猜您希望状态栏在左侧显示标签,在中间显示另一个标签,在右侧显示进度条。
下面显示了如何使用第二个停靠面板执行此操作。 停靠面板在这里非常理想,因为它向子组件报告其大小的方式是一致的。
如果您想将此状态面板放置在另一个 DockPanel
上,在它按您的需要呈现之前,必须完成一些操作。
首先,您的主停靠面板必须有内容,否则边界面板将无法在正确的位置呈现。
其次,如果您设置了LastChildFill=True
,您必须将您的主要内容添加到最后一项。
如果您设置主要内容然后添加您的状态栏,即使您已将其停靠在底部,它仍会尝试填充面板。
我在测试后更新了代码片段(我的第一次尝试是直接输入 SO,抱歉,它没有用)。
<StatusBar DockPanel.Dock="Bottom"
Name="statusBar"
Height="50"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch">
<DockPanel LastChildFill="True"
Width="{Binding ActualWidth, ElementName=statusBar, Mode=OneWay}">
<ProgressBar DockPanel.Dock="Right"
Width="100"
Value="50" />
<Label x:Name="tytulUtworu"
DockPanel.Dock="Left"
ContentStringFormat="music: {0}"
Content="none" />
<Label x:Name="lblstatusPolaczenia"
HorizontalContentAlignment="Center"
Content="disconnected"
ContentStringFormat="status: {0}" />
</DockPanel>
</StatusBar>