Вы можете создать свой собственный макет, производный от класса 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));
}
Вы можете прочитать полное руководство по созданию пользовательского макета здесь.
person
Rohit Vipin Mathews
schedule
17.08.2016