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

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

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

Я попытался установить вертикальное и горизонтальное выравнивание в соответствии с этой рекомендацией. Я попытался установить ZIndex на панели состояния. Я попытался использовать панель стека (как пристыкованную внутри 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>

Редактировать:

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

Мой 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">

Спасибо!

1 ответ

Решение

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

<DockPanel>
  <Menu DockPanel.Dock="Top".../>
  <StatusBar DockPanel.Dock="Bottom".../>
  <TabControl/>
</DockPanel>
Другие вопросы по тегам