2009-09-03 10 views
27

Dodanie więcej niż jednego dziecka do WPF StatusBar skutkuje słabym układem z niewielką opcją dostosowywania. Na przykład, ten kod:Jak dostosować układ WPB StatusBar?

<Window x:Class="StatusBar.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <DockPanel> 
     <StatusBar DockPanel.Dock="Bottom"> 
      <StatusBarItem> 
       <TextBlock>Ready</TextBlock> 
      </StatusBarItem> 
      <StatusBarItem> 
       <TextBlock>Set</TextBlock> 
      </StatusBarItem> 
     </StatusBar> 

     <Label>Main Content</Label> 
    </DockPanel> 
</Window> 

Wyniki w:

enter image description here

nie jest to idealny układ, ponieważ "set" wyciska aż przeciwko "Ready".

Jak uzyskać pełną kontrolę nad układem sterowania WPF StatusBar?

Odpowiedz

72

Domyślnie StatusBar używa DockPanel aby umieścić swoje dzieci. Działa to dobrze w przypadku jednego produktu, ale sprawia, że ​​rzeczy stają się nieprzyjemne i niewygodne w przypadku pracy z więcej niż jednym dzieckiem.

Aby uzyskać wysoki poziom kontroli nad pozycjonowaniem dzieci pasku stanu można zamienić na zewnątrz DockPanel dla Grid:

<Window x:Class="StatusBar.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <DockPanel> 
     <StatusBar DockPanel.Dock="Bottom"> 
      <StatusBar.ItemsPanel> 
       <ItemsPanelTemplate> 
        <Grid> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="*"/> 
         </Grid.RowDefinitions> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="4*"/> 
          <ColumnDefinition Width="Auto"/> 
          <ColumnDefinition Width="*"/> 
          <ColumnDefinition Width="*"/> 
         </Grid.ColumnDefinitions> 
        </Grid> 
       </ItemsPanelTemplate> 
      </StatusBar.ItemsPanel> 
      <StatusBarItem> 
       <TextBlock>Ready</TextBlock> 
      </StatusBarItem> 
      <StatusBarItem Grid.Column="1"> 
       <ProgressBar Value="30" Width="80" Height="18"/> 
      </StatusBarItem> 
      <StatusBarItem Grid.Column="2"> 
       <TextBlock>Set</TextBlock> 
      </StatusBarItem> 
      <StatusBarItem Grid.Column="3"> 
       <TextBlock>Go!</TextBlock> 
      </StatusBarItem> 
     </StatusBar> 

     <Label>Main Content</Label> 
    </DockPanel> 
</Window> 

Wynika to z:

enter image description here

Dla bardziej dogłębną dyskusję, odwiedź mój blog: here.

+36

@ David: nie bądź niedorzeczny. Wysłałem to pytanie, ponieważ google analytics powiedział mi, że był to jeden z moich najpopularniejszych postów na blogu, więc posiadanie bezpośredniej odpowiedzi na to pytanie na stackoverflow byłoby korzystne dla społeczności. Nie mam reklam na moim blogu, więc nie chcę nic zyskać na powiązaniu z linkami. I dodałem w odpowiedzi wystarczającą ilość informacji, że nie musisz nawet odwiedzać mojego bloga, jeśli nie chcesz więcej informacji. Teraz idź i znajdź coś konstruktywnego do zrobienia. –

+0

Dzięki, to właśnie szukałem –

+0

Mmmm, ktoś wie, dlaczego wstawię separator do StatusBarItem, który nie zostanie pomalowany? Dzięki. –

11

Właściwie następującą odpowiedź hrabstwie Kent Próbowałem to i to działa dobrze:

<StatusBar> 
    <StatusBarItem DockPanel.Dock="Right"> 
     <TextBlock>Go!</TextBlock> 
    </StatusBarItem> 
    <StatusBarItem DockPanel.Dock="Right"> 
     <TextBlock>Set</TextBlock> 
    </StatusBarItem> 
    <StatusBarItem DockPanel.Dock="Right"> 
     <ProgressBar Value="30" Width="80" Height="18"/> 
    </StatusBarItem> 
    <!-- Fill last child is true by default --> 
    <StatusBarItem> 
     <TextBlock>Ready</TextBlock> 
    </StatusBarItem> 
</StatusBar> 
+0

Nie sugerowałem, że to nie zadziała, ale że jest "niechlujny i niewygodny", ponieważ jest w nielogicznej kolejności, a ponieważ masz mniej kontroli nad układem. Spróbuj sprawić, by element * Set * zajmował połowę dostępnej szerokości, a zobaczysz, co mam na myśli. –

+6

Myślę, że jeśli rozumiesz, jak działa DockPanel, jest to najczystszy sposób na zrobienie tego. – Sonhja

+0

wydaje się nie działać, jeśli mój pasek stanu znajduje się w kontrolerze użytkownika, a kontrola użytkownika jest pokazywana jako kontrola treści, w której treść jest dokowania na dole. – juFo

1

Właśnie ze względu na odniesienie do tych przeczytaniu doskonałe odpowiedzi powyżej chciałbym zaproponować coś jeszcze prostsze, że osiąga takie same wyniki. (Nie używa się ani DockPanel ani).

<Window> 
. 
. 

<Grid Margin="2"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*"/> 
      <RowDefinition Height="15"/> 
     </Grid.RowDefinitions> 

     <SomeContainer Grid.Row="0" /> <!-- Main Content.. --> 

     <Grid Grid.Row="1"> 
      <!-- Status bar laid out here (using similar approach)--> 
     </Grid> 
</Window> 

Nota prawna: To było dawno temu w momencie, gdy zaczynałem z WPF.