6

WPF GridSplitter 使我的 Grid 比我的 Window 更宽!

我有一个带有 GridSplitter 的 WPF 网格。如果我调整列的大小,那么我可以使我的网格比我的窗口更宽并且不可见。

它是这样开始的:

WPF 网格 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 控件?

4

5 回答 5

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>
于 2008-11-11T16:05:49.820 回答
4

如果您的 Window 调整大小,使其宽度小于列的 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 的其他属性...

于 2008-12-17T19:36:32.777 回答
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>

否则网格将可调整大小。

于 2012-03-27T08:28:50.470 回答
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 需要位于顶层。如果它嵌套在列内的某个网格中,则它不起作用。

于 2010-11-19T13:32:09.260 回答
1

我也遇到了这个问题,Grid没有特殊控件的正常情况,以及*两列/行的大小。

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

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

于 2019-11-15T12:30:44.337 回答