2

次のように GridSplittler XAML を定義しました。

<Window>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
    </Grid>

    <Border Grid.Column="0" Background="Red" />
    <GridSplitter Grid.Column="1" ResizeDirection="Columns" Width="3" Height="Auto" HorizontalAlighment="Stretch" VerticalAlignment="Stretch" />
    <Border Grid.Column="0" Background="Green" />

</Window>

これにより、間にグリッド スプリッターがある 2 つの列が作成され、グリッド スプリッターが左右にドラッグされると、列のサイズが正しく変更されます。ウィンドウ全体のサイズを変更する場合、左の赤い列の幅を固定したままにし、右の緑の列の幅を変更します (ウィンドウのサイズが変更されるため)。Visual Studio アプリケーション全体のサイズを変更し、ソリューション エクスプローラーの幅は固定されたままですが、コード タブの幅が変更された場合と同じ効果があります。また、SQL Server Management Studio と同じです。オブジェクト エクスプローラーの幅は固定のままですが、SQL タブの幅が変わります。これら 2 つの例では、より複雑なドッキング コントロールを使用していることに気付きましたが、WPF GridSplitter を使用して同じ結果を得たいと考えていました。

編集:マシューの提案に基づいて、必要なのは最初の列定義に初期幅を与えることだけでした(以下に200を使用して表示)。

<Grid Name="GridName">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="200" />
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Border Grid.Column="0" Background="Red" />
    <GridSplitter Name="SplitterName" Grid.Column="1" ResizeDirection="Columns" Width="3" Height="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
    <Border Grid.Column="2" Background="Green" />
</Grid>

ウィンドウのサイズを変更すると、緑の境界線の幅のみが変更され、赤の境界線の幅は固定されたままになります。ありがとう!

4

2 に答える 2

2

コード ビハインドが気にならない場合は、スプリッターの DragDelta イベントに反応し、最初の列の幅を調整し、スターの幅を削除して、ドラッグ デルタに従って幅を固定することで、この動作を実現できます。

XAML :

<Grid Name="GridName">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Border Grid.Column="0" Background="Red" />
    <GridSplitter Name="SplitterName" Grid.Column="1" ResizeDirection="Columns" Width="3" Height="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
    <Border Grid.Column="2" Background="Green" />
</Grid>

コードビハインド

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        SplitterName.DragDelta += SplitterNameDragDelta;
    }

    private void SplitterNameDragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
    {
        GridName.ColumnDefinitions[0].Width = new GridLength(GridName.ColumnDefinitions[0].ActualWidth + e.HorizontalChange);
    }
}
于 2013-03-27T16:39:20.077 に答える