Скажем, я хочу, TextBlock
чтобы он Width
равнялся родительскому контейнеру Width
(т. Е. Растягивался из стороны в сторону) или процентному содержанию его родительского контейнера Width
, как я могу сделать это XAML
без указания абсолютных значений?
Я хочу сделать это так, чтобы, если контейнер «Родительский контейнер» впоследствии расширялся (его « Width
увеличивалось»), его «дочерние элементы» также расширялись автоматически. (в основном, как в HTML и CSS)
Ответы:
Чтобы растянуть его до того же размера, что и родительский контейнер, используйте атрибут:
Это заставит элемент Textbox растягиваться по горизонтали и заполнять все родительское пространство по горизонтали (на самом деле это зависит от используемой родительской панели, но должно работать в большинстве случаев).
Проценты могут использоваться только со значениями ячеек сетки, поэтому другой вариант - создать сетку и поместить текстовое поле в одну из ячеек с соответствующим процентом.
источник
Вы можете поместить текстовые поля внутри сетки, чтобы сделать процентные значения в строках или столбцах сетки и позволить текстовым полям автоматически заполнять свои родительские ячейки (как они будут по умолчанию). Пример:
Это сделает # 1 2/5 ширины и # 2 3/5.
источник
Как правило, вы используете встроенный элемент управления макета, соответствующий вашему сценарию (например, используйте сетку в качестве родительского элемента, если вы хотите масштабировать относительно родительского элемента). Если вы хотите сделать это с произвольным родительским элементом, вы можете создать ValueConverter, но, вероятно, он будет не таким чистым, как хотелось бы. Однако, если вам это абсолютно необходимо, вы можете сделать что-то вроде этого:
Что можно использовать следующим образом, чтобы получить дочернее текстовое поле 10% ширины его родительского холста:
источник
CultureInfo.InvariantCulture
к двойному преобразованию, потому чтоparameter
оно считаетсяstring
и в культурах с другимdecimal separator
оно не будет работать, как ожидалось.Для тех, кто получает ошибку, например: «2 *» строка не может быть преобразована в длину.
источник
<RowDefinition Height="auto" />
?Можно использовать реализацию IValueConverter. Класс конвертера, который наследуется от IValueConverter, принимает некоторые параметры, такие как
value
(процент) иparameter
(ширина родителя), и возвращает желаемое значение ширины. В файле XAML ширина компонента устанавливается в соответствии с желаемым значением:XAML:
источник
Я знаю, что это не Xaml, но я сделал то же самое с событием SizeChanged текстового поля:
Текстовое поле имеет размер 80% от его родительского элемента (размер поля справа составляет 20%) и растягивается при необходимости.
источник
Я использую два метода для определения относительного размера. У меня есть класс
Relative
с тремя прикрепленными свойствамиTo
,WidthPercent
иHeightPercent
это полезно, если я хочу, чтобы элемент был относительным размером элемента в любом месте визуального дерева и чувствовал себя менее хакерским, чем подход конвертера - хотя вы используете то, что работает для вас, что вы довольны.Другой подход более хитрый. Добавьте туда,
ViewBox
где вы хотите, чтобы относительные размеры были внутри, затем внутри этого, добавьте aGrid
на ширине 100. Затем, если вы добавите aTextBlock
с шириной 10 внутри, это, очевидно, 10% от 100.ViewBox
Будет масштабировать вGrid
соответствии с любым пространством , которое было дано, так что если его единственное на странице, тоGrid
будет масштабироваться полной шириной и эффективно, вашTextBlock
масштабируются до 10% страницы.Если вы не установите высоту,
Grid
тогда она будет уменьшаться в соответствии с ее содержимым, поэтому все будет относительно небольшого размера. Вы должны будете убедиться, что содержимое не становится слишком высоким, т. Е. Начинает изменяться соотношение сторон пространства, выделенного дляViewBox
остального, иначе оно также начнет масштабировать высоту. Вы , наверное , можете обойти это сStretch
изUniformToFill
.источник