Как мне получить DataGrid для заполнения TabItem

у меня следующий макет

<DockPanel>
    <StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Margin="10">
        ...
    </StackPanel>
    <TabControl>
        <TabItem Header="Summary">
            <DataGrid   ItemsSource="{Binding SummaryData}"
                        CanUserAddRows="False"
                        CanUserDeleteRows="False"
                        IsReadOnly="True"
                        HeadersVisibility="Column"
                        CanUserSortColumns="False" />
        </TabItem>
        ...
    </TabControl>
</DockPanel>

Без DataGrid TabControl и TabItems идеально заполняют остальную часть контейнера, но когда я добавляю DataGrid, он растягивает все, чтобы отобразить все строки и столбцы.

РЕДАКТИРОВАТЬ: больше ясности

Я хочу, чтобы DataGrid растягивался по вертикали и горизонтали, чтобы заполнить TabItem. Если ему нужно больше места, я бы хотел, чтобы появились полосы прокрутки DataGrid.


person Nick Strupat    schedule 18.10.2012    source источник
comment
что именно вы хотите растянуть/не растянуть?   -  person Sisyphe    schedule 18.10.2012
comment
Ой, извини. Я пытаюсь заставить DataGrid растянуться, чтобы заполнить TabItem, не растягивая TabItem.   -  person Nick Strupat    schedule 18.10.2012
comment
Я имею в виду вертикальный, но оба были бы лучше. Спасибо за ваше терпение.   -  person Nick Strupat    schedule 18.10.2012
comment
Вы пытались установить HorizontalAlignment и VerticalAlignment вашего DataGrid на Stretch, чтобы он растягивался/сжимался, чтобы заполнить всю доступную область? Также есть свойства для HorizontalScrollBarVisibility и VerticalScrollBarVisibility, которые вы можете установить на Auto, чтобы убедиться, что полосы прокрутки отображаются по мере необходимости.   -  person Rachel    schedule 18.10.2012
comment
Насколько я понял, но я не так хорош в английском, он наоборот интересуется :)   -  person Sisyphe    schedule 18.10.2012
comment
@ Рэйчел Да, я пробовала то, то и другое. Я тоже пытался привязать к TabItem ActualHeight   -  person Nick Strupat    schedule 18.10.2012
comment
Не могли бы вы получить как изображение того, что вы хотите?   -  person Sisyphe    schedule 18.10.2012


Ответы (3)


У меня есть следующее, чтобы делать то, что я хочу.

<TabItem Header="Summary" >
    <Grid x:Name="SummaryGrid">
        <DataGrid Height="{Binding ElementName=SummaryGrid, Path=ActualHeight}"
                  ItemsSource="{Binding SummaryData}"
                  CanUserAddRows="False"
                  CanUserDeleteRows="False"
                  IsReadOnly="True"
                  HeadersVisibility="Column"
                  CanUserSortColumns="False" />
    </Grid>
</TabItem>

Это работает, пока я не изменю размер родительской панели. ActualHeight не обновляется. Хотя на данный момент этого достаточно.

person Nick Strupat    schedule 18.10.2012

Это то поведение, которое вы ищете?

<DockPanel>
    <StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Margin="10">
        <TextBox Text="tttt" />
    </StackPanel>
    <TabControl VerticalAlignment="Top" HorizontalAlignment="Left">
        <TabItem Header="Summary">
            <DataGrid CanUserAddRows="False"
                      CanUserDeleteRows="False"
                      IsReadOnly="True"
                      HeadersVisibility="Column"
                      CanUserSortColumns="False">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Column 1" Binding="{Binding}"></DataGridTextColumn>
                </DataGrid.Columns>
                <sys:String>Entry</sys:String>
            </DataGrid>
        </TabItem>
    </TabControl>
</DockPanel>

Установив эти выравнивания, вы растянете DataGrid на доступное пространство в TabItem. но я не уверен, что это именно то, что вы ищете.

Вы можете поиграть с VerticalAlignment и HorizontalAlignment, чтобы получить именно то, что вам нужно. (установите его в Top/Left/Stretch, чтобы получить только TabItem, или DataGrid, или оба растягиваются так, как вы хотите)

person Sisyphe    schedule 18.10.2012

Принятый ответ - это обходной путь...

Элемент управления вкладками будет расширяться внутри своего контейнера вместе с любыми элементами вкладок. Делая сетку своим контейнером и указывая размер строки/столбца * (расширяясь в пределах окна), которые будут просачиваться в сетку данных.

<Grid>
<Grid.ColumnDefinitions>
    <ColumnDefinition Width="15"/>
    <ColumnDefinition Width="*"/>
    <ColumnDefinition Width="15"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
    <RowDefinition Height="15"/>            
    <RowDefinition Height="*"/>
    <RowDefinition Height="10"/> 
    <RowDefinition Height="100"/> 
    <RowDefinition Height="15"/>
</Grid.RowDefinitions>

<TabControl Name="tabOperations" 
            Grid.Row="1"
            Grid.Column="1"
            TabStripPlacement="Top" 
            Margin="0,0,0,4"
            >
    <TabItem Header="Provider Accounts" >
        <DataGrid AutoGenerateColumns="True"
                IsReadOnly="True"
                ItemsSource="{Binding ProviderAccounts}"/>
        </TabItem>
    </TabControl>
<GridSplitter Grid.Row="2"
                Height="3"
                Grid.Column="1"
                HorizontalAlignment="Stretch" />

<TextBox Grid.Row="3" Grid.Column="1"
            TextWrapping="Wrap" Text="{Binding Status}"
            Margin="0,4,0,0"
            />

So regardless of size of the main window, it spans.

Горизонтальный размер Вертикальный размер

person ΩmegaMan    schedule 06.01.2019