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