2013-03-02 69 views
11

我在我的C#應用​​程序中有一個StatusBar,裏面有4個項目。我基本上想把最後兩個StatusBarItems浮動到右邊。我已經通過將它們設置爲HorizontalAlignment="Right"來嘗試它,但是這隻對最後一項起作用。如何將多個StatusBarItem對齊到XAML的右側?

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

我開始google搜索,我想出了以下內容: http://kentb.blogspot.ch/2007/10/perfect-wpf-statusbar.html

這真的是這樣做的唯一的解決辦法?還是有更簡單的方法?

回答

22

您可以充分利用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的工作方式,例如在手動設置HorizontalAlignment的第3個StatusBarItem中,而不是依賴於默認設置。

+1

試過太..不幸只是導致以下結果:http://www.abload.de/img/02032013291y0h.png – 2013-03-02 17:17:47

+0

啊,對不起,我現在在Mac上,所以無法測試這個。在StatusBar上是否有'Horizo​​ntalContentAlignment',你可以設置爲'Stretch'?我會盡快回到我的電腦並進行測試。 – 2013-03-02 18:53:44

+1

np。是的,但是,這也沒有把戲。 – 2013-03-02 19:01:33

10

如上所述,默認容器是DockPanel。因此,您可以根據需要設置多達DockPanel.Dock="Right"。只要確保fill項目是最後一個。

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

您的解決方案看起來比接受的答案 – Ondra 2014-07-31 07:53:00

+0

方式更好的回答更清潔,然後接受一個 – 2016-03-10 09:32:07

0

您還可以設置LastChildFillfalse然後用DockPanel.Dock=Right就像上面的解決方案,而不必擔心最後一個項目佔用所有空間:

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