Czy można zmienić ograniczenia RelativeLayout
po ich ustawieniu jeden raz?Xamarin.Forms: Zmień ograniczenia RelativeLayout później
W dokumentacji widzę metody takie jak GetBoundsConstraint(BindableObject)
, ale myślę, że możesz ich używać tylko, jeśli masz plik XAML. Na razie próbuję to zrobić w kodzie. Mam null
jeśli staram
RelativeLayout.GetBoundsConstraint(this.label);
Jedynym sposobem znalazłem się jest usunięcie dzieci z układu i dodać go do nowych ograniczeń ponownie.
Przykład:
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;
}
}
Dzięki za znakomitą odpowiedź! Czy można używać 'BoundsConstraint.FromExpression' razem z' Constraint.RelativeToParent'? Czy możesz tylko ustawić wartości dla 'Rectangle'? Co próbuję zrobić, to zmienić szerokość elementu, który zajmuje połowę ekranu. Dlatego musisz znać wysokość nadrzędną. Obecnie używam 'this.Content.Height', który wydaje się działać. Chociaż muszę przetestować to dalej. – testing
Powinno działać tak, o ile wszystkie ograniczenia dla modyfikowanego elementu są stałe lub względne (ograniczenie BoundsConstraint jest kombinacją wszystkich czterech ograniczeń x/y/width/height, więc wszystkie te muszą spełnić to kryteria). Jeśli któryś z nich korzysta z RelativeToView, to musisz przekazać te widoki w tablicy jako drugi parametr 'FromExpression()'. Trudno powiedzieć na pewno, jeśli ten hack będzie działał dla niczego oprócz Stałego, chyba że go wypróbujesz. Oczywiście zależy to od wewnętrznych elementów, które mogą zostać uszkodzone w następnej wersji XF. –
Próbowałem pracować z 'RelativeToParent', ale walczyłem z użyciem poprawnej notacji. Zamiast stałej próbowałem użyć 'Constraint.RelativeToParent ((parent) => {return parent.Height;})', ale dostałem komunikat jak * zbyt wiele parametrów *. Czy to działa? – testing