Как мне удержать WPF GridSplitter от изменения размера моей сетки?

StackOverflow https://stackoverflow.com/questions/279557

  •  07-07-2019
  •  | 
  •  

Вопрос

WPF GridSplitter делает мою сетку шире, чем мое окно!

У меня есть сетка WPF с разделителем сеток.Если я изменю размер своих столбцов, то смогу сделать свою сетку шире моего окна и недоступной для просмотра.

Все начинается вот так:

Сетка WPF http://img201.imageshack.us/img201/9505/onehg6.jpg

Но после расширения левой колонки я больше не вижу правую колонку (зеленую).:

Разделитель сетки WPF http://img201.imageshack.us/img201/1804/twomy6.jpg

Что я делаю не так?Как мне помешать GridSplitter изменять размер моей сетки?


Обновить:

Я все еще борюсь с этим.Теперь я попробовал вложить сетки в сетки.Это не помогло.Вот мои определения столбцов XAML, определения строк и разделители сеток...

<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 Control?

Это было полезно?

Решение

Если размер вашего окна будет изменен таким образом, чтобы его ширина была меньше суммы минимальных ширин ваших столбцов, вы увидите, что столбцы обрезаны, но в противном случае я не смогу воспроизвести вашу проблему:

<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, он не загрузит его со страницы.

Возможно, вы устанавливаете другие свойства окна или самой внешней сетки, которые могли бы вызвать такое поведение...

Другие советы

Попробуйте изменить ширину на размер звезды.Это приведет к тому, что разделитель изменит размер только столбцов, между которыми он находится, поэтому не уверен, что это ваше желаемое поведение.Однако при размерах звезд содержимое не будет выходить за пределы окна.

<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>

У меня это работает без какого-либо дополнительного кода, когда между разделителями нет столбцов с автоматической шириной, т. е.:

<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>

В противном случае размер сетки можно будет изменять.

Захват события 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 должно работать просто отлично.Обратите внимание, что определение столбца с минимальной шириной должно быть на верхнем уровне.Это не сработает, если оно вложено в какую-то сетку внутри столбца.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top