6

WPF GridSplitter は、グリッドをウィンドウよりも広くします!

GridSplitter を備えた WPF Grid があります。列のサイズを変更すると、グリッドをウィンドウよりも広くして見えなくすることができます。

次のように始まります。

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 コントロールでは動作しませんか?

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

ウィンドウのサイズが変更されて幅が列の 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>

赤い列を展開すると、右の列が 400 の MinWidth に達するまでのみ展開され、ページから起動されません。

この動作を引き起こすウィンドウまたは最も外側のグリッドの他のプロパティを設定している可能性があります...

于 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 に答える