2010-10-19 28 views
4

我有一个窗口充满了包含3个元素的DockPanel,一个停靠在顶部的MenuBar,一个停靠在底部的StatusBar和一个填充主体的TabControl。WPF4在DockPanel中的TabControl/Grid隐藏StatusBar

至少,我希望TabControl填充正文。在视觉设计师中,TabControl和StatusBar并排排列而不是顶部&底部。当我运行应用程序时,TabControl展开以填充MenuBar下方的DockPanel,并且StatusBar消失。 (我猜它正从父窗口的可见画布上被推下。)

我试图设置垂直&水平对齐每this recommendation。 我试着在StatusBar上设置ZIndex。 我尝试使用堆栈面板(都停靠在DockPanel内并替换DockPanel)。所有无效:-(

以下是我用于呈现我的DockPanel的XAML的摘录。有什么我在做什么错的建议吗?有没有更好的方式来做到这一点比使用DockPanel ?

<DockPanel> 
    <Menu Name="_menu" Height="23" HorizontalAlignment="Stretch" VerticalAlignment="Top" DockPanel.Dock="Top"> 
     <MenuItem Header="_User Maintenance"> 
     </MenuItem> 
    </Menu> 
    <TabControl 
     x:Name="_panel" 
     ItemsSource="{Binding Path=AllTabs}" 
     Margin="0,0,0,0" 
     Visibility="{Binding Path=Visibility}" 
     DockPanel.Dock="Top" 
     HorizontalAlignment="Stretch" 
     VerticalAlignment="Stretch" 
     > 
    </TabControl> 
    <StatusBar Name="_statusBar" DockPanel.Dock="Bottom" Margin="0,0,0,0" VerticalAlignment="Bottom"> 
     <StatusBar.ItemsPanel> 
      <ItemsPanelTemplate> 
       <Grid> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="26"/> 
        </Grid.RowDefinitions> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="*"/> 
        </Grid.ColumnDefinitions> 
       </Grid> 
      </ItemsPanelTemplate> 
     </StatusBar.ItemsPanel> 
     <StatusBarItem Grid.Column="0" Grid.Row="0"> 
      <ProgressBar Name="_progressBar" Height="20" IsIndeterminate="True" Margin="4,0,4,0" VerticalAlignment="Top" Width="600"/> 
     </StatusBarItem> 
    </StatusBar> 
</DockPanel> 

编辑:

通过与双方的Horizo​​ntalAlignment & VerticalAlignment一起加入DockPanel.Dock = “评出的”到TabControl =“Stretch”,我可以让TabControl堆叠在StatusBar上方,而不是在视觉设计器中紧挨着它。现在,StatusBar只在运行时为我的一些TabItems消失。

我的TabControl数据绑定到一个ViewModel,它公开了一个UserControl列表。每个UserControl都包含自己的数据绑定DataGrid(通常还有一些其他控件)。在DataGrid仅显示几行的那些选项卡中,TabControl & TabItem只能包含UserGrid,而StatusBar只能在页面底部显示。在DataGrid显示许多行的那些选项卡上,TabControl伸展以填充窗口,以某种方式隐藏StatusBar。

万一有帮助,这是我的DataGrid定义:

<DataGrid 
     Name="_customerGrid" 
     Grid.Column="0" 
     Grid.ColumnSpan="3" 
     Grid.Row="1" 
     AutoGenerateColumns="False" 
     CanUserSortColumns="True" 
     ColumnHeaderStyle="{StaticResource columnHeaderStyle}" 
     HorizontalAlignment="Left" 
     ItemsSource="{Binding Path=AllCustomers}" 
     RowDetailsVisibilityMode="VisibleWhenSelected" 
     RowStyle="{StaticResource DataGridRowStyle}" 
     SelectionUnit="FullRow" 
     VerticalAlignment="Top"> 

谢谢!

回答

9

DockPanel取决于项目的添加顺序。在添加占用剩余空间的项目之前,必须首先添加停放的项目。在你的情况,你就得重新安排你的项目是这样的:

<DockPanel> 
    <Menu DockPanel.Dock="Top".../> 
    <StatusBar DockPanel.Dock="Bottom".../> 
    <TabControl/> 
</DockPanel> 
+0

,完美的工作!谢谢karmicpuppet。 – 2010-10-19 19:49:22

+1

DockPanel的这种行为非常混乱,但在逻辑上如此正确。谢谢,这个解决方案帮助了我! – digitguy 2015-02-14 20:06:35