2013-03-02 7 views
11

Ho un StatusBar con 4 elementi in esso sulla mia applicazione C#. Praticamente voglio far fluttuare gli ultimi due StatusBarItems a destra. L'ho provato impostandoli entrambi con HorizontalAlignment="Right", ma funzionava solo per l'ultimo elemento.Come allineare più StatusBarItems sul lato destro in XAML?

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

ho iniziato googling e mi si avvicinò con la seguente: http://kentb.blogspot.ch/2007/10/perfect-wpf-statusbar.html

È questo davvero l'unica soluzione per questo? O c'è un modo più semplice?

risposta

22

È possibile sfruttare il fatto che il valore predefinito ItemsPanel per StatusBar è DockPanel. Il DockPanel, per impostazione predefinita, tenta di riempire lo spazio rimanente con l'ultimo elemento. Quindi l'ultimo StatusBarItem aggiunto allo StatusBar riempirà il resto dello spazio. Per usufruire di questo, si può semplicemente nido StatusBarItems come questo:

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

Si noti che la HorizontalAlignment del 3 ° StatusBarItem è impostato su Right in modo che il suo contenuto sarà allineato a destra.

Naturalmente, non è necessario che l'articolo 3 e l'articolo 4 siano StatusBarItems, potrebbero essere altri controlli, ad esempio Buttons o ProgressBar, come ho dimostrato anche sopra. Lo StatusBarItem è semplicemente un contenitore che include gli articoli in un StatusBar, simile a come un ComboBoxItem avvolge gli elementi all'interno di uno ComboBox.

Il StatusBar compila automaticamente i contenuti in StatusBarItems, se non li si utilizza, quindi gli articoli 1 e 2 potrebbero altrettanto facilmente essere TextBoxes. Il motivo principale per utilizzare StatusBarItems è nel caso in cui si desideri controllare come funziona il StatusBarItem, come nel 3 ° StatusBarItem dove imposta manualmente lo HorizontalAlignment anziché fare affidamento sull'impostazione predefinita.

+1

provato troppo .. che purtroppo porta solo al seguente risultato: http://www.abload.de/img/02032013291y0h.png –

+0

Ah, scusa, al momento sono su un mac, quindi non posso testarlo. Esiste un 'HorizontalContentAlignment' su' StatusBar' che puoi impostare su 'Stretch'? Tornerò presto sul mio PC e lo proveremo. –

+1

np. e sì, c'è, comunque non ha avuto il trucco. –

10

Come indicato, il contenitore predefinito è DockPanel. Pertanto, è possibile impostare il numero di elementi necessario per DockPanel.Dock="Right". Assicurati che l'articolo fill sia l'ultimo.

<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

La tua soluzione sembra più pulita della risposta accettata – Ondra

+0

in modo migliore risposta quindi accettata –

0

è anche possibile impostare LastChildFill-false e quindi utilizzare DockPanel.Dock=Right proprio come la soluzione di cui sopra, senza doversi preoccupare l'ultimo elemento consumare tutto lo spazio:

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