Перетаскивание GridSplitter приводит к росту ячейки при использовании Авто высота / ширина - PullRequest
2 голосов
/ 30 сентября 2010

Я использую GridSplitter для изменения размера ячейки в сетке, однако его поведение не соответствует ожидаемому, и я не могу найти решение.Это сетка из трех строк, первая имеет определение строки, установленное на Авто, и содержит некоторые элементы.Вторая строка содержит некоторые данные и имеет определение строки *, чтобы заполнить оставшееся пространство.Последняя строка - это строка состояния, размер которой необходимо изменить, и поэтому в ней есть разделитель сетки, а высота определения строки Auto и MinHeight равна 30.

Проблема заключается в том, что вы перетаскиваете GridSplitter полностьюк вершине, это сделает переполнение ячейки.Я хочу, чтобы он остановился, как только он достигнет вершины.Желаемое поведение может быть достигнуто удалением Height = Auto из последней строки, но это заставляет нижнюю ячейку расширяться до равной высоты со средней строкой.

Вот пример XAML Pad.

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
    <Grid ShowGridLines="True">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" MinHeight="20" />
            <RowDefinition Height="Auto" MinHeight="30" />
        </Grid.RowDefinitions>
        <TextBlock Grid.Row="0" Text="Foo" />
        <TextBlock Grid.Row="1" Text="Bar" />
        <GridSplitter  Canvas.ZIndex="1"  VerticalAlignment="Top"  Grid.Row="2" Background="Cyan" Height="5" HorizontalAlignment="Stretch"  />
        <TextBlock VerticalAlignment="Bottom" Grid.Row="2" TextWrapping="Wrap">LOL<LineBreak/>LOL<LineBreak/>LOL</TextBlock>
    </Grid>
</Page>

Когда вы перетаскиваете наверх, вы заметите, что нижний текст исчезает.

Я пробовал разные вещи, такие как помещение разделителя сетки в его собственную ячейку и привязки высоты к другим объектам ActualHeight и т.д.но ни одна из них не работает так хорошо.

Я знаю, что это не самый хорошо объясненный вопрос, но любые идеи будут высоко оценены.

Редактировать: Я сделалGridSplitter со своей собственной строкой, как указано ниже, но, как я упоминал ранее, проблема все еще остается.У меня также есть ResizeBehavior и ResizeDirection.

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
    <Grid ShowGridLines="True">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" MinHeight="20" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" MinHeight="30"  />
        </Grid.RowDefinitions>
        <TextBlock Grid.Row="0" Text="Foo" />
        <TextBlock Grid.Row="1" Text="Bar" />
        <GridSplitter ResizeDirection="Rows" ResizeBehavior="PreviousAndNext" Grid.Row="2" Background="Cyan" Height="5" HorizontalAlignment="Stretch"  />
        <TextBlock VerticalAlignment="Bottom" Grid.Row="3" TextWrapping="Wrap">LOL<LineBreak/>LOL<LineBreak/>LOL</TextBlock>
    </Grid>
</Page>

Примером того, что работает, является удаление последних строк Height = "Auto" и изменение его на * вот так

Это однакоделает последнюю строку равной по размеру строке перед ней, а не запрошенному размеру ячейки.

Ответы [ 2 ]

3 голосов
/ 30 сентября 2010

GridSplitter должен находиться в отдельной строке или столбце. Поэкспериментируйте со свойствами GridSplitter.ResizeDirection и GridSplitter.ResizeBehavior .

Взгляните на следующие статьи:

UPDATE

Вы можете предоставить «звездные коэффициенты» для объекта GridLength. Например:

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:sys="clr-namespace:System;assembly=mscorlib" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">   
    <Grid ShowGridLines="True">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="95*" MinHeight="20" /> <!--here we are using 95*-->
            <RowDefinition Height="Auto" />
            <RowDefinition Height="5*" MinHeight="30"/> <!--and here we are using 5*-->     
        </Grid.RowDefinitions>
        <TextBlock Grid.Row="0" Text="Foo" />
        <TextBlock Grid.Row="1" Text="Bar" />
        <GridSplitter ResizeDirection="Rows"  Grid.Row="2" Background="Cyan" Height="5" HorizontalAlignment="Stretch"  />
        <TextBlock VerticalAlignment="Bottom" Grid.Row="3" TextWrapping="Wrap">LOL<LineBreak/>LOL<LineBreak/>LOL</TextBlock>
    </Grid> 
</Page>

Итак, у нас есть нужный вам макет без GridSplitter неясного поведения.

1 голос
/ 30 сентября 2010

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

...