Résumé du chapitre 14. Disposition absolue
Remarque
Ce livre a été publié au printemps 2016 et n’a pas été mis à jour depuis. Il y a beaucoup dans le livre qui reste précieux, mais certains documents sont obsolètes, et certains sujets ne sont plus entièrement corrects ou complets.
Comme StackLayout
, AbsoluteLayout
dérive et Layout<View>
hérite d’une Children
propriété. AbsoluteLayout
implémente un système de disposition qui oblige le programmeur à spécifier les positions de ses enfants et, éventuellement, leur taille. La position est spécifiée par le coin supérieur gauche de l’enfant par rapport au coin supérieur gauche des unités indépendantes de l’appareil AbsoluteLayout
. AbsoluteLayout
implémente également une fonctionnalité de positionnement et de dimensionnement proportionnels.
AbsoluteLayout
doit être considéré comme un système de disposition à usage spécial à utiliser uniquement lorsque le programmeur peut imposer une taille aux enfants (par exemple, BoxView
des éléments) ou lorsque la taille de l’élément n’affecte pas le positionnement d’autres enfants. Les propriétés et VerticalOptions
les HorizontalOptions
propriétés n’ont aucun effet sur les enfants d’un AbsoluteLayout
.
Ce chapitre présente également la fonctionnalité importante des propriétés pouvant être liées attachées qui permettent aux propriétés définies dans une classe (dans ce cas AbsoluteLayout
) d’être attachées à une autre classe (enfant de l’objet AbsoluteLayout
).
AbsoluteLayout dans le code
Vous pouvez ajouter un enfant à la Children
collection d’une AbsoluteLayout
méthode standard Add
, mais AbsoluteLayout
fournit également une méthode étendue Add
qui vous permet de spécifier un Rectangle
. Une autre Add
méthode ne nécessite qu’un Point
, auquel cas l’enfant n’est pas contraint et se dimensionne lui-même.
Vous pouvez créer une Rectangle
valeur avec un constructeur qui nécessite quatre valeurs : les deux premières indiquant la position du coin supérieur gauche de l’enfant par rapport à son parent, et les deux autres indiquant la taille de l’enfant. Vous pouvez également utiliser un constructeur qui nécessite une Point
valeur et une Size
valeur.
Ces Add
méthodes sont illustrées dans AbsoluteDemo, qui positionne BoxView
les éléments à l’aide Rectangle
de valeurs et d’un Label
élément à l’aide d’une Point
valeur.
L’exemple ChessboardFixed utilise 32 BoxView
éléments pour créer le modèle d’échiquier. Le programme donne aux BoxView
éléments une taille codée en dur de 35 unités carrées. Il AbsoluteLayout
a sa HorizontalOptions
valeur et VerticalOptions
définie LayoutOptions.Center
sur , ce qui provoque la AbsoluteLayout
taille totale de 280 unités carrées.
Propriétés pouvant être liées jointes
Il est également possible de définir la position et, éventuellement, la taille d’un enfant d’une AbsoluteLayout
fois qu’il a été ajouté à la collection à l’aide Children
de la méthode AbsoluteLayout.SetLayoutBounds
statique. Le premier argument est l’enfant ; la seconde est un Rectangle
objet. Vous pouvez spécifier que les tailles enfants elles-mêmes horizontalement et/ou verticalement en définissant des valeurs de largeur et de hauteur sur la AbsoluteLayout.AutoSize
constante.
L’exemple ChessboardDynamic place le AbsoluteLayout
gestionnaire ContentView
avec un SizeChanged
gestionnaire pour appeler AbsoluteLayout.SetLayoutBounds
tous les enfants pour les rendre aussi volumineux que possible.
La propriété pouvant être liée jointe qui AbsoluteLayout
définit est le champ statique en lecture seule du type BindableProperty
nommé AbsoluteLayout.LayoutBoundsProperty
. La méthode statique AbsoluteLayout.SetLayoutBounds
est implémentée en appelant SetValue
l’enfant avec le AbsoluteLayout.LayoutBoundsProperty
. L’enfant contient un dictionnaire dans lequel la propriété pouvant être liée jointe et sa valeur sont stockées. Pendant la disposition, la AbsoluteLayout
valeur peut être obtenue en appelant AbsoluteLayout.GetLayoutBounds
, qui est implémentée avec un GetValue
appel.
Dimensionnement et positionnement proportionnels
AbsoluteLayout
implémente une fonctionnalité de dimensionnement et de positionnement proportionnels. La classe définit une deuxième propriété LayoutFlagsProperty
pouvant être liée, avec les méthodes AbsoluteLayout.SetLayoutFlags
statiques associées et AbsoluteLayout.GetLayoutFlags
.
L’argument auquel AbsoluteLayout.SetLayoutFlags
et la valeur de AbsoluteLayout.GetLayoutFlags
retour sont une valeur de type AbsoluteLayoutFlags
, une énumération avec les membres suivants :
None
(égal à 0)XProportional
(1)YProportional
(2)PositionProportional
(3)WidthProportional
(4)HeightProportional
(8)SizeProportional
(12)All
(\xFFFFFFFF)
Vous pouvez les combiner avec l’opérateur OR au niveau du bit C#.
Avec ces indicateurs définis, certaines propriétés de la Rectangle
structure des limites de disposition utilisées pour positionner et dimensionner l’enfant sont interprétées proportionnellement.
Lorsque l’indicateur WidthProportional
est défini, une Width
valeur de 1 signifie que l’enfant est la même largeur que le AbsoluteLayout
. Une approche similaire est utilisée pour la hauteur.
Le positionnement proportionnel prend en compte la taille. Lorsque l’indicateur XProportional
est défini, la X
propriété des limites de Rectangle
disposition est proportionnelle. La valeur 0 signifie que le bord gauche de l’enfant est positionné au bord gauche du bord gauche, AbsoluteLayout
mais qu’une position de 1 signifie que le bord droit de l’enfant est positionné au bord droit du AbsoluteLayout
, pas au-delà du bord droit de l’enfant AbsoluteLayout
comme prévu. Une X
propriété de 0,5 centre l’enfant horizontalement dans le AbsoluteLayout
.
L’exemple ChessboardProportional illustre l’utilisation du dimensionnement et du positionnement proportionnels.
Utilisation de coordonnées proportionnelles
Parfois, il est plus facile de penser à un positionnement proportionnel différemment de la façon dont il est implémenté dans le AbsoluteLayout
. Vous préférerez peut-être travailler avec des coordonnées proportionnelles où une X
propriété de 1 positionne le bord gauche de l’enfant (plutôt que le bord droit) sur le bord droit du AbsoluteLayout
.
Ce schéma de positionnement alternatif peut être appelé « coordonnées enfants fractionnaires ». Vous pouvez convertir des coordonnées enfants fractionnaires en limites de disposition requises pour AbsoluteLayout
utiliser les formules suivantes :
layoutBounds.X = (fractionalChildCoordinate.X / (1 - layoutBounds.Width))
layoutBounds.Y = (fractionalChildCoordinate.Y / (1 - layoutBounds.Height))
L’exemple ProportionalCoordinateCalc illustre cela.
AbsoluteLayout et XAML
Vous pouvez utiliser un AbsoluteLayout
code XAML et définir les propriétés pouvant être liées jointes sur les enfants d’un AbsoluteLayout
attribut à l’aide de valeurs d’attribut et AbsoluteLayout.LayoutBounds
AbsoluteLayout.LayoutFlags
. Ceci est illustré dans les exemples AbsoluteXamlDemo et ChessboardXaml. Ce dernier programme contient 32 BoxView
éléments, mais utilise un implicite Style
qui inclut la AbsoluteLayout.LayoutFlags
propriété pour conserver le balisage au minimum.
Un attribut en XAML qui se compose d’un nom de classe, d’un point et d’un nom de propriété est toujours une propriété pouvant être liée attachée.
Superpositions
Vous pouvez utiliser AbsoluteLayout
pour construire une superposition, qui couvre la page avec d’autres contrôles, peut-être pour protéger l’utilisateur de l’interaction avec les contrôles normaux de la page.
L’exemple SimpleOverlay illustre cette technique, et montre également la ProgressBar
mesure dans laquelle un programme a terminé une tâche.
Un peu d’amusement
L’exemple DotMatrixClock affiche l’heure actuelle avec un affichage de matrice de points 5x7 simulé. Chaque point est un BoxView
(il y a 228 d’entre eux) dimensionné et positionné sur le AbsoluteLayout
.
Le programme BouncingText anime deux Label
objets pour rebondir horizontalement et verticalement sur l’écran.