如何在 XAML 中将多个 StatusBarItems 对齐到右侧?

Posted

技术标签:

【中文标题】如何在 XAML 中将多个 StatusBarItems 对齐到右侧?【英文标题】:How to align multiple StatusBarItems to the right side in XAML? 【发布时间】:2013-02-17 02:18:31 【问题描述】:

我的 C# 应用程序中有一个 StatusBar,其中包含 4 个项目。我基本上想将最后两个StatusBarItems 浮动到右侧。我已经尝试将它们都设置为HorizontalAlignment="Right",但这仅适用于最后一项。

<StatusBar Name="statusBar1" Height="23" HorizontalAlignment="Stretch"
        VerticalAlignment="Bottom">
    <StatusBarItem />
    <StatusBarItem />
    <StatusBarItem HorizontalAlignment="Right" />
    <StatusBarItem HorizontalAlignment="Right" />
</StatusBar>

我开始用谷歌搜索,我想出了以下网址:

Blogspot

这真的是唯一的解决方案,还是有更简单的方法?

【问题讨论】:

【参考方案1】:

您可以利用StatusBar 的默认ItemsPanelDockPanel 这一事实。默认情况下,DockPanel 将尝试用最后一项填充剩余空间。因此,您添加到StatusBar 的最后一个StatusBarItem 将填充剩余的空间。要利用这一点,您可以像这样简单地嵌套StatusBarItems

<StatusBar Name="statusBar1" Height="23" HorizontalAlignment="Stretch" VerticalAlignment="Bottom">
  <StatusBarItem Content="Item 1"/>
  <StatusBarItem Content="Item 2" />
  <StatusBarItem HorizontalAlignment="Right">
    <StackPanel Orientation="Horizontal">
      <StatusBarItem  Content="Item 3"/>
      <StatusBarItem Content="Item 4"/>
      <ProgressBar Height="15" Width="50" IsIndeterminate="True" Margin="5,0"/>
    </StackPanel>
  </StatusBarItem>
</StatusBar>

请注意,第三个StatusBarItemHorizontalAlignment 设置为Right,以便其内容右对齐。

当然,您不必将第 3 项和第 4 项设为 StatusBarItems,它们可以是其他控件,例如 ButtonsProgressBar,正如我在上面演示的那样。 StatusBarItem 只是一个将项目包装在StatusBar 中的容器,类似于ComboBoxItem 将项目包装在ComboBox 中的方式。

StatusBar 将自动将其内容包装在 StatusBarItems 中,如果您不使用它们,因此项目 1 和 2 可以很容易地成为 TextBoxes。使用StatusBarItems 的主要原因是您想要控制StatusBarItem 的工作方式,例如在第三个StatusBarItem 中手动设置HorizontalAlignment,而不是依赖默认值。

【讨论】:

也试过了。不幸的是,这只会导致以下结果:abload.de/img/02032013291y0h.png 啊,抱歉,我现在在 Mac 上,所以无法测试。 StatusBar 上是否有一个HorizontalContentAlignment 可以设置为Stretch?我很快就会回到我的电脑上进行测试。 np。是的,有,但这也不是诀窍。 好的,既然我有时间在我的 PC 上进行测试,我已经更新了答案以完成我相信您正在寻找的内容。希望这能解决您的问题。 @BrianS 很棒的提示,但是当每个项目之间有分隔符时它不起作用:(【参考方案2】:

如前所述,默认容器是DockPanel。因此,您可以根据需要将任意数量的项目设置为DockPanel.Dock="Right"。请确保 fill 项目位于最后。

<StatusBar>
    <StatusBarItem DockPanel.Dock="Right">
        <Slider Width="100" />
    </StatusBarItem>
    <StatusBarItem DockPanel.Dock="Right">
        <Label>Zoom: 100 %</Label>
    </StatusBarItem>
    <StatusBarItem>
        <TextBlock>Ready</TextBlock>
    </StatusBarItem>
</StatusBar>

【讨论】:

您的解决方案看起来比接受的答案更干净 Protip:当你像这样停靠多个StatusBarItem 时,它们的顺序会相反(因为最后一个添加的会推动左边的其余部分)。为了以最少的努力避免这种情况,请将右侧停靠的StatusBarItem 的内容设置为水平方向的StackPanel【参考方案3】:

您也可以将LastChildFill 设置为false,然后像上面的解决方案一样使用DockPanel.Dock=Right,而不必担心最后一项会占用所有空间:

<StatusBar>
  <StatusBar.ItemsPanel>
    <ItemsPanelTemplate>
      <DockPanel LastChildFill="False" />
    </ItemsPanelTemplate>
  </StatusBar.ItemsPanel>
</StatusBar>

【讨论】:

【参考方案4】:

实现此目的的另一种有趣方法是将StatusBar 的默认面板替换为Grid,这将使您可以更好地控制项目的布局。

<StatusBar Height="30">
  <StatusBar.ItemsPanel>
    <ItemsPanelTemplate>
      <Grid>
        <Grid.ColumnDefinitions>
          <ColumnDefinition Width="*" />
          <ColumnDefinition Width="Auto" />
          <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>
      </Grid>
    </ItemsPanelTemplate>
  </StatusBar.ItemsPanel>

  <StatusBarItem Grid.Column="0">
    <TextBlock Text="Binding ProgressMessage, Mode=OneWay" />
  </StatusBarItem>

  <StatusBarItem Grid.Column="1">
    <ProgressBar Value="Binding ProgressValue, Mode=OneWay" Width="100" Height="10" />
  </StatusBarItem>

  <StatusBarItem Grid.Column="2">
    <Ellipse Width="12" Height="12" Stroke="Gray" Fill="Red" />
  </StatusBarItem>
</StatusBar>

【讨论】:

以上是关于如何在 XAML 中将多个 StatusBarItems 对齐到右侧?的主要内容,如果未能解决你的问题,请参考以下文章

我如何在XAML中将其复选框水平居中?

如何在我的XAML代码中将C#中的标签添加到网格中?

如何在一个 xaml 页面中使用多个用户控件?

如何在 C# 标记中将 Frame 的高度设置为等于其宽度?

在 Xamarin.Forms 上的 XAML 中将 BindingContext 设置为 ViewModel

在Xaml / Wpf中将ListBoxItems鼠标更改为样式