您可以通過派生自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的全部教程。