2009-09-03 52 views
27

Thêm nhiều hơn một trẻ vào một kết quả WPF StatusBar bố cục kém với ít tùy chọn để tùy chỉnh. Ví dụ, đoạn mã này:Làm cách nào để tùy chỉnh bố cục WPF 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> 

Kết quả trong:

enter image description here

Đây không phải là cách bố trí lý tưởng, kể từ khi "đặt" được ép phải lên chống lại "Sẵn sàng".

Làm cách nào để kiểm soát toàn bộ bố cục của điều khiển WPF StatusBar?

Trả lời

72

Theo mặc định, StatusBar sử dụng số DockPanel để định vị con của nó. Điều này làm việc tốt cho một mục, nhưng có xu hướng làm cho mọi thứ lộn xộn và bất tiện khi làm việc với nhiều hơn một đứa trẻ.

Để đạt được một mức độ cao về kiểm soát đối với vị trí của trẻ em trên thanh trạng thái, bạn có thể trao đổi trên các DockPanel cho một 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> 

Điều này dẫn đến:

enter image description here

Đối thảo luận sâu hơn, vui lòng truy cập bài đăng blog của tôi here.

+36

@David: đừng lố bịch. Tôi đã đăng câu hỏi này bởi vì google analytics đã nói với tôi rằng đó là một trong những bài đăng blog phổ biến nhất của tôi, do đó, có câu trả lời trực tiếp cho câu hỏi này trên stackoverflow sẽ có lợi cho cộng đồng. Tôi không có quảng cáo trên blog của tôi vì vậy không đứng để đạt được bất cứ điều gì từ liên kết baiting. Và tôi đặt nhiều hơn đủ thông tin trong câu trả lời của tôi rằng bạn thậm chí không cần phải truy cập vào blog của tôi trừ khi bạn muốn biết thêm thông tin. Bây giờ vui lòng đi và tìm một cái gì đó mang tính xây dựng để làm. –

+0

Cảm ơn, đây là những gì tôi đang tìm kiếm –

+0

Mmmm, ai đó biết lý do tại sao nếu tôi đặt một dấu phân cách bên trong một StatusBarItem nó không được sơn? Cảm ơn. –

11

Trên thực tế, sau bài trả lời Kent tôi đã cố gắng này và nó hoạt động tốt:

<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

Tôi đã không đề nghị nó sẽ không hoạt động, nhưng đó là "lộn xộn và bất tiện" bởi vì nó trong một trật tự phi lý, và bởi vì bạn có ít kiểm soát bố trí. Hãy thử làm cho * Set * mục chiếm một nửa chiều rộng có sẵn và bạn sẽ thấy những gì tôi có ý nghĩa. –

+6

Tôi nghĩ rằng nếu bạn hiểu cách DockPanel hoạt động, đây là cách tốt nhất để làm điều đó. – Sonhja

+0

dường như không hoạt động nếu thanh trạng thái của tôi nằm trong một usercontrol và usercontrol đang được hiển thị dưới dạng một contentcontrol nơi contentcontrol được gắn vào đáy. – juFo

1

Chỉ vì lợi ích của tài liệu tham khảo cho những người đọc các câu trả lời tuyệt vời trên, chúng tôi muốn đề nghị một cái gì đó thậm chí đơn giản hơn là đạt được cùng một kết quả. (Sử dụng không DockPanel cũng không StatusBar).

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

Tuyên bố từ chối: Điều này đã lâu rồi vào thời điểm tôi bắt đầu với WPF.

Các vấn đề liên quan