Насколько я понимаю, Grid - это контейнер, что означает, что Grid визуализируется перед фактическим содержимым.Технически было бы невозможно установить динамическую высоту / ширину в соответствии с содержимым (если вы не установите auto).Обычно эту ситуацию можно преодолеть, контролируя ширину / высоту управления вместо решения сложного решения.Проще говоря, скажем, если у вас есть 3 элемента управления, и любой из 2 должен быть отображен, который должен в равной степени занимать ширину / высоту страницы, вы можете установить высоту строки сетки в автоматический режим, в то время как установить высоту содержимого.Для справки вы можете использовать ActualWidth родительского элемента управления.
Вот пример для справки.В этом примере я предполагаю, что у вас есть какой-то механизм, который управляет сеткой, сколько пользовательских элементов управления видно сейчас.поэтому передайте количество элементов в converterParameter.
public class HeightConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
int.TryParse(parameter.ToString(), out var items);
double.TryParse(value.ToString(), out var actualheight);
return actualheight / items;
}
//......
}
<Window.Resources>
<local:HeightConverter x:Key="HeightConverter"/>
</Window.Resources>
<Grid x:Name="mainGrid" Background="Gray">
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<local:sampleControl Background="Red" Grid.Row="0" Height="{Binding ElementName=mainGrid, Path=ActualHeight, Converter={StaticResource HeightConverter}, ConverterParameter=3}"/>
<local:sampleControl Background="Yellow" Grid.Row="1" Height="{Binding ElementName=mainGrid, Path=ActualHeight, Converter={StaticResource HeightConverter}, ConverterParameter=3}"/>
<local:sampleControl Background="Blue" Grid.Row="2" Height="{Binding ElementName=mainGrid, Path=ActualHeight, Converter={StaticResource HeightConverter}, ConverterParameter=3}"/>
</Grid>