Как сохранить WPF GridSplitter от изменения размера моей сетки? - PullRequest
6 голосов
/ 11 ноября 2008

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

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

Это начинается так:

WPF Grid http://img201.imageshack.us/img201/9505/onehg6.jpg

Но после расширения левого столбца я больше не вижу правый столбец (зеленый):

WPF GridSplitter http://img201.imageshack.us/img201/1804/twomy6.jpg

Что я делаю не так? Как я могу предотвратить изменение размера Grid в 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?

Ответы [ 4 ]

7 голосов
/ 11 ноября 2008

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

<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>
3 голосов
/ 27 марта 2012

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

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

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

3 голосов
/ 17 декабря 2008

Если размер вашего окна изменен так, что его ширина меньше суммы 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>

Расширяя красную колонку, она будет расширяться только до тех пор, пока правая колонка не достигнет MinWidth, равного 400, она не загрузится со страницы.

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

2 голосов
/ 19 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...