WPF GridSplitter не работает

Я не могу заставить Gridsplitter работать со следующим примером кода. Разделитель сетки не перемещает и не изменяет размер окружающих строк сетки «Верх» и «Нижний край», которые настроены на заполнение доступного пространства:

<Grid Width="Auto" Height="Auto">
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <Grid Grid.Row="0">
        <TextBlock FontSize="55" HorizontalAlignment="Center" VerticalAlignment="Center" TextWrapping="Wrap">Top</TextBlock>
    </Grid>

    <Grid Grid.Row="1">
        <GridSplitter Height="5" HorizontalAlignment="Stretch" ResizeDirection="Rows"/>
    </Grid>

    <Grid Grid.Row="2">
        <TextBlock FontSize="55" HorizontalAlignment="Center" VerticalAlignment="Center" TextWrapping="Wrap">Bottom</TextBlock>
    </Grid>
</Grid>

person Steve    schedule 31.07.2018    source источник


Ответы (2)


Редактировать. Как говорит Клеменс, ваш GridSplitter должен быть прямым дочерним элементом сетки, которую вы хотите разделить. Вы помещаете новую сетку в строку 1 родительской сетки, когда делаете:

<Grid Grid.Row="1">
    <GridSplitter Height="5" HorizontalAlignment="Stretch" ResizeDirection="Rows"/>
</Grid>

Вам нужно поместить разделитель непосредственно в родительскую сетку, которую вы хотите разделить, и объявить строку в теге элемента:

<Grid Width="Auto" Height="Auto">
       <Grid.RowDefinitions>
           <RowDefinition Height="*"/>
           <RowDefinition Height="Auto"/>
           <RowDefinition Height="*"/>

       <TextBlock Grid.Row="0" FontSize="55" HorizontalAlignment="Center" VerticalAlignment="Center" TextWrapping="Wrap">Top</TextBlock>

       <GridSplitter Grid.Row="1" Height="5" HorizontalAlignment="Stretch" ResizeDirection="Rows"/>

       <TextBlock Grid.Row="2" FontSize="55" HorizontalAlignment="Center" VerticalAlignment="Center" TextWrapping="Wrap">Bottom</TextBlock>
</Grid>
person D.Hunt    schedule 31.07.2018
comment
не уверен, почему - просто потому, что он должен быть прямым дочерним элементом грида, на котором он должен работать. - person Clemens; 31.07.2018
comment
Спасибо, Клеменс, это имеет смысл! Удаление тегов Grid Row вокруг Gridsplitter, чтобы сделать его прямым дочерним элементом, работает отлично! - person Steve; 31.07.2018

Просто удалите бесполезные сетки:

<Grid Width="Auto" Height="Auto">
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <TextBlock FontSize="55" HorizontalAlignment="Center" VerticalAlignment="Center" TextWrapping="Wrap">Top</TextBlock>

        <GridSplitter Grid.Row="1" Height="5" HorizontalAlignment="Stretch" ResizeDirection="Rows"/>

        <TextBlock FontSize="55"  Grid.Row="2" HorizontalAlignment="Center" VerticalAlignment="Center" TextWrapping="Wrap">Bottom</TextBlock>
</Grid>

ИЗМЕНИТЬ:

Для ясности: элемент управления GridSplitter изменяет размеры только элементов на том же уровне в иерархии дочерних элементов Grid. Вы можете поместить в сетку все, что хотите, но вы должны поместить GridSplitter на тот же уровень элемента управления, размер которого вы хотите изменить.

Вы все еще можете сделать это:

<Grid Width="Auto" Height="Auto">
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Grid>
        <TextBlock FontSize="55" HorizontalAlignment="Center" VerticalAlignment="Center" TextWrapping="Wrap">Top</TextBlock>
    </Grid>

    <GridSplitter Grid.Row="1" Height="5" HorizontalAlignment="Stretch" ResizeDirection="Rows"/>

    <Grid Grid.Row="2">
      <TextBlock FontSize="55"  HorizontalAlignment="Center" VerticalAlignment="Center" TextWrapping="Wrap">Bottom</TextBlock>
    </Grid>
</Grid>

Но GridSplitter должен находиться на том же уровне элемента управления, размер которого вы хотите изменить.

person Babbillumpa    schedule 31.07.2018
comment
Спасибо, это работает. Знаете ли вы, почему вам нужно удалить тег строки сетки, чтобы Gridsplitter работал? Кроме того, теги сетки могут быть избыточными в моем примере кода, но мой реальный код имеет гораздо больше элементов в каждой строке сетки (некоторые с вложенными определениями сетки). Я считаю, что без этих тегов более сложные дизайны трудно сохранить читабельными/организованными. - person Steve; 31.07.2018
comment
Элемент управления GridSplitter изменяет размер только элемента на том же уровне в иерархии дочерних элементов Grid. Вы можете поместить в сетку все, что хотите, но вы должны поместить GridSplitter на тот же уровень элемента управления, размер которого вы хотите изменить. - person Babbillumpa; 31.07.2018
comment
Спасибо, теперь я понимаю, что мой Gridsplitter не был прямым потомком сетки, размер которой я пытался изменить! - person Steve; 31.07.2018