WPF4 TabControl / Grid в DockPanel скрывает StatusBar - PullRequest
4 голосов
/ 19 октября 2010

У меня есть окно, заполненное 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>

Edit:

Добавив 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 Ответ

9 голосов
/ 19 октября 2010

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

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