C# 当至少有一行/列不能成比例时,如何防止GridSplitter扩展网格?

C# 当至少有一行/列不能成比例时,如何防止GridSplitter扩展网格?,c#,wpf,gridsplitter,C#,Wpf,Gridsplitter,我希望在窗口中添加一个边栏,其工作原理与Windows文件资源管理器和其他程序相同。我希望边栏的宽度是绝对的,但是可以调整大小,并且主面板会占用剩余的空间。问题是拆分器在达到主面板的最小宽度后不会停止,事实上它会继续经过窗口的右边缘 XAML样本: <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="170"/> <ColumnDefinition Wi

我希望在窗口中添加一个边栏,其工作原理与Windows文件资源管理器和其他程序相同。我希望边栏的宽度是绝对的,但是可以调整大小,并且主面板会占用剩余的空间。问题是拆分器在达到主面板的最小宽度后不会停止,事实上它会继续经过窗口的右边缘

XAML样本:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="170"/>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*" MinWidth="50"/>
    </Grid.ColumnDefinitions>
    <GridSplitter Grid.Column="1" Width="3" HorizontalAlignment="Stretch"/>
</Grid>

我发现这个问题经常重复,但唯一有效的答案是使两列的宽度成比例,这在这里没有帮助。提问者发布了一个可能的解决方案,但他们从未展示如何实施

我将GridSplitter子类化,并添加了逻辑以将拆分器保持在网格的范围内。新拆分器在移动前将其移动的列/行设置为成比例,然后在拖动完成时将其恢复为原始GridUnitType状态(以便在窗口调整大小时,行可以正确调整大小)


在您的示例中,可以为第一列设置MaxWidth属性。因此,我在网格中添加了一个SizeChanged事件,并在代码中设置了MaxWidth

XAML:

我知道这是一个丑陋的解决方案,但这个问题也让我非常生气。所以,如果你不想为这样一件小事花费太多时间,我建议你使用这种快速而肮脏的方法

<Grid SizeChanged="Grid_SizeChanged" >
    <Grid.ColumnDefinitions>
        <ColumnDefinition Name="FirstColumn" Width="170"/>
        <ColumnDefinition Width="Auto"  />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <GridSplitter Grid.Column="1" Width="3" HorizontalAlignment="Stretch" />
</Grid>
private void Grid_SizeChanged(object sender, SizeChangedEventArgs e)
{
    FirstColumn.MaxWidth = Application.Current.MainWindow.ActualWidth - 50;
}