using System; using System.Collections.Generic; using System.Linq.Expressions; namespace Xamarin.Forms { [TypeConverter(typeof(ConstraintTypeConverter))] public sealed class Constraint { Func _measureFunc; Constraint() { } internal IEnumerable RelativeTo { get; set; } public static Constraint Constant(double size) { var result = new Constraint { _measureFunc = parent => size }; return result; } public static Constraint FromExpression(Expression> expression) { Func compiled = expression.Compile(); var result = new Constraint { _measureFunc = layout => compiled(), RelativeTo = ExpressionSearch.Default.FindObjects(expression).ToArray() // make sure we have our own copy }; return result; } public static Constraint RelativeToParent(Func measure) { var result = new Constraint { _measureFunc = measure }; return result; } public static Constraint RelativeToView(View view, Func measure) { var result = new Constraint { _measureFunc = layout => measure(layout, view), RelativeTo = new[] { view } }; return result; } internal double Compute(RelativeLayout parent) { return _measureFunc(parent); } } }