2009-09-03 16 views
27

WPF StatusBar'a birden fazla alt öğe eklenmesi, çok az düzenleme seçeneği ile birlikte kötü yerleşime neden olur. Örneğin, bu kod:WPF StatusBar düzenini nasıl özelleştiririm?

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

Sonuçlar içinde: sağ "Hazır" karşı sıkılmış "ayarlayın" beri

enter image description here

Bu ideal düzen, değil.

WPF StatusBar denetiminin düzeni üzerinde tam denetime nasıl sahip olurum?

cevap

72

Varsayılan olarak, StatusBar, çocuklarını konumlandırmak için DockPanel'u kullanır. Bu, bir öğe için iyi çalışır, ancak birden fazla çocukla çalışırken, işleri karışık ve rahatsız edici hale getirme eğilimindedir.

Bir Grid için DockPanel takas olabilir, durum çubuğu çocukların konumlandırma üzerinde kontrol yüksek düzeyde kazanmak için: For

enter image description here

:

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

Bu sonuçlanır daha derinlemesine bir tartışma, lütfen blog yazımı here'u ziyaret edin.

+36

@David: gülünç olma. Bu soruyu yayınladım çünkü google analitiği benim en popüler blog gönderimlerimden biri olduğunu söyledi, bu nedenle stackoverflow ile ilgili bu soruya doğrudan yanıt vermek topluluğa yararlı olacaktır. Blogumda reklamlarım yok, bu yüzden bağlantı yeminden herhangi bir şey elde etmek için durmayın. Ve daha fazla bilgi istemediğiniz sürece, blogumun adresini ziyaret etmenize bile gerek kalmayacak kadar fazla bilgi koydum. Şimdi nazikçe yap ve yapıcı bir şey bul. –

+0

Teşekkürler, bu ben –

+0

Mmmm için aradığım şeydir, birisi bir StatusBarItem içine bir ayırıcı koyarsam neden boyanmadığını bilir? Teşekkürler. –

11

Aslında Kent'in cevap şu bunu denedim ve gayet iyi çalışıyor:

<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

Bunun işe yaramayacağını önermedim, ama bu “dağınık ve sakıncalı” çünkü mantıksız bir düzende ve düzen üzerinde çok daha az kontrolünüz olduğu için. * Set * öğesini mevcut genişliğin yarısına kadar çıkarmayı deneyin ve ne demek istediğimi göreceksiniz. –

+6

Bir DockPanel'in nasıl çalıştığını anlarsanız, bunu yapmanın en temiz yolu budur. – Sonhja

+0

, statusbar'ım bir usercontrol içinde çalışıyorsa ve usercontrol, contentcontrolün aşağıya yerleştirildiği bir contentcontrol olarak gösteriliyorsa, işe yaramaz. – juFo

1

Sadece mükemmel cevaplar okuyanlar için referans uğruna ben ulaşmasını daha da basit bir şey önermek istiyorum yukarıda aynı sonuçlar. (Ne DockPanel ne de StatusBar'u kullanarak).

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

Yasal Uyarı: Bu, WPF ile başladığım bir zamanda uzun zaman önceydi.