如何防止WPF GridSplitter改变网格的大小?

时间:2008-11-10 23:31:13

标签: .net wpf xaml grid

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控件。看到新问题:

WPF GridSplitter Doesn't Work With WebBrowser Control?

5 个答案:

答案 0 :(得分:7)

尝试将宽度更改为星号。这将导致拆分器仅调整其所在的列的大小,因此不确定这是否是您所需的行为。但是,对于星号,内容不会超出窗口范围。

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

答案 1 :(得分:3)

如果您的窗口调整大小以使其宽度小于列的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 :(得分:3)

当分割器之间没有自动宽度的列时,它对我有用而没有任何附加代码,即:

<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 :(得分:2)

捕获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需要位于顶层。如果它嵌套在列中的某个网格中,它就无法工作。

答案 4 :(得分:0)

我也遇到了这个问题,普通的Grid没有特殊的控件,两列/行的大小都是*

原来的问题是,加载窗口后,我以编程方式将网格中行/行的高度设置为宽度,因为我保存了拆分器的位置,以便在下一次程序运行时将其还原。

我将其更改为计算*大小以解决该问题。