WPF4 TabControl / Grid в DockPanel скрывает StatusBar

У меня есть окно, заполненное DockPanel, содержащим 3 элемента: MenuBar, закрепленный вверху, StatusBar, закрепленный внизу, и TabControl, заполняющий тело.

По крайней мере, хотелось бы, чтобы TabControl заполнил тело. В визуальном конструкторе TabControl и StatusBar расположены рядом, а не сверху и снизу. Когда я запускаю приложение, TabControl расширяется, заполняя DockPanel под MenuBar, а StatusBar исчезает. (Я предполагаю, что он отталкивается от видимого холста родительского окна.)

Я попытался установить вертикальное и горизонтальное выравнивание в соответствии с этой рекомендацией . Я попытался установить ZIndex в StatusBar. Я попытался использовать панель стека (обе закреплены внутри DockPanel и заменили DockPanel). Все без толку :-(

Ниже приводится отрывок из XAML, который я использую для рендеринга DockPanel. Есть предложения о том, что я делаю неправильно? Есть ли лучший способ сделать это, чем использовать 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>

Edit:

Добавив DockPanel.Dock = "Top" в TabControl вместе с HorizontalAlignment и VerticalAlignment = "Stretch", я смог заставить TabControl складываться над StatusBar, а не рядом с ним на визуальном уровне. дизайнер. Теперь StatusBar исчезает только во время выполнения для некоторых из моих TabItems.

My TabControl привязан к ViewModel, который предоставляет список UserControls. Каждый 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">

Спасибо!


person Paul Chavez    schedule 19.10.2010    source источник


Ответы (1)


DockPanel зависит от порядка добавления элементов. Вам нужно будет сначала добавить закрепленные элементы, прежде чем добавлять элемент, который занимает оставшееся место. В вашем случае вам просто нужно переставить свои предметы примерно так:

<DockPanel>
  <Menu DockPanel.Dock="Top".../>
  <StatusBar DockPanel.Dock="Bottom".../>
  <TabControl/>
</DockPanel>
person ASanch    schedule 19.10.2010
comment
Такое поведение DockPanel так запутанно, но логически так правильно. Спасибо, мне помогло это решение! - person digitguy; 14.02.2015