WPF GridSplitter使我的网格比我的窗口更宽!
我有一个带有GridSplitter的WPF网格。如果我调整列的大小,则可以使网格比窗口宽,并且不可见。
它是这样开始的:
WPF Grid http://img201.imageshack.us/img201/9505/onehg6.jpg
但是加宽了左列之后,我再也看不到右列(绿色):
WPF GridSplitter http://img201.imageshack.us/img201/1804/twomy6.jpg
我在做什么错?如何防止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控件上。看到新问题:
如果您调整窗口的大小,使其宽度小于列的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时,它将不会从页面引导出来。
有可能您正在设置Window或最外面的Grid的其他属性,这将导致此行为...
尝试将您的宽度更改为星形大小。这将导致拆分器仅调整其所在列的大小,因此不确定是否这是您想要的行为。但是,使用星形大小时,内容将不会超出窗口的范围。
<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);
}
}
但是在* ColumnDefinition上使用MinWidth应该很好。请注意,具有MinWidth的ColumnDefinition必须位于顶层。如果它嵌套在列内的某个网格中,则它不起作用。
我也有这个问题,没有普通控件的普通Grid
,并且两列/行的大小均为*
。
原来的问题是,加载窗口后,我以编程方式将网格中行/行的高度设置为宽度,因为我保存了拆分器的位置,以便在下一次运行程序时将其恢复。
我将其更改为计算*
大小以解决该问题。