WPF 그리드 스플리터가 그리드의 크기를 변경하는 것을 어떻게 유지합니까?
문제
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>
업데이트:
문제는 웹 브라우저 컨트롤에 문제가 있다고 생각합니다. 새로운 질문보기 :
해결책
창이 크기가 커져 너비가 열의 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은 최상위 레벨이어야합니다. 열 안쪽의 그리드에 중첩되어 있으면 작동하지 않습니다.