2009-09-03 3 views
27

둘 이상의 자식을 WPF에 추가하면 StatusBar은 사용자 정의 할 수있는 옵션이 부족하여 레이아웃이 좋지 않습니다. 예를 들어,이 코드 :WPF 상태 표시 줄 레이아웃은 어떻게 사용자 정의합니까?

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

결과에서 다음 바로 "준비"에 대한 최대 압착 "설정"이후

enter image description here

이 이상적인 레이아웃이 아니다.

WPF StatusBar 컨트롤 레이아웃을 완전히 제어하려면 어떻게해야합니까?

답변

72

기본적으로 StatusBar은 자식을 배치하기 위해 DockPanel을 사용합니다. 이것은 하나의 항목에 대해서는 잘 작동하지만 둘 이상의 자식과 작업 할 때 일을 복잡하고 불편하게 만듭니다.

당신이 GridDockPanel을 교체 할 수 있습니다, 상태 표시 줄의 아이들의 위치를 ​​제어의 높은 수준을 얻으려면 : 들어

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> 

이 결과 더 심층적 인 토론은 내 블로그 게시물 here을 방문하십시오.

+36

@ Davidid : 우스꽝스럽게 생각하지 마십시오. Google Analytics가 내 블로그 게시물 중 가장 인기있는 블로그라고 말했기 때문에이 질문을 게시했습니다. 따라서 stackoverflow에 대한이 질문에 대한 직접적인 대답은 커뮤니티에 도움이됩니다. 내 블로그에는 광고가 없으므로 링크 유혹으로 무엇이든 얻을 수 없습니다. 그리고 나는 당신이 더 많은 정보를 원한다면 내 블로그에 방문 할 필요조차 없다는 충분한 정보를 내 대답에 넣었습니다. 이제 친절하게 가서 건설적인 것을 찾아야합니다. –

+0

고마워,이게 내가 찾던거야 –

+0

Mmmm, 누군가가 StatusBarItem 내부에 구분 기호를 넣으면 왜 그려지지 않는지 알겠습니까? 감사. –

11

사실, 켄트의 답변을 다음이 시도하고 그것을 잘 작동합니다 :

<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

나는 그것이 작동하지 않을 것이라고 제안하지는 않았지만 비논리적 인 순서에 있기 때문에, 그리고 레이아웃에 대한 통제력이 훨씬 약하기 때문에 "지저분하고 불편하다". * Set * 항목을 사용 가능한 너비의 절반만큼 사용하면 내 뜻을 알 수 있습니다. –

+6

DockPanel의 작동 원리를 이해한다면 가장 깨끗한 방법이라고 생각합니다. – Sonhja

+0

내 상태 표시 줄이 usercontrol에 있고 해당 usercontrol이 contentcontrol이 맨 아래에 도킹되어있는 contentcontrol로 표시되는 경우 작동하지 않는 것 같습니다. – juFo

1

를 그냥 우수한 답변을 읽는 사람들을위한 참조를 위해 나는를 달성하는 더 간단한 무언가를 제안하고 싶습니다 위 같은 결과. (DockPanel도 아니고 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> 

면책 조항 : 이것은 이전에 WPF로 시작할 때였습니다.

관련 문제