2010-09-30 3 views
2

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

Проблема заключается в том, что вы перетаскиваете GridSplitter до конца top, это сделает переполнение ячейки. Я хочу, чтобы он остановился, как только он доберется до вершины. Желаемое поведение может быть достигнуто путем удаления 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 и т. Д., Но никто действительно не работает так хорошо.

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

Edit: Я сделал 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» и изменить его на * как так

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

ответ

3

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 неясного поведения.

+0

Спасибо за ваш быстрый ответ. Я прочитал обе статьи, которые вы опубликовали, и замечаем, что они говорят, что для разделителя сетки отлично, чтобы они занимали ту же строку, что и другие элементы, если они видны (что это такое). К сожалению, даже в своем собственном ряду все еще есть та же проблема. Я обновил вопрос с помощью XAML для строки GridSplitter. Я попытался использовать все параметры ResizeDirection и ResizeBehavior, которые я понимаю, управление элементами сетки, которые он изменяет, однако высота переполнения строк все еще происходит. – Seravy

+0

См. Обновление, пожалуйста. –

+0

Да, Как уже упоминалось ранее, * не приведет к увеличению высоты. Мой коллега по работе и я потратили некоторое время на это. Когда сплиттер используется против определения Auto row, он изменит его на абсолютную GridLength, где и лежит проблема. Поскольку они абсолютны, нет причин, по которым разделитель сетки не может продолжать расширять ячейку. – Seravy

1

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

Смежные вопросы