调整其父窗口大小时的 WPF GridSplitter 行为

标签 wpf resize window gridsplitter

我已经定义了我的 GridSplitler 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>

这将创建两列,它们之间有一个网格分隔符,并且当左右拖动网格分隔符时,它将正确调整列的大小。现在,如果您调整整个窗口的大小,我希望左侧红色列的宽度保持固定,并更改右侧绿色列的宽度(随着窗口大小的调整)。其效果与调整整个 Visual Studio 应用程序的大小时的效果相同,解决方案资源管理器宽度保持固定,但代码选项卡的宽度发生变化。也与SQL Server Management Studio相同;对象资源管理器宽度保持固定,但 SQL 选项卡宽度发生变化。我意识到这两个示例使用了更复杂的停靠控件,但我希望使用 WPF GridSplitter 获得相同的结果。

编辑:根据 mathieu 建议,所需要做的就是为第一个列定义指定初始宽度(下面使用 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>

现在,当调整窗口大小时,它只会更改绿色边框的宽度,而红色边框的宽度保持固定。谢谢!

最佳答案

如果您不介意后面的一些代码,您可以通过响应分割器的 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);
    }
}

关于调整其父窗口大小时的 WPF GridSplitter 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15664027/

相关文章:

.net - 什么是 MVVM 限制?

c# - 在启动时运行程序

html - 跨浏览器问题(iframe 大小调整)

javascript - 如何为可调整大小的 jQuery UI 元素启动调整大小功能(触发句柄拖动)

window - 为 ascii 游戏生成一个窗口

jquery - 拖动调整大小 handle 时多次触发调整大小事件

c# - 显示列表中的重复项 c#

c# - 包装 ImageSource 用于 Base64 图片序列化

javascript - 动态缩放页面的最佳方式?

windows-vista - OpenInputDesktop() 确定安全/登录桌面