Xamarin.Forms
Xamarin Relatives Layout
Suche…
Bemerkungen
Die Verwendung von ForceLayout in diesem Fall
Die Größe von Beschriftungen und Schaltflächen ändert sich je nach Text. Wenn die untergeordneten Elemente zum Layout hinzugefügt werden, bleibt ihre Größe in Breite und Höhe gleich 0. Zum Beispiel:
relativeLayout.Children.Add(label,
Constraint.RelativeToParent(parent => label.Width));
Der obige Ausdruck gibt 0 zurück, da width momentan 0 ist. Um dies zu umgehen , müssen wir auf das SizeChanged- Ereignis achten und wenn sich die Größe ändert, sollten wir das Layout erzwingen, um es neu zu zeichnen.
label.SizeChanged += (s, e) => relativeLayout.ForceLayout();
Für eine Ansicht wie BoxView ist dies nicht erforderlich . Weil wir ihre Größe bei der Instantiierung definieren können. Das andere ist, in beiden Fällen können wir deren Breite und Höhe als Einschränkung definieren, wenn wir sie zum Layout hinzufügen. Zum Beispiel:
relativeLayout.Children.Add(label,
Constraint.Constant(0),
Constraint.Constant(0),
//Width constraint
Constraint.Constant(30),
//Height constraint
Constraint.Constant(40));
Dadurch wird die Beschriftung an den Punkt 0, 0 angehängt. Breite und Höhe der Beschriftung betragen 30 und 40. Wenn der Text jedoch zu lang ist, werden einige der Beschriftungen möglicherweise nicht angezeigt. Wenn Ihr Etikett eine hohe Höhe hat oder haben kann, können Sie die LineBreakMode- Eigenschaft des Etiketts verwenden. Was kann den Text einschließen. Es gibt viele Optionen in LineBreakMode .
Seite mit einem einfachen Etikett in der Mitte
public class MyPage : ContentPage
{
RelativeLayout _layout;
Label MiddleText;
public MyPage()
{
_layout = new RelativeLayout();
MiddleText = new Label
{
Text = "Middle Text"
};
MiddleText.SizeChanged += (s, e) =>
{
//We will force the layout so it will know the actual width and height of the label
//Otherwise width and height of the label remains 0 as far as layout knows
_layout.ForceLayout();
};
_layout.Children.Add(MiddleText
Constraint.RelativeToParent(parent => parent.Width / 2 - MiddleText.Width / 2),
Constraint.RelativeToParent(parent => parent.Height / 2 - MiddleText.Height / 2));
Content = _layout;
}
}
Kiste für Kiste
public class MyPage : ContentPage
{
RelativeLayout _layout;
BoxView centerBox;
BoxView rightBox;
BoxView leftBox;
BoxView topBox;
BoxView bottomBox;
const int spacing = 10;
const int boxSize = 50;
public MyPage()
{
_layout = new RelativeLayout();
centerBox = new BoxView
{
BackgroundColor = Color.Black
};
rightBox = new BoxView
{
BackgroundColor = Color.Blue,
//You can both set width and hight here
//Or when adding the control to the layout
WidthRequest = boxSize,
HeightRequest = boxSize
};
leftBox = new BoxView
{
BackgroundColor = Color.Yellow,
WidthRequest = boxSize,
HeightRequest = boxSize
};
topBox = new BoxView
{
BackgroundColor = Color.Green,
WidthRequest = boxSize,
HeightRequest = boxSize
};
bottomBox = new BoxView
{
BackgroundColor = Color.Red,
WidthRequest = boxSize,
HeightRequest = boxSize
};
//First adding center box since other boxes will be relative to center box
_layout.Children.Add(centerBox,
//Constraint for X, centering it horizontally
//We give the expression as a paramater, parent is our layout in this case
Constraint.RelativeToParent(parent => parent.Width / 2 - boxSize / 2),
//Constraint for Y, centering it vertically
Constraint.RelativeToParent(parent => parent.Height / 2 - boxSize / 2),
//Constraint for Width
Constraint.Constant(boxSize),
//Constraint for Height
Constraint.Constant(boxSize));
_layout.Children.Add(leftBox,
//The x constraint will relate on some level to centerBox
//Which is the first parameter in this case
//We both need to have parent and centerBox, which will be called sibling,
//in our expression paramters
//This expression will be our second paramater
Constraint.RelativeToView(centerBox, (parent, sibling) => sibling.X - spacing - boxSize),
//Since we only need to move it left,
//it's Y constraint will be centerBox' position at Y axis
Constraint.RelativeToView(centerBox, (parent, sibling) => sibling.Y)
//No need to define the size constraints
//Since we initialize them during instantiation
);
_layout.Children.Add(rightBox,
//The only difference hear is adding spacing and boxSize instead of substracting them
Constraint.RelativeToView(centerBox, (parent, sibling) => sibling.X + spacing + boxSize),
Constraint.RelativeToView(centerBox, (parent, sibling) => sibling.Y)
);
_layout.Children.Add(topBox,
//Since we are going to move it vertically this thime
//We need to do the math on Y Constraint
//In this case, X constraint will be centerBox' position at X axis
Constraint.RelativeToView(centerBox, (parent, sibling) => sibling.X),
//We will do the math on Y axis this time
Constraint.RelativeToView(centerBox, (parent, sibling) => sibling.Y - spacing - boxSize)
);
_layout.Children.Add(bottomBox,
Constraint.RelativeToView(centerBox, (parent, sibling) => sibling.X),
Constraint.RelativeToView(centerBox, (parent, sibling) => sibling.Y + spacing + boxSize)
);
Content = _layout;
}
}