This is not possible with the current version of Xamarin Forms. The RelativeLayout container recommends restrictions when adding / removing items from its children’s collection (it caches the allowed restrictions - presumably for performance). Although various restrictions are implemented as Bindable properties, they still cannot be recalculated when changed.
I guess the intention is to someday respect constraint updates that would be useful, for example, for animations, but so far it doesn't work that way.
HOWEVER , I took a look at the decompiled RelativeLayout source, and you can hack it around, but this may not fit your needs, depending on how many functions are required and how complex your definitions of constraints are.
See this sample code (the key part sets the constraint using SetBoundsConstraint, which overrides the internally calculated boundaries of the added view, and then calls ForceLayout() ):
public partial class App : Application { public App () { var label = new Label { Text = "Test", HorizontalTextAlignment = TextAlignment.Center, VerticalTextAlignment = TextAlignment.Center, BackgroundColor = Color.Silver }; var layout = new RelativeLayout (); layout.Children.Add (label, Constraint.Constant (50), Constraint.Constant (100), Constraint.Constant (260), Constraint.Constant (30)); MainPage = new ContentPage { Content = layout }; var fwd = true; layout.Animate ("bounce", (delta) => { var d = fwd ? delta : 1.0 - delta; var y = 100.0 + (50.0 * d); var c = BoundsConstraint.FromExpression ((Expression<Func<Rectangle>>)(() => new Rectangle (50, y, 260, 30)), new View [0]); RelativeLayout.SetBoundsConstraint(label, c); layout.ForceLayout (); }, 16, 800, Easing.SinInOut, (f, b) => {
Keith rome
source share