18

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

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

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

博客点

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

4

4 回答 4

36

您可以利用默认ItemsPanelStatusBarDockPanel. 默认情况下DockPanel,遗嘱会尝试用最后一项填充剩余空间。因此,StatusBarItem您添加到的最后一个StatusBar将填充剩余的空间。要利用这一点,您可以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>

请注意,HorizontalAlignment将 3rdStatusBarItem设置为,Right以便其内容右对齐。

当然,您不必拥有 Item 3 和 Item 4 be StatusBarItems,它们也可以是其他控件,例如ButtonsProgressBar我在上面演示的。StatusBarItem只是一个将项目包装在 a 中的容器,StatusBar类似于 aComboBoxItem将项目包装在 a 中的方式ComboBox

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

于 2013-03-02T17:13:33.983 回答
23

如前所述,默认容器是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>
于 2013-03-24T15:46:09.540 回答
3

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

<StatusBar>
  <StatusBar.ItemsPanel>
    <ItemsPanelTemplate>
      <DockPanel LastChildFill="False" />
    </ItemsPanelTemplate>
  </StatusBar.ItemsPanel>
</StatusBar>
于 2015-01-19T15:56:35.763 回答
2

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

<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>
于 2018-05-12T03:49:51.027 回答