如何防止 WPF GridSplitter 改变我的 Grid 大小?

6

WPF GridSplitter 使我的 Grid 比窗口更宽!

我有一个带有 GridSplitter 的 WPF Grid。如果我调整列的大小,那么我可以使我的 Grid 比窗口更宽并且无法查看。

开始是这样的:

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

但是在将左列扩展后,我就看不到右列(绿色)了:

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

我做错了什么?如何防止 GridSplitter 改变我的 Grid 大小?


更新:

我仍然在努力解决这个问题。现在我尝试了嵌套网格,但没有帮助。下面是我的 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无法与WebBrowser控件一起使用?

你的窗口有设置最大宽度吗? - BrainSlugs83
5个回答

8

尝试将宽度改为星号大小(Width="*")。

这将导致分隔条仅调整其所在的列之间的宽度,但我不确定这是否是您想要的行为。然而,使用星号大小,内容不会超出窗口边界。

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

这对我解决了问题。分隔器两侧的列必须是星号大小。 - Joshua Tacoma

4

如果您调整Window的大小,使其Width小于列的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的MinWidth,而不会将其推出页面。

有可能您正在设置窗口或最外层Grid的其他属性导致出现此行为...


我通过为非Web浏览器列设置任意高的MaxWidth值来使其工作,就像您在这个问题中所演示的那样:http://stackoverflow.com/questions/375841/wpf-gridsplitter-doesnt-work-with-webbrowser-control#376480<ColumnDefinition ... MaxWidth="10000"/> - Zack Peterson

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>

否则,该网格将具有可调整大小的功能。

2
捕获DragDelta事件是另一种实现它的方法:
private void VerticalGridSplitter_DragDelta(object sender, DragDeltaEventArgs e)
{
    if (GridName.ColumnDefinitions[2].Width.Value < 400)
        GridName.ColumnDefinitions[2].Width = new GridLength(400);
}

使用MinWidth*ColumnDefinition上应该完全可行。

请注意,具有MinWidthColumnDefinition需要位于顶级。如果它嵌套在某个网格中,则无效。


1
我也遇到了这个问题,使用普通的Grid并没有特殊控件,并且在两列/行上都设置了*大小。
问题是我在加载窗口后以编程方式设置了网格中列/行的宽度和高度,因为我保存了分隔符位置以在下次运行程序时恢复它。
我改为计算*大小来解决问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接