Вот MultiValueConverter, который вы можете использовать с ответом JustABill:
public class RatioStarSizing : IMultiValueConverter
{
public static readonly RatioStarSizing Instance = new RatioStarSizing();
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return new GridLength((double)values[0] / (double)values[1], GridUnitType.Star);
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Это позволит вам работать с этим XAML:
<Grid x:Name="LayoutRoot" Width="Auto" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="32"/>
<RowDefinition>
<RowDefinition.Height>
<MultiBinding Converter="{x:Static RatioStarSizing}">
<Binding ElementName="UserControl" Path="Value" />
<Binding ElementName="UserControl" Path="Maximum" />
</MultiBinding>
</RowDefinition.Height>
</RowDefinition> Height="{Binding Path=(Value/Maximum), ElementName=UserControl, Mode=Default}"/>
<RowDefinition Height="16"/>
<RowDefinition Height="*" />
<RowDefinition Height="32"/>
</Grid.RowDefinitions>
(...)
Обратите внимание на хитрый прием использования звездыразмер, чтобы избежать необходимости в двух MultiValueConverter: первый элемент установлен в звезду значения / максимума, поэтому, если значение равно 4, а максимум равно 10, преобразователь будет возвращать значение «0,4 *» как размер, что приведет к следующим фактическим значениям высоты строки.
<Grid.RowDefinitions>
<RowDefinition Height="32"/>
<RowDefinition Height="0.4*"/>
<RowDefinition Height="16"/>
<RowDefinition Height="*" />
<RowDefinition Height="32"/>
</Grid.RowDefinitions>
Как вы можете видеть, с помощью MultiValueConverter вы достигнете того, что вам нужно.
В качестве сноски я разработал библиотеку, которую планирую вскоре открыть, которая позволит мненапишите все это без конвертера:
<Grid.RowDefinitions>
<RowDefinition Height="32"/>
<RowDefinition Height="{edf:ExpressionBinding
new GridLength(Value/Maximum, GridUnitType.Star)"/>
<RowDefinition Height="16"/>
<RowDefinition Height="*" />
<RowDefinition Height="32"/>
</Grid.RowDefinitions>
Я добавлю сюда комментарий, как только выпущу эту библиотеку для публичного использования.