È possibile modificare i vincoli di un RelativeLayout
dopo che sono stati impostati una volta?Xamarin.Forms: modifica vincoli RelativeLayout in seguito
Nella documentazione vedo metodi come GetBoundsConstraint(BindableObject)
, ma penso che si possano usare solo se si dispone di un file XAML. Per ora sto cercando di farlo in codice. Ottengo null
se provo
RelativeLayout.GetBoundsConstraint(this.label);
L'unico modo che ho scoperto è quello di togliere i bambini dal layout e aggiungerlo con i nuovi vincoli di nuovo.
Esempio:
public class TestPage : ContentPage
{
private RelativeLayout relativeLayout;
private BoxView view;
private bool moreWidth = false;
public TestPage()
{
this.view = new BoxView
{
BackgroundColor = Color.Yellow,
};
Button button = new Button
{
Text = "change",
TextColor = Color.Black,
};
button.Clicked += Button_Clicked;
this.relativeLayout = new RelativeLayout();
this.relativeLayout.Children.Add(this.view,
Constraint.Constant(0),
Constraint.Constant(0),
Constraint.Constant(80),
Constraint.RelativeToParent((parent) =>
{
return parent.Height;
}));
this.relativeLayout.Children.Add(button,
Constraint.RelativeToParent((parent) =>
{
return parent.Width/2;
}),
Constraint.RelativeToParent((parent) =>
{
return parent.Height/2;
}));
this.Content = this.relativeLayout;
}
private void Button_Clicked(object sender, EventArgs e)
{
double width = 0;
if(this.moreWidth)
{
width = 120;
}
else
{
width = 80;
}
var c= BoundsConstraint.FromExpression((Expression<Func<Rectangle>>)(() => new Rectangle(0, 0, width, this.Content.Height)), new View[0]);
RelativeLayout.SetBoundsConstraint(this.view, c);
this.relativeLayout.ForceLayout();
this.moreWidth = !this.moreWidth;
}
}
Grazie per la tua eccellente risposta! È possibile utilizzare 'BoundsConstraint.FromExpression' insieme a' Constraint.RelativeToParent'? O puoi solo impostare valori per 'Rectangle'? Quello che sto cercando di fare è cambiare la larghezza di un elemento che occupa metà dello schermo. Pertanto devi conoscere l'altezza del genitore. Attualmente sto usando 'this.Content.Height', che sembra funzionare. Anche se devo testarlo più lontano. – testing
Dovrebbe funzionare in questo modo fintanto che tutti i vincoli sull'elemento che stai modificando sono Costanti o RelativeToParent (il BoundsConstraint è una combinazione di tutti e quattro i vincoli x/y/larghezza/altezza, quindi tutti dovrebbero rispettare questo criteri). Se qualcuno di essi utilizza RelativeToView, è necessario passare quelle viste in una matrice come secondo parametro a 'FromExpression()'. È difficile dirlo con certezza se questo hack funzionerebbe per qualsiasi cosa tranne Constant, a meno che non lo provi. E naturalmente dipende dagli interni, quindi è soggetto alla rottura della prossima versione XF. –
Ho provato a lavorare con 'RelativeToParent', ma ho faticato a usare la notazione corretta. Invece di una costante ho provato a usare 'Constraint.RelativeToParent ((parent) => {return parent.Height;})', ma ho ricevuto un messaggio come * troppi parametri *. Hai funzionato? – testing