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

oipij1gg  于 2023-03-04  发布在  其他
关注(0)|答案(5)|浏览(163)

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列定义、行定义和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?

7cjasjjr

7cjasjjr1#

尝试将“宽度”更改为星星大小(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>
ebdffaop

ebdffaop2#

如果调整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>

扩展红色列,它只会扩展到右列达到其MinWidth 400,它不会 Boot 它离开页面。
您可能正在设置Window或最外层Grid的其他属性,这将导致此行为...

w46czmvw

w46czmvw3#

当拆分器之间没有带自动宽度的列时,它可以为我工作,无需任何额外的代码,即:

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

否则,栅格将可调整大小。

wkyowqbh

wkyowqbh4#

捕获DragDelta事件是另一种方法:

private void VerticalGridSplitter_DragDelta(object sender, DragDeltaEventArgs e)
{
    if (GridName.ColumnDefinitions[2].Width.Value < 400)
        GridName.ColumnDefinitions[2].Width = new GridLength(400);
}

但是在*ColumnDefinition上使用MinWidth应该可以工作得很好。
请注意,ColumnDefinitionMinWidth需要位于顶层,如果嵌套在列中的某个网格中,则无法工作。

n3h0vuf2

n3h0vuf25#

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

相关问题