WPF, XAML: Stretch when available space is smaller than MinWidth (有图)
WPF, XAML: Stretch when available space is smaller than MinWidth (with pictures)
我有一个宽度可变的网格。它有三列,外面的两列用作中间列内容的可变边距。
我希望网格具有以下与大小相关的属性:
- Grid.Width >= 220px:外部列的宽度 = 10px(最大宽度)
每个和中间的列占据了剩余的 space
- Grid.Width <= 200px: 外列的宽度 = 0px 每个和中间
列占据整个网格
- 在 200px 和 220px 之间,外部列从 0px(200)增长到
每个 10 像素(220 像素)。在这些点之间,中间列的宽度
仍然是 200px,因为外部列需要更改 Grid.Width 到
grow/shrink.
我用过这个代码:
<ColumnDefinition Width="10*" MaxWidth="10" />
<ColumnDefinition Width="200*" MinWidth="200"/>
<ColumnDefinition Width="10*" MaxWidth="10" />
除了一个问题外,它工作得很好:如果网格的宽度小于中间列的最小宽度,该列不会更改其宽度以适应网格的宽度,而是保持 200 像素。但是,如果我删除 MinWidth 属性,当 Grid 的宽度为 200px 时,外部两列将不会 "stretch" 到 0px。
当网格小于 200px 时,我希望中间列拉伸到网格的宽度。
我该怎么办?
当然,如果您将其 MinWidth
设置为 200,中间列将保持 200 DIP 宽度。这正是 MinWidth
属性 的用途。
如果您想要一些更自定义的行为,您应该使用编程语言(例如 C#)来实现它。例如,您可以处理 Grid
的 SizeChanged
事件,并在其宽度小于 200 DIP 时隐藏外部列。像这样:
private void Grid_SizeChanged(object sender, SizeChangedEventArgs e)
{
Grid grid = (Grid)sender;
if (e.NewSize.Width < 200)
{
grid.ColumnDefinitions[0].Width = new GridLength(0);
grid.ColumnDefinitions[2].Width = new GridLength(0);
}
else
{
grid.ColumnDefinitions[0].Width = new GridLength(10, GridUnitType.Star);
grid.ColumnDefinitions[2].Width = new GridLength(10, GridUnitType.Star);
}
}
XAML:
<Grid SizeChanged="Grid_SizeChanged">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="10*" MaxWidth="10" />
<ColumnDefinition Width="200*" />
<ColumnDefinition Width="10*" MaxWidth="10" />
</Grid.ColumnDefinitions>
</Grid>
我有一个宽度可变的网格。它有三列,外面的两列用作中间列内容的可变边距。
我希望网格具有以下与大小相关的属性:
- Grid.Width >= 220px:外部列的宽度 = 10px(最大宽度) 每个和中间的列占据了剩余的 space
- Grid.Width <= 200px: 外列的宽度 = 0px 每个和中间 列占据整个网格
- 在 200px 和 220px 之间,外部列从 0px(200)增长到 每个 10 像素(220 像素)。在这些点之间,中间列的宽度 仍然是 200px,因为外部列需要更改 Grid.Width 到 grow/shrink.
我用过这个代码:
<ColumnDefinition Width="10*" MaxWidth="10" />
<ColumnDefinition Width="200*" MinWidth="200"/>
<ColumnDefinition Width="10*" MaxWidth="10" />
除了一个问题外,它工作得很好:如果网格的宽度小于中间列的最小宽度,该列不会更改其宽度以适应网格的宽度,而是保持 200 像素。但是,如果我删除 MinWidth 属性,当 Grid 的宽度为 200px 时,外部两列将不会 "stretch" 到 0px。
当网格小于 200px 时,我希望中间列拉伸到网格的宽度。 我该怎么办?
当然,如果您将其 MinWidth
设置为 200,中间列将保持 200 DIP 宽度。这正是 MinWidth
属性 的用途。
如果您想要一些更自定义的行为,您应该使用编程语言(例如 C#)来实现它。例如,您可以处理 Grid
的 SizeChanged
事件,并在其宽度小于 200 DIP 时隐藏外部列。像这样:
private void Grid_SizeChanged(object sender, SizeChangedEventArgs e)
{
Grid grid = (Grid)sender;
if (e.NewSize.Width < 200)
{
grid.ColumnDefinitions[0].Width = new GridLength(0);
grid.ColumnDefinitions[2].Width = new GridLength(0);
}
else
{
grid.ColumnDefinitions[0].Width = new GridLength(10, GridUnitType.Star);
grid.ColumnDefinitions[2].Width = new GridLength(10, GridUnitType.Star);
}
}
XAML:
<Grid SizeChanged="Grid_SizeChanged">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="10*" MaxWidth="10" />
<ColumnDefinition Width="200*" />
<ColumnDefinition Width="10*" MaxWidth="10" />
</Grid.ColumnDefinitions>
</Grid>