簡體   English   中英

如何防止 WPF GridSplitter 改變我的網格大小?

[英]How do I keep the WPF GridSplitter from changing the size of my Grid?

WPF GridSplitter 使我的網格比我的窗口更寬!

我有一個帶有 GridSplitter 的 WPF 網格。 如果我調整列的大小,那么我可以使我的網格比我的窗口更寬並且不可見。

它是這樣開始的:

WPF 網格 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 不適用於 WebBrowser 控件?

嘗試將您的寬度更改為星號大小。 這將導致拆分器僅調整其所在列的大小,因此不確定這是否是您想要的行為。 但是,對於星號大小,內容不會超出窗口范圍。

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

如果您的 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 的其他屬性...

當拆分器之間沒有具有自動寬度的列時,它無需任何附加代碼即可為我工作,即:

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

否則網格將調整大小。

捕獲 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 需要位於頂層。 如果它嵌套在列內的某個網格中,則它不起作用。

我也有這個問題,沒有特殊控件的普通Grid*列/行上的大小。

問題原來是我在加載窗口后以編程方式設置網格中列/行的寬度和高度,因為我保存了拆分器位置以在下一次程序運行時恢復它。

我將其更改為計算*大小以解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM