Вы можете создать свой собственный макет, исходя из класса Xamarin.Forms.Layout
.
public class CustomLayout : Layout<View>
{
public CustomLayout()
{
}
}
Макет должен переопределить метод LayoutChildren
. Этот метод отвечает за размещение детей на экране.
Дети могут быть измерены с помощью метода GetSizeRequest
, который будет возвращать как желаемый размер, так и минимальный размер, который желает ребенок.
protected override void LayoutChildren (double x, double y, double width, double height)
{
for (int i = 0; i < Children.Count; i++) {
var child = (View) Children[i];
// skip invisible children
if(!child.IsVisible)
continue;
var childSizeRequest = child.GetSizeRequest (double.PositiveInfinity, height);
var childWidth = childSizeRequest.Request.Width;
LayoutChildIntoBoundingRegion (child, new Rectangle (x, y, childWidth, height));
x += childWidth;
}
}
Этот метод будет автоматически вызываться всякий раз, когда макет должен быть пересчитан. Если ваш макет состоит из жестко закодированных или фиксированных элементов размера, то вместо этого измерьте их размеры в этом алгоритме. Вызовы GetSizeRequest являются одними из самых дорогих вызовов, которые могут быть сделаны и не предсказуемы в их среде исполнения, поскольку поддерево может быть произвольным сложным. Фиксация их размера - отличный способ повысить производительность, если динамический размер не требуется.
Выполнение OnSizeRequest
необходимо для правильной установки нового макета при размещении внутри других макетов. Во время циклов компоновки этот метод может быть вызван много раз в зависимости от расположения над ним и количества исправлений макета, необходимых для решения текущей иерархии раскладки.
protected override SizeRequest OnSizeRequest (double widthConstraint, double heightConstraint)
{
var height = 0;
var minHeight = 0;
var width = 0;
var minWidth = 0;
for (int i = 0; i < Children.Count; i++) {
var child = (View) Children[i];
// skip invisible children
if(!child.IsVisible)
continue;
var childSizeRequest = child.GetSizeRequest (double.PositiveInfinity, height);
height = Math.Max (height, childSizeRequest.Minimum.Height);
minHeight = Math.Max (minHeight, childSizeRequest.Minimum.Height);
width += childSizeRequest.Request.Width;
minWidth += childSizeRequest.Minimum.Width;
}
return new SizeRequest (new Size (width, height), new Size (minWidth, minHeight));
}
Вы можете прочитать весь учебник о том, как создать пользовательский макет here.