Указание значения 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