WPF GridSplitter делает мою сетку шире, чем мое окно!
У меня есть сетка WPF с GridSplitter. Если я изменю размер своих столбцов, я могу сделать сетку шире, чем мое окно, и сделать ее невидимой.
Начинается это так:
Сетка WPF http://img201.imageshack.us/img201/9505/onehg6.jpg
Но после расширения левого столбца я больше не вижу правый столбец (зеленый):
WPF GridSplitter http://img201.imageshack.us/img201/1804/twomy6.jpg
Что я делаю не так? Как сделать так, чтобы GridSplitter не изменял размер моей сетки?
Обновлять:
Я все еще борюсь с этим. Теперь я пробовал вкладывать сетки в сетки. Это не помогло. Вот мои XAML ColumnDefinitions, RowDefinitions и GridSplitters ...
<Window ... >
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width = "*" MinWidth = "150" />
<ColumnDefinition Width = "Auto" />
<ColumnDefinition Width = "*" MinWidth = "400" />
</Grid.ColumnDefinitions>
<GridSplitter
ResizeDirection = "Columns"
ResizeBehavior = "BasedOnAlignment"
Grid.Column = "1"
HorizontalAlignment = "Center"
VerticalAlignment = "Stretch"
Width = "2"
Margin = "0,5,0,5"
Panel.ZIndex = "1"/>
<Grid Grid.Column = "0">
...
</Grid>
<Grid Grid.Column = "2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width = "*" MinWidth = "150" />
<ColumnDefinition Width = "Auto" />
<ColumnDefinition Width = "*" MinWidth = "200" />
</Grid.ColumnDefinitions>
<GridSplitter
ResizeDirection = "Columns"
ResizeBehavior = "PreviousAndNext"
Grid.Column = "1"
HorizontalAlignment = "Center"
VerticalAlignment = "Stretch"
Width = "2"
Margin = "0,5,0,5"
Panel.ZIndex = "1"/>
<Grid Grid.Column = "0">
...
</Grid>
<Grid Grid.Column = "2">
...
</Grid>
</Grid>
</Grid>
</Window>
Обновлять:
Я думаю, проблема в элементе управления WebBrowser. См. Новый вопрос:
WPF GridSplitter не работает с элементом управления WebBrowser?





Попробуйте изменить ширину на звездочки. Это приведет к тому, что разделитель изменит размер только столбцов, между которыми он находится, поэтому не уверен, что это ваше желаемое поведение. Однако при размерах звездочки содержимое не вырастет за пределы окна.
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width = "2*" MinWidth = "100" />
<ColumnDefinition Width = "Auto" />
<ColumnDefinition Width = "*" MinWidth = "50" />
<ColumnDefinition Width = "2*" MinWidth = "100" />
<ColumnDefinition Width = "Auto" />
<ColumnDefinition Width = "3*" MinWidth = "150" />
</Grid.ColumnDefinitions>
<GridSplitter
ResizeDirection = "Columns"
Grid.Column = "1"
Grid.RowSpan = "8"
HorizontalAlignment = "Center"
VerticalAlignment = "Stretch"
Width = "2"
Margin = "0,5,0,5"
Panel.ZIndex = "1"/>
...
</Grid>
Это решило проблему для меня. Колонны по обе стороны от разделителя должны были быть звездообразными.
Если размер вашего окна изменен так, что его ширина меньше суммы MinWidths ваших столбцов, вы увидите, что столбцы обрезаны, но в противном случае я не могу воспроизвести вашу проблему:
<Window 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>
<Grid.ColumnDefinitions>
<ColumnDefinition MinWidth = "150" Width = "*"/>
<ColumnDefinition Width = "Auto"/>
<ColumnDefinition MinWidth = "400" Width = "*"/>
</Grid.ColumnDefinitions>
<GridSplitter
Width = "2"
Grid.Column = "1"
HorizontalAlignment = "Center"
Margin = "0,5,0,5"
Panel.ZIndex = "1"
VerticalAlignment = "Stretch"
ResizeBehavior = "BasedOnAlignment"
ResizeDirection = "Columns"/>
<Grid Grid.Column = "0">
<Border Background = "Red" Margin = "5"/>
</Grid>
<Grid Grid.Column = "2">
<Grid.ColumnDefinitions>
<ColumnDefinition MinWidth = "150" Width = "*"/>
<ColumnDefinition Width = "Auto"/>
<ColumnDefinition MinWidth = "200" Width = "*"/>
</Grid.ColumnDefinitions>
<GridSplitter
Width = "2"
Grid.Column = "1"
HorizontalAlignment = "Center"
Margin = "0,5,0,5"
Panel.ZIndex = "1"
VerticalAlignment = "Stretch"
ResizeBehavior = "PreviousAndNext"
ResizeDirection = "Columns"/>
<Grid Grid.Column = "0">
<Border Background = "Green" Margin = "5"/>
</Grid>
<Grid Grid.Column = "2">
<Border Background = "Blue" Margin = "5"/>
</Grid>
</Grid>
</Grid>
</Window>
При расширении красного столбца он будет расширяться только до тех пор, пока правый столбец не достигнет минимальной ширины 400, он не будет загружать его со страницы.
Возможно, вы устанавливаете другие свойства окна или самой внешней сетки, которые могут вызвать такое поведение ...
Я заставил это работать, установив произвольно высокие значения MaxWidth для столбцов, отличных от веб-браузера, как вы продемонстрировали в этом другом вопросе: stackoverflow.com/questions/375841/… <ColumnDefinition ... MaxWidth = "10000" />
Захват события DragDelta - еще один способ сделать это:
private void VerticalGridSplitter_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
{
if (GridName.ColumnDefinitions[2].Width.Value < 400)
{
GridName.ColumnDefinitions[2].Width = new GridLength(400);
}
}
Но использование MinWidth в * ColumnDefinition должно работать нормально. Обратите внимание, что ColumnDefinition с MinWidth должен находиться на верхнем уровне. Не работает, если он вложен в какую-то сетку внутри столбца.
Это работает для меня без дополнительного кода, когда между разделителями нет столбцов с автоматической шириной, то есть:
<Grid >
<Grid.ColumnDefinitions>
<ColumnDefinition Width = "20*" MinWidth = "50" MaxWidth = "500" />
<ColumnDefinition Width = "Auto"/> <!-- Remove such columns /-->
<ColumnDefinition Width = "100*" MinWidth = "850"/>
<ColumnDefinition Width = "30*" MinWidth = "50" MaxWidth = "800" />
</Grid.ColumnDefinitions>
...
<GridSplitter HorizontalAlignment = "Right" Width = "3"/>
...
<GridSplitter Grid.Column = "3" HorizontalAlignment = "Left" Width = "3" />
<!-- Assign Grid.Column to 2 if you remove the auto width column /-->
...
</Grid>
В противном случае размер сетки будет изменяться.
У меня тоже была эта проблема с обычным Grid без специальных элементов управления и размером * в обоих столбцах / строках.
Проблема оказалась в том, что я программно установил ширину и высоту столбцов / строк в сетке после загрузки окна, потому что я сохраняю положение разделителя, чтобы восстановить его при следующем запуске программы.
Я изменил его на расчет размера *, чтобы решить проблему.
Установлено ли у вашего окна MaxWidth?