Pergunta

WPF GridSplitter faz minha grade mais larga do que a minha janela!

Eu tenho uma grade WPF com um GridSplitter. Se eu redimensionar minhas colunas, então eu posso fazer o meu grade mais larga do que a minha janela e não-visível.

Ela começa assim:

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

Mas depois de alargar a coluna da esquerda, eu não posso mais ver coluna da direita (verde):

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

O que estou fazendo de errado? Como faço para manter o GridSplitter de alterar o tamanho da minha Grid?


Update:

Eu ainda estou lutando com isso. Eu já tentei grades de nidificação dentro de grades. Isso não ajudou. Aqui está a minha XAML ColumnDefinitions, RowDefinitions e 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>

Update:

Eu acho que o problema é com o controle WebBrowser. Veja nova pergunta:

WPF GridSplitter não funciona com o controle WebBrowser?

Foi útil?

Solução

Se a sua janela é redimensionada para que sua largura é menor do que a soma de MinWidths dos seus colunas, você verá as colunas cortado, mas caso contrário eu não posso reproduzir o problema:

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

A expansão da coluna vermelha, ele só irá expandir até que a coluna da direita atinge o seu MinWidth de 400, não vai carregá-lo para fora da página.

É possível que você está definindo outras propriedades da janela ou o mais externo grade que faria com que este comportamento ...

Outras dicas

Tente alterar a largura de até tamanhos estrela. Isso fará com que o divisor para redimensionar apenas as colunas entre as quais se sente, então não tenho certeza se este é o seu comportamento desejado. No entanto, com tamanhos de estrela, o conteúdo não vai crescer além dos limites da janela.

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

Ele funciona para mim sem qualquer código adicional quando não há colunas com larguras Auto entre os divisores, ou seja:.

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

Caso contrário, a grade será redimensionável.

Capturar o evento DragDelta é outra maneira de fazê-lo:

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);
    }
}

Mas usando MinWidth em um ColumnDefinition * deve funcionar muito bem. Note que o ColumnDefinition com o MinWidth precisa estar no nível superior. Ele não funciona se ele está aninhado em alguns grade dentro de uma coluna.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top