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

问题描述 投票:6回答:5

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?

.net wpf xaml grid
5个回答
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时,它将不会从页面引导出来。

有可能您正在设置Window或最外面的Grid的其他属性,这将导致此行为...


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>

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, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
{
    if (GridName.ColumnDefinitions[2].Width.Value < 400)
    {
        GridName.ColumnDefinitions[2].Width = new GridLength(400);
    }
}

但是在* ColumnDefinition上使用MinWidth应该很好。请注意,具有MinWidth的ColumnDefinition必须位于顶层。如果它嵌套在列内的某个网格中,则它不起作用。


0
投票

我也有这个问题,没有普通控件的普通Grid,并且两列/行的大小均为*

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

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

© www.soinside.com 2019 - 2024. All rights reserved.