Указание значения RowDefinition.Height в коде

Когда вы создаете Grid в xaml, вы можете определить RowDefinitions как таковые

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
</Grid>

Мне нужно сделать то же самое в коде. Я знаю, что могу написать

RowDefinition row = new RowDefinition();
row.Height = new GridLength(1.0, GridUnitType.Star);

но это не очень помогает, так как у меня есть строка. Возможно, я мог бы создать свой собственный конвертер "string to GridLength", но это не кажется правильным, поскольку он работает так гладко с xaml. Конечно, я пробовал следующее, но это не работает.

row.Height = new GridLength("*");

Что мне здесь не хватает?

Ответ 1

Структура GridLength имеет TypeConverter, определенный, который используется при создании экземпляра из Xaml. Вы можете использовать его и в коде. Он назывался GridLengthConverter

Если вы посмотрите на GridLength.cs с помощью Reflector, это выглядит так. Обратите внимание на TypeConverter

[StructLayout(LayoutKind.Sequential), TypeConverter(typeof(GridLengthConverter))]
public struct GridLength : IEquatable<GridLength>
{
    //...
}

Вы можете использовать его как

GridLengthConverter gridLengthConverter = new GridLengthConverter();
row.Height = (GridLength)gridLengthConverter.ConvertFrom("*");

Ответ 2

Не нужно создавать конвертер, там уже есть один, который также используется XAML-парсером:

var converter = new GridLengthConverter();
row.Height = (GridLength)converter.ConvertFromString("*");

В обозревателе вы найдете такие конвертеры для много типов, так как многие получают синтаксический анализ из строк в XAML, например. BrushConverter и ImageSourceConverter

Ответ 3

вам не хватает включить RowDefinition в RowDefinitions

RowDefinition row = new RowDefinition();
row.Height = new GridLength(1.0, GridUnitType.Star);
YourGrid.RowDefinitions.Add(row);

Увидимся! Rutx