WPF 그리드 스플리터가 그리드의 크기를 변경하는 것을 어떻게 유지합니까?

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

  •  07-07-2019
  •  | 
  •  

문제

WPF GridSplitter는 내 창보다 더 넓게 만들어집니다!

그리드 플리터가있는 WPF 그리드가 있습니다. 열 크기를 조정하면 창보다 더 넓고보기가 불가능한 그리드를 더 넓게 만들 수 있습니다.

다음과 같이 시작합니다.

WPF 그리드 http://img201.imageshack.us/img201/9505/onehg6.jpg

그러나 왼쪽 열을 넓히면 오른쪽 열 (녹색)을 더 이상 볼 수 없습니다.

wpf gridsplitter http://img201.imageshack.us/img201/1804/twomy6.jpg

내가 뭘 잘못하고 있죠? 그리드 스플리터가 내 그리드 크기를 변경하지 않도록하려면 어떻게해야합니까?


업데이트:

나는 여전히 이것으로 어려움을 겪고 있습니다. 나는 이제 그리드 내에서 중첩 그리드를 시도했습니다. 도움이되지 않았습니다. 다음은 내 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>

업데이트:

문제는 웹 브라우저 컨트롤에 문제가 있다고 생각합니다. 새로운 질문보기 :

WPF GridSplitter는 WebBrowser 컨트롤과 작동하지 않습니까?

도움이 되었습니까?

해결책

창이 크기가 커져 너비가 열의 minwidth의 합보다 적 으면 열이 차단되는 것을 볼 수 있지만 그렇지 않으면 문제를 재현 할 수 없습니다.

<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를 사용하는 것은 잘 작동합니다. Minwidth와 함께 ColumnDefinition은 최상위 레벨이어야합니다. 열 안쪽의 그리드에 중첩되어 있으면 작동하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top