← Tous les articles

Responsive Design Partie 3 : Rendre le contenu dynamique et adaptatif đŸ§©

Gemini said Cette image est une illustration 3D colorĂ©e montrant une petite mascotte rose souriante, en forme de flĂšche pointant vers le haut, qui se tient debout sur l'Ă©cran d'un grand smartphone posĂ© Ă  plat. La mascotte tient entre ses mains un panneau translucide sur lequel est Ă©crit en blanc : "Responsive Design, Partie 3 : Rendre le contenu dynamique et adaptatif". Autour du personnage et du tĂ©lĂ©phone, sur un fond bleu clair trĂšs doux, flottent en apesanteur divers petits Ă©lĂ©ments d'interface web, comme un diagramme circulaire, des graphiques Ă  barres et de petites fenĂȘtres de navigation, Ă©voquant l'univers de la crĂ©ation numĂ©rique.

  1. PrĂ©ambule : OĂč en sommes-nous ?
  2. Présentation des propriétés et paramÚtres que nous allons utiliser dans ce chapitre
    1. La propriĂ©tĂ© [Écran].Size (Le point de rupture)
  3. Tutoriel : Mise en pratique des techniques d’adaptation
    1. Étape 1 : Le Menu de navigation (Technique : Afficher ou Masquer)
    2. Étape 2 : Les cartes KPI (Technique : Repositionner)
    3. Étape 3 : La galerie de donnĂ©es (Technique : Ajuster dynamiquement / Reflow)
  4. Étape 4 : Solutions crĂ©atives
  5. Étape 5 : La remodĂ©lisation (Master / DĂ©tails)
  6. Conclusion
    1. Et aprĂšs ?

PrĂ©ambule : OĂč en sommes-nous ?

Faisons un rapide récapitulatif :

  • Dans la Partie 1, nous avons explorĂ© les grandes stratĂ©gies du design rĂ©actif (Reflow, Repositionnement, Afficher/Masquer) et l’approche “Mobile-First”.

  • Dans la Partie 2, nous avons mis en pratique la structure en utilisant les “Group Containers” auto-adaptatifs (en-tĂȘte, menu latĂ©ral, corps de page, pied de page), crĂ©ant ainsi une disposition fluide qui s’étire et se compresse sans utiliser de coordonnĂ©es X ou Y.

L’objectif de cette Partie 3 est de remplir cette structure. Nous allons intĂ©grer un menu de navigation, des indicateurs de performance (KPI) et une galerie de donnĂ©es. Nous allons configurer ces Ă©lĂ©ments internes pour qu’ils appliquent concrĂštement les thĂ©ories d’adaptation vues dans le premier volet, en exploitant les propriĂ©tĂ©s de Power Apps.

Présentation des propriétés et paramÚtres que nous allons utiliser dans ce chapitre

La propriĂ©tĂ© [Écran].Size (Le point de rupture)

Cette image est une illustration 3D montrant la mĂȘme petite mascotte rose, qui tient cette fois-ci un gros mĂštre ruban violet entre ses mains gantĂ©es de blanc. Le personnage affiche une expression lĂ©gĂšrement perplexe ou concentrĂ©e et dĂ©roule vers la gauche un ruban de mesure jaune trĂšs lumineux. Juste au-dessus de ce ruban Ă©tendu flottent trois appareils Ă©lectroniques de tailles diffĂ©rentes, alignĂ©s du plus petit au plus grand : un smartphone, une tablette et un Ă©cran d'ordinateur, affichant tous des interfaces aux blocs colorĂ©s. Au-dessus de ces Ă©crans, les chiffres 1, 2, 3 et 4 apparaissent sous forme de nĂ©ons lumineux multicolores suspendus dans les airs, le tout sur un fond bleu doux parsemĂ© de petites particules scintillantes.

Pour rendre le contenu d’un Ă©cran rĂ©actif, nous allons principalement nous appuyer sur la propriĂ©tĂ© de taille de l’écran, appelĂ©e directement par son nom (par exemple 'Mon Ă©cran'.Size).

Cette propriĂ©tĂ© renvoie un entier de 1 Ă  4 reprĂ©sentant la taille de l’appareil. C’est ce que l’on appelle le “Breakpoint” (point de rupture). Ces seuils de basculement peuvent d’ailleurs ĂȘtre configurĂ©s sur mesure pour votre application via la propriĂ©tĂ© SizeBreakpoints de l’objet App, dont la valeur par dĂ©faut est [600; 900; 1200].

Astuce : Quand une application a un format “RĂ©actif” dans ses paramĂštres, des contrĂŽles de facteur de forme apparaissent dans l’éditeur en bas de l’écran. Ces boutons vous permettent de changer instantanĂ©ment la taille de la zone de conception (le canevas) pour simuler les diffĂ©rents appareils, et ce, en se basant exactement sur les SizeBreakpoints paramĂ©trĂ©s dans l’objet App !

Voici la correspondance par défaut :

AppareilValeur SizeLargeur de l'écran (par défaut)
Téléphone1<= 600 px
Tablette portrait2601 px - 900 px
Tablette paysage3901 px - 1200 px
Ordinateur de bureau4> 1200 px

Avertissement : Il est frĂ©quent de voir l’utilisation de App.ActiveScreen.Size dans divers exemples pour cibler cette valeur. Cependant, cette pratique est dĂ©conseillĂ©e : la valeur renvoyĂ©e par App.ActiveScreen n’est pas actualisĂ©e si l’utilisateur modifie l’orientation de son appareil (passage du mode portrait au mode paysage) en cours d’utilisation. Pour garantir un rendu fiable, il est prĂ©fĂ©rable d’appeler systĂ©matiquement la propriĂ©tĂ© Size par le nom exact de l’écran concernĂ©. (Note : J’ai profitĂ© de la rĂ©daction de cet article pour faire remonter ce bug Ă  l’équipe produit. Il se peut donc que ce comportement ait Ă©tĂ© corrigĂ© Ă  l’heure oĂč vous lisez ces lignes).

Tutoriel : Mise en pratique des techniques d’adaptation

Étape 1 : Le Menu de navigation (Technique : Afficher ou Masquer)

Cette image est une illustration 3D mettant en scĂšne la mĂȘme mascotte rose souriante, qui tient cette fois-ci une petite baguette magique d'oĂč jaillit une traĂźnĂ©e d'Ă©tincelles lumineuses. Elle pointe cette baguette vers un grand smartphone flottant verticalement Ă  cĂŽtĂ© d'elle. L'Ă©cran du tĂ©lĂ©phone affiche une interface de navigation sur fond sombre, prĂ©sentant un menu avec des icĂŽnes colorĂ©es accompagnĂ©es de texte : une maison orange pour "Accueil", la silhouette d'une personne en bleu pour "Profil", une icĂŽne verte reprĂ©sentant un outil de crĂ©ation, et une roue crantĂ©e violette pour "ParamĂštres", ainsi qu'une icĂŽne de menu classique Ă  trois lignes en haut Ă  droite. L'ensemble de la scĂšne baigne dans une atmosphĂšre fĂ©erique sur un fond bleu nuit parsemĂ© de petites particules scintillantes.

Dans notre conteneur latĂ©ral gauche (ctn_Index_1), insĂ©rez un contrĂŽle moderne de type “Toolbar” (Barre d’outils) et nommez-le tlb_Menu_1 pour faire office de menu.

Sur un Ă©cran d’ordinateur, l’espace permet d’afficher l’icĂŽne et le texte du menu. Sur un smartphone, ce texte repousserait le contenu principal hors de la zone visible de l’écran. Nous allons donc Afficher/Masquer le texte de maniĂšre conditionnelle.

1. Rappel : La largeur du conteneur parent : Souvenez-vous, dans la Partie 2, nous avions configurĂ© la propriĂ©tĂ© Largeur (Width) du conteneur de notre menu latĂ©ral (ctn_Index_1) pour qu’elle s’adapte en fonction de l’écran :

Power Fx
If('Mon écran réactif Partie 3'.Size < 2, 60, 210)

Explication : Si la taille de l’écran est infĂ©rieure Ă  2 (donc un mobile), la largeur du menu se rĂ©duit Ă  60px. Sinon, elle s’établit Ă  210px.

2. Adapter la disposition du menu : Nous allons utiliser la mĂȘme logique pour afficher ou masquer le texte du menu. Ajoutez un contrĂŽle Barre d’outils(Toolbar) (tlb_Menu_1) et modifiez sa propriĂ©tĂ© Disposition (Layout) avec cette formule, qui s’inspire de celle que nous avons utilisĂ© pour le container :

Power Fx
If('Mon écran réactif Partie 3'.Size < 2,
  'Toolbar.Layout'.IconOnly,
  'Toolbar.Layout'.IconBefore
)

Explication : Sur mobile (Size 1), la barre d’outils bascule en mode “IcĂŽne uniquement”. Sur des Ă©crans plus larges, elle affiche “IcĂŽne + Texte”. L’ergonomie est prĂ©servĂ©e en limitant l’encombrement horizontal.

Étape 2 : Les cartes KPI (Technique : Repositionner)

En haut de notre contenu principal, nous avons ajouté un conteneur horizontal (ctn_kpi_1) nous allons y placer trois petites cartes affichant des métriques (Clients, Ventes, CA).

Vous pouvez copier-coller le code YAML ci-dessous directement Ă  l’intĂ©rieur de votre conteneur ctn_kpi_1 pour gĂ©nĂ©rer automatiquement ces trois cartes KPI :

Code YAML cartes KPI (Déployer pour voir le code)
YAML
- kpi_Clients_1:
    Control: GroupContainer@1.5.0
    Variant: AutoLayout
    Properties:
      AlignInContainer: =AlignInContainer.SetByContainer
      DropShadow: =DropShadow.Semilight
      Fill: =RGBA(255, 244, 240, 1)
      Height: =40
      LayoutAlignItems: =LayoutAlignItems.Center
      LayoutDirection: =LayoutDirection.Horizontal
      LayoutJustifyContent: =LayoutJustifyContent.Center
      LayoutMinHeight: =50
      LayoutMinWidth: =210
      LayoutWrap: =true
      PaddingBottom: =5
      PaddingLeft: =5
      PaddingRight: =5
      PaddingTop: =5
      RadiusBottomLeft: =8
      RadiusBottomRight: =8
      RadiusTopLeft: =8
      RadiusTopRight: =8
      X: =40
      Y: =40
    Children:
      - img_IconClients_1:
          Control: Image@2.2.3
          Properties:
            AlignInContainer: =AlignInContainer.Center
            FillPortions: =1
            Height: =30
            Image: ="data:image/svg+xml;utf8, " & EncodeUrl("<svg viewBox='0 0 24 24' xmlns='[http://www.w3.org/2000/svg](http://www.w3.org/2000/svg)'><path d='M16 11c1.66 0 2.99-1.34 2.99-3S17.66 5 16 5c-1.66 0-3 1.34-3 3s1.34 3 3 3zm-8 0c1.66 0 2.99-1.34 2.99-3S9.66 5 8 5C6.34 5 5 6.34 5 8s1.34 3 3 3zm0 2c-2.33 0-7 1.17-7 3.5V19h14v-2.5c0-2.33-4.67-3.5-7-3.5zm8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45V19h6v-2.5c0-2.33-4.67-3.5-7-3.5z' fill='#D83B01'/></svg>")
            LayoutMinHeight: =28
            LayoutMinWidth: =28
            Width: =40
      - lbl_ValueClients_1:
          Control: Label@2.5.1
          Properties:
            Align: =Align.Center
            AlignInContainer: =AlignInContainer.Center
            Color: =RGBA(216, 59, 1, 1)
            FillPortions: =1
            FontWeight: =FontWeight.Bold
            Height: =30
            LayoutMinHeight: =28
            LayoutMinWidth: =28
            Size: =11
            Text: ="34"
- kpi_Ventes_1:
    Control: GroupContainer@1.5.0
    Variant: AutoLayout
    Properties:
      AlignInContainer: =AlignInContainer.SetByContainer
      DropShadow: =DropShadow.Semilight
      Fill: =RGBA(240, 255, 244, 1)
      Height: =40
      LayoutAlignItems: =LayoutAlignItems.Center
      LayoutDirection: =LayoutDirection.Horizontal
      LayoutJustifyContent: =LayoutJustifyContent.Center
      LayoutMinHeight: =50
      LayoutMinWidth: =210
      LayoutWrap: =true
      PaddingBottom: =5
      PaddingLeft: =5
      PaddingRight: =5
      PaddingTop: =5
      RadiusBottomLeft: =8
      RadiusBottomRight: =8
      RadiusTopLeft: =8
      RadiusTopRight: =8
      X: =40
      Y: =40
    Children:
      - img_IconVentes_1:
          Control: Image@2.2.3
          Properties:
            AlignInContainer: =AlignInContainer.Start
            FillPortions: =1
            Height: =30
            Image: ="data:image/svg+xml;utf8, " & EncodeUrl("<svg viewBox='0 0 24 24' xmlns='[http://www.w3.org/2000/svg](http://www.w3.org/2000/svg)'><path d='M7 18c-1.1 0-1.99.9-1.99 2S5.9 22 7 22s2-.9 2-2-.9-2-2-2zM1 2v2h2l3.6 7.59-1.35 2.45c-.16.28-.25.61-.25.96 0 1.1.9 2 2 2h12v-2H7.42c-.14 0-.25-.11-.25-.25l.03-.12.9-1.63h7.45c.75 0 1.41-.41 1.75-1.03l3.58-6.49c.08-.14.12-.31.12-.48 0-.55-.45-1-1-1H5.21l-.94-2H1zm16 16c-1.1 0-1.99.9-1.99 2s.89 2 1.99 2 2-.9 2-2-.9-2-2-2z' fill='#107C10'/></svg>")
            LayoutMinHeight: =28
            LayoutMinWidth: =28
            Width: =40
      - lbl_ValueVentes_1:
          Control: Label@2.5.1
          Properties:
            Align: =Align.Center
            AlignInContainer: =AlignInContainer.Start
            Color: =RGBA(16, 124, 16, 1)
            FillPortions: =1
            FontWeight: =FontWeight.Bold
            Height: =30
            LayoutMinHeight: =28
            LayoutMinWidth: =28
            Size: =11
            Text: ="128"
- kpi_CA_1:
    Control: GroupContainer@1.5.0
    Variant: AutoLayout
    Properties:
      AlignInContainer: =AlignInContainer.SetByContainer
      DropShadow: =DropShadow.Semilight
      Fill: =RGBA(240, 244, 255, 1)
      Height: =40
      LayoutAlignItems: =LayoutAlignItems.Center
      LayoutDirection: =LayoutDirection.Horizontal
      LayoutJustifyContent: =LayoutJustifyContent.Center
      LayoutMinHeight: =50
      LayoutMinWidth: =210
      LayoutWrap: =true
      PaddingBottom: =5
      PaddingLeft: =5
      PaddingRight: =5
      PaddingTop: =5
      RadiusBottomLeft: =8
      RadiusBottomRight: =8
      RadiusTopLeft: =8
      RadiusTopRight: =8
      X: =40
      Y: =40
    Children:
      - img_IconCA_1:
          Control: Image@2.2.3
          Properties:
            AlignInContainer: =AlignInContainer.Start
            FillPortions: =1
            Height: =30
            Image: ="data:image/svg+xml;utf8, " & EncodeUrl("<svg viewBox='0 0 24 24' xmlns='[http://www.w3.org/2000/svg](http://www.w3.org/2000/svg)'><path d='M16 6l2.29 2.29-4.88 4.88-4-4L2 16.59 3.41 18l6-6 4 4 6.3-6.29L22 12V6z' fill='#0078D4'/></svg>")
            LayoutMinHeight: =28
            LayoutMinWidth: =28
            Width: =40
      - lbl_ValueCA_1:
          Control: Label@2.5.1
          Properties:
            Align: =Align.Center
            AlignInContainer: =AlignInContainer.Start
            Color: =App.Theme.Colors.Primary
            FillPortions: =1
            FontWeight: =FontWeight.Bold
            Height: =30
            LayoutMinHeight: =28
            LayoutMinWidth: =28
            Size: =11
            Text: ="45.2 K€"







L’objectif : Sur un grand Ă©cran, ces trois blocs s’alignent cĂŽte Ă  cĂŽte. Sur un smartphone, l’espace horizontal est insuffisant. La technique du Repositionnement consiste Ă  les empiler verticalement lorsque l’espace manque. L’utilisation des Layout Containers simplifie cette Ă©tape grĂące Ă  la propriĂ©tĂ© de renvoi Ă  la ligne automatique.

Toutefois, une spĂ©cificitĂ© technique doit ĂȘtre gĂ©rĂ©e : dans Power Apps, un conteneur horizontal configurĂ© avec un renvoi Ă  la ligne n’ajuste pas automatiquement sa propre hauteur globale pour s’adapter aux Ă©lĂ©ments passĂ©s Ă  la ligne infĂ©rieure. Nous devons inverser la logique : ce n’est pas le conteneur qui va dĂ©terminer la taille et la position des objets qu’il contient, mais les objets qu’il contient qui vont dĂ©terminer sa hauteur. Pour cela, nous nous appuierons sur la position en Y et la hauteur de la derniĂšre carte KPI pour dĂ©terminer la hauteur du conteneur.

💡Pour rĂ©aliser cette fonctionnalitĂ©, nous allons exploiter un comportement mĂ©connu : les objets dans un container ont des propriĂ©tĂ©s de sortie X et Y qui correspondent Ă  leur position dans le container. ce qui sera bien utile pour dĂ©terminer la hauteur que notre container doit avoir pour afficher tous les Ă©lĂ©ments qui ont Ă©tĂ© renvoyĂ© Ă  la ligne.

1. Configurer les cartes enfants : Pour que le paramĂštre de renvoi Ă  la ligne s’active, les Ă©lĂ©ments Ă  l’intĂ©rieur doivent possĂ©der une largeur minimale fixe.

  • SĂ©lectionnez vos trois blocs KPI.

  • DĂ©finissez leur propriĂ©tĂ© Largeur minimale (LayoutMinWidth) Ă  une valeur pertinente, par exemple 210.

2. Configurer le conteneur parent (Les KPI) :

  • SĂ©lectionnez ctn_kpi_1.

  • Assurez-vous que la Direction (LayoutDirection) est configurĂ©e sur Horizontale.

  • Activez la propriĂ©tĂ© Renvoyer Ă  la ligne (LayoutWrap) en la passant Ă  true.

  • Afin de forcer l’ajustement manuel de sa hauteur, dĂ©sactivez son expansion verticale automatique (Portions de remplissage (FillPortions) sur 0).

  • Enfin, modifiez la propriĂ©tĂ© Hauteur (Height) avec la formule ci-dessous :

Texte
Height: =kpi_CA_1.Y + kpi_CA_1.Height + Self.PaddingBottom

Explication : Cette formule indique au conteneur parent de calculer sa hauteur en fonction de la position du dernier Ă©lĂ©ment (ici kpi_CA_1). Elle prend sa position verticale sur l’axe (Y), y ajoute sa hauteur (Height), puis y additionne la marge infĂ©rieure du conteneur parent (Self.PaddingBottom). Ainsi, lorsque l’espace se rĂ©duit et que les KPI passent Ă  la ligne, le conteneur calcule sa nouvelle position et s’agrandit vers le bas de maniĂšre fluide.

💡Notez que les container des cartes KPI conservent leur propriĂ©tĂ© “largeur flexible”, quand les 3 cartes sont rĂ©parties sur deux lignes, la derniĂšre occupe toute la largeur :

⚠ Attention : Avec cette mĂ©thode, nous utilisons la position du dernier objet dans le container, s’il est dĂ©place ou si un objet est placĂ© aprĂšs lui, le comportement du container pourrait s’en trouver perturbĂ©

Étape 3 : La galerie de donnĂ©es (Technique : Ajuster dynamiquement / Reflow)

En dessous de nos KPI, nous allons crĂ©er une galerie pour afficher une liste d’élĂ©ments, que nous structurerons avec un contrĂŽle de carte moderne.

1. Création de la galerie :

  • InsĂ©rez une Galerie verticale dans le conteneur ctn_Content_1 et nommez-la gal_Cards_1.

  • DĂ©finissez ses ÉlĂ©ments (Items) avec des donnĂ©es de test : =Table(CustomGallerySample, CustomGallerySample, CustomGallerySample).

  • Changez la disposition par dĂ©faut pour un modĂšle vide.

  • Passez son Remplissage du modĂšle (TemplatePadding) Ă  0 (nous allons gĂ©rer les marges directement sur la carte Ă  l’intĂ©rieur).

  • Dans sa propriĂ©tĂ© Taille du modĂšle (TemplateSize), ajoutez Max( 
 ; 90) au tour de la formule. Cela empĂȘchera les lignes de la galerie d’ĂȘtre rĂ©duites en deçà de 90 pixels. vous devriez obtenir la formule :

Power Fx
Max(If(Self.Layout = Layout.Horizontal; Min(280; Self.Width - 60); Min(280; Self.Height - 60));90)

2. Création de la carte interne :

  • SĂ©lectionnez la premiĂšre ligne (le modĂšle) de votre galerie et insĂ©rez-y un contrĂŽle moderne Carte (ModernCard) et nommez-le Card1_1.

  • Liez les propriĂ©tĂ©s de la carte aux donnĂ©es de la galerie. Par exemple :
    • Titre (Title) : =ThisItem.SampleHeading

    • Sous-titre (Subtitle) : =ThisItem.SampleText

    • Image (HeaderImage) : =ThisItem.SampleImage

  • DĂ©finissez les coordonnĂ©es de la carte : X et Y Ă  8. Nous nous servirons de cet espacement comme marges.

  • Ajustez dynamiquement sa taille pour qu’elle remplisse l’espace du modĂšle tout en respectant ces marges :
    • Largeur (Width) : =Parent.TemplateWidth - Self.X * 2 - 5 (le -5 compense la barre de dĂ©filement potentielle, cela Ă©vitera que “l’ascenseur” ne tronque le contenu de la galerie)

    • Hauteur (Height) : =Parent.TemplateHeight - Self.Y * 2

  • Nous allons limiter la hauteur du modĂšle de la galerie, afin que celui-ci ne soit pas trop important sur les grands Ă©crans, repĂ©rez le paramĂštre Taille du modĂšle (TemplateSize) : Il contiendra peut ĂȘtre la formule suivante qui est liĂ©e au modĂšle galerie verticale vide :
Power Fx
If(Self.Layout = Layout.Horizontal; Min(280; Self.Width - 60); Min(280; Self.Height - 60))
  • Ajoutez un Max( 
 ; 90) autour de cette formule pour obtenir :
Power Fx
Max(If(Self.Layout = Layout.Horizontal; Min(280; Self.Width - 60); Min(280; Self.Height - 60));90)

Vous devriez obtenir ce résultat, une galerie contenant une carte sur une colonne :

Nous allons maintenant appliquer la technique du Reflow s’appliquera. PlutĂŽt que d’avoir une liste dĂ©roulante d’une seule colonne, l’objectif est d’afficher 1 colonne sur smartphone, 2 ou 3 sur tablette, et jusqu’à 6 sur un grand Ă©cran PC.

Pour cela, nous allons manipuler la propriĂ©tĂ© Nombre d’inclusions (WrapCount) de la galerie (qui n’accepte qu’une valeur comprise entre 1 et 10, toute valeur supĂ©rieure ou infĂ©rieure Ă©tant ignorĂ©e) avec une formule mathĂ©matique basĂ©e sur la largeur :

Texte
WrapCount: =Min(Max(1, Trunc(Self.Width / 250, 0)), 6)

Explication de cette formule :

  1. Self.Width / 250 : La formule divise la largeur totale disponible de la galerie par la largeur souhaitĂ©e pour une carte (ici 250px). Cela indique combien de cartes peuvent thĂ©oriquement ĂȘtre alignĂ©es.

  2. Trunc(..., 0) : La fonction arrondit ce rĂ©sultat Ă  l’entier infĂ©rieur (ex: si l’espace permet 2.8 cartes, on limite Ă  2 colonnes pour Ă©viter qu’elles ne soient tronquĂ©es).

  3. Max(1, ...) : Cette fonction agit comme une sĂ©curitĂ© pour forcer un minimum de 1 colonne, mĂȘme sur un Ă©cran trĂšs Ă©troit.

  4. Min(..., 6) : Cette fonction plafonne l’affichage Ă  6 colonnes maximum sur les Ă©crans ultra-larges afin de maintenir la lisibilitĂ© de l’information (et nous assure de ne jamais dĂ©passer la limite technique de 10 inhĂ©rente Ă  cette propriĂ©tĂ©).

C’est le principe de base du design fluide : le composant calcule sa disposition optimale en temps rĂ©el selon l’espace allouĂ©.

Alternative plus simple : Si les mathĂ©matiques vous rebutent, il existe une mĂ©thode alternative beaucoup plus simple consistant Ă  lier directement ce nombre d’inclusions Ă  la propriĂ©tĂ© de taille de l’écran :

Texte
WrapCount: ='Mon écran'.Size

RĂ©sultat attendu : Puisque la propriĂ©tĂ© Size renvoie un chiffre allant de 1 Ă  4, votre galerie affichera automatiquement 1 colonne sur un tĂ©lĂ©phone, 2 sur une tablette en mode portrait, 3 sur une tablette en mode paysage, et 4 sur un Ă©cran d’ordinateur de bureau. C’est une solution extrĂȘmement rapide Ă  mettre en place et trĂšs souvent suffisante pour la majoritĂ© des besoins !

💡 Information : L’exemple est montrĂ© avec une galerie verticale, mais la logique sera la mĂȘme avec une galerie horizontale, sauf que le nombre d’inclusions fera apparaĂźtre des lignes Ă  la place des colonnes.

⚠ Avertissement : Le nombre d’inclusions n’est pas disponible sur les galeries Ă  hauteur flexible.

Étape 4 : Solutions crĂ©atives

Parfois, la solution responsive idéale ne réside pas dans les propriétés natives des conteneurs, mais dans des astuces plus originales. Voici un exemple concret : gérer un texte long dans un espace restreint (comme un pied de page) sans faire déborder le design.

Au lieu de tronquer un texte long ou de forcer un retour Ă  la ligne qui augmenterait inĂ©vitablement la hauteur de l’écran (ce qui est gĂȘnant pour un pied de page fixe comme notre ctn_Footer_1), nous pouvons utiliser un texte dĂ©filant de type “marquee” grĂące au composant HTML de Power Apps.

Création du texte défilant :

  1. Dans votre conteneur de pied de page (ctn_Footer_1), insérez un contrÎle Texte HTML (HtmlViewer) et nommez-le HtmlText1_1.

  2. DĂ©finissez son Alignement dans le conteneur (AlignInContainer) sur Stretch et ses Portions de remplissage (FillPortions) Ă  1 pour qu’il occupe tout l’espace disponible horizontalement.

  3. Passez toutes ses marges intérieures (Padding) à 0.

  4. Dans la propriété HtmlText, insérez le code suivant qui tire parti de la balise HTML <marquee> :

Texte
="<marquee direction='left' scrollamount='3' behavior='scroll' style='font-size:16px; background:#0000; padding:0px;'>
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi.
</marquee>"

Cette technique offre une excellente rĂ©ponse au manque d’espace sur les mobiles tout en conservant l’intĂ©gralitĂ© de l’information accessible pour l’utilisateur.

Texte défilant avec du lorem ipsum à titre d'exemple

⚠ Avertissement : Attention cependant Ă  veiller Ă  ce que cette solution ne perturbe pas l’accessibilitĂ© de votre application. Les textes en mouvement continu peuvent ĂȘtre difficiles Ă  lire pour certains utilisateurs ou perturber l’utilisation de lecteurs d’écran. À utiliser avec parcimonie !

Étape 5 : La remodĂ©lisation (Master / DĂ©tails)

L’écran “tableau de bord” que nous avons dĂ©veloppĂ© jusqu’à prĂ©sent (avec ses indicateurs et sa galerie) ne se prĂȘte pas vraiment Ă  une dĂ©monstration de la technique de RemodĂ©lisation (Rearchitect). Par chance, Power Apps propose nativement un modĂšle d’écran parfait pour illustrer cette stratĂ©gie : l’écran “Table et formulaire” (composĂ© comme son nom l’indique : d’une table et d’un formulaire, gĂ©nĂ©rable en un clic depuis l’éditeur). Ajoutez cet Ă©cran depuis le volet “Arborescence”:

Cette technique consiste Ă  modifier l’architecture mĂȘme de la page en fonction de l’espace. Sur un Ă©cran d’ordinateur (ou une tablette), l’utilisateur voit Ă  la fois la liste des Ă©lĂ©ments Ă  gauche (Master) et le dĂ©tail du formulaire Ă  droite (Details). Sur smartphone en revanche, l’écran est trop Ă©troit pour afficher les deux cĂŽte Ă  cĂŽte : l’interface se mĂ©tamorphose alors en une navigation “à deux vues” oĂč l’on affiche soit la liste, soit le formulaire.

L’astuce repose sur l’interaction entre deux conteneurs frĂšres (SidebarContainer1 pour la table et RightContainer1 pour le formulaire) et des variables de contexte pilotĂ©es par l’utilisateur (isItemSelected et newMode).

1. Le comportement sur grand écran (Tablette / PC) :

Lorsque Screen2.Size est supĂ©rieur Ă  ScreenSize.Small (soit une valeur > 1), la taille de l’écran n’est pas considĂ©rĂ©e comme contraignante :

  • Les deux conteneurs ont leur propriĂ©tĂ© Visible (Visible) Ă©valuĂ©e Ă  true. Ils sont donc affichĂ©s simultanĂ©ment.

  • La rĂ©partition opĂšre grĂące Ă  la propriĂ©tĂ© Portions de remplissage (FillPortions). Le panneau de gauche (Table) se voit attribuer 3 portions, et celui de droite (Formulaire) reçoit 7 portions. Le moteur de rendu divise donc naturellement l’écran en un ratio 30% / 70%.

2. Le comportement sur petit écran (Smartphone) :

Lorsque l’écran bascule au format tĂ©lĂ©phone (Screen2.Size = ScreenSize.Small), la logique change du tout au tout. Les propriĂ©tĂ©s d’affichage deviennent strictement conditionnelles et “s’écoutent” mutuellement :

Pour le panneau de gauche contenant la Table (SidebarContainer1) :

Power Fx
Visible: = If(And(Screen2.Size = ScreenSize.Small; Or(newMode; isItemSelected)); false; true) FillPortions: =If(And(Screen2.Size = ScreenSize.Small; Or(newMode; isItemSelected)); 0; 3) 

Explication : Si nous sommes sur un petit Ă©cran ET que l’utilisateur a sĂ©lectionnĂ© un Ă©lĂ©ment (isItemSelected) OU a cliquĂ© sur le bouton “Nouveau” (newMode), la liste comprend qu’elle doit laisser sa place : sa visibilitĂ© passe Ă  false et ses portions tombent Ă  0. Dans le cas contraire, elle reste visible et occupe 100% de l’écran (car l’autre conteneur sera masquĂ©).

Pour le panneau de droite contenant le Formulaire (RightContainer1) :

Power Fx
Visible: = If(Or(deleteMode; And(Screen2.Size = ScreenSize.Small; !newMode; !isItemSelected)); false; true) 

Explication : Par dĂ©faut sur un petit Ă©cran, si l’utilisateur n’a encore rien sĂ©lectionnĂ© (!isItemSelected) ET n’est pas en train de crĂ©er un Ă©lĂ©ment (!newMode), le formulaire reste cachĂ© (false). Le panneau libĂšre ainsi tout l’espace pour laisser la table s’afficher. DĂšs que l’utilisateur interagit avec la table, ce panneau devient visible et s’approprie ses 7 portions habituelles (soit la totalitĂ© de l’écran puisque le panneau de la table est passĂ© Ă  0).

Conseil : ScreenSize.Small est une variable d’énumĂ©ration interne de Power Apps qui Ă©quivaut simplement au chiffre 1. L’utiliser rend vos formules sĂ©mantiquement plus claires Ă  lire qu’un simple >= 1.

GrĂące Ă  cette jonglerie intelligente sur les propriĂ©tĂ©s Visible et FillPortions, l’expĂ©rience utilisateur se transforme de maniĂšre spectaculaire, passant d’un seul Ă©cran riche sur PC Ă  un processus de navigation par â€œĂ©crans virtuels” fluide sur mobile !

💡 Aviez-vous remarquĂ© ? : Les modĂšles d’écrans rĂ©actifs proposĂ©s nativement intĂšgrent chacun une des 6 techniques dĂ©crites dans la partie 1 de cet article, les voici :

(*) Pour la disposition adaptative de l’écran “entĂȘte et table”, c’est surtout liĂ© au que le design adaptatif est directement intĂ©grĂ© Ă  l’objet Table

Microsoft a rĂ©cemment mis Ă  jour sa documentation sur ces Ă©crans, n’hĂ©sitez pas Ă  la consulter.

Conclusion

Si vous souhaitez vĂ©rifier votre travail et comparer votre Ă©cran avec le modĂšle final, voici le code YAML complet de l’écran rĂ©alisĂ© tout au long de cette partie. Vous pouvez le copier-coller tel quel dans votre interface Power Apps :

Déployer pour voir le code
YAML
Screens:
  Mon Ă©cran rĂ©actif Partie 3:
    Children:
      - ctn_Main_1:
          Control: GroupContainer@1.5.0
          Variant: AutoLayout
          Properties:
            Fill: =RGBA(200,200,200,0.2)
            Height: =Parent.Height
            LayoutDirection: =LayoutDirection.Vertical
            LayoutGap: =8
            PaddingBottom: =8
            PaddingLeft: =8
            PaddingRight: =8
            PaddingTop: =8
            Width: =Parent.Width
          Children:
            - ctn_Header_1:
                Control: GroupContainer@1.5.0
                Variant: AutoLayout
                Properties:
                  DropShadow: =DropShadow.Semilight
                  Fill: =App.Theme.Colors.Primary
                  FillPortions: =0
                  Height: =54
                  LayoutAlignItems: =LayoutAlignItems.Center
                  LayoutDirection: =LayoutDirection.Horizontal
                  LayoutGap: =15
                  LayoutJustifyContent: =LayoutJustifyContent.Center
                  LayoutMinHeight: =80
                  PaddingBottom: =8
                  PaddingLeft: =15
                  PaddingRight: =15
                  PaddingTop: =8
                  RadiusBottomLeft: =8
                  RadiusBottomRight: =8
                  RadiusTopLeft: =8
                  RadiusTopRight: =8
                Children:
                  - lbl_Title_1:
                      Control: Label@2.5.1
                      Properties:
                        AlignInContainer: =AlignInContainer.Stretch
                        Color: =RGBA(255, 255, 255, 1)
                        FillPortions: =1
                        FontWeight: =FontWeight.Semibold
                        OnSelect: =Navigate(Screen1)
                        PaddingLeft: =20
                        Size: =15
                        Text: ="Mon Application ""RĂ©active"""
                  - img_userPhoto_1:
                      Control: Image@2.2.3
                      Properties:
                        AlignInContainer: =AlignInContainer.Stretch
                        Height: =80
                        Image: =User().Image
                        ImagePosition: =ImagePosition.Fill
                        LayoutMinHeight: =16
                        LayoutMinWidth: =16
                        RadiusBottomLeft: =Self.Height*0.5
                        RadiusBottomRight: =Self.Height*0.5
                        RadiusTopLeft: =Self.Height*0.5
                        RadiusTopRight: =Self.Height*0.5
                        Width: =Self.Height
            - ctn_Body_1:
                Control: GroupContainer@1.5.0
                Variant: AutoLayout
                Properties:
                  DropShadow: =DropShadow.None
                  Fill: =Color.Transparent
                  LayoutDirection: =LayoutDirection.Horizontal
                  LayoutGap: =8
                  RadiusBottomLeft: =8
                  RadiusBottomRight: =8
                  RadiusTopLeft: =8
                  RadiusTopRight: =8
                Children:
                  - ctn_Index_1:
                      Control: GroupContainer@1.5.0
                      Variant: AutoLayout
                      Properties:
                        DropShadow: =DropShadow.Semilight
                        Fill: =Color.White
                        FillPortions: =0
                        LayoutAlignItems: =LayoutAlignItems.Center
                        LayoutDirection: =LayoutDirection.Vertical
                        LayoutMaxWidth: =300
                        LayoutMinHeight: =16
                        LayoutMinWidth: =60
                        PaddingBottom: =8
                        PaddingLeft: =8
                        PaddingRight: =8
                        PaddingTop: =8
                        RadiusBottomLeft: =8
                        RadiusBottomRight: =8
                        RadiusTopLeft: =8
                        RadiusTopRight: =8
                        Width: =If('Mon Ă©cran rĂ©actif Partie 3'.Size<2,60,210)
                      Children:
                        - tlb_Menu_1:
                            Control: Toolbar@2.0.5
                            Properties:
                              AlignInContainer: =AlignInContainer.Stretch
                              Alignment: ='Toolbar.Alignment'.Vertical
                              FillPortions: =1
                              Items: |-
                                =Table(
                                    {ItemKey: "new", ItemDisplayName: "Nouveau", ItemIconName: "Add", ItemAppearance: "Primary", ItemIconStyle: "Regular", ItemTooltip: "Add new item"},
                                    {ItemKey: "edit", ItemDisplayName: "Modifier", ItemIconName: "Edit", ItemAppearance: "Subtle", ItemIconStyle: "Regular"},
                                    {ItemKey: "delete", ItemDisplayName: "Supprimer", ItemIconName: "Delete", ItemDisabled: true, ItemAppearance: "Subtle", ItemIconStyle: "Filled"},
                                    {ItemKey: "info", ItemDisplayName: "Informations", ItemIconName: "Info", ItemAppearance: "Subtle", ItemIconStyle: "Regular"})
                              Layout: |-
                                =If('Mon Ă©cran rĂ©actif Partie 3'.Size <2,'Toolbar.Layout'.IconOnly,'Toolbar.Layout'.IconBefore)
                                //If(App.ActiveScreen.Size <2;'Toolbar.Layout'.IconOnly;'Toolbar.Layout'.IconBefore)
                                //Switch(App.ActiveScreen.Size ;1;'Toolbar.Layout'.IconOnly;'Toolbar.Layout'.IconBefore)
                              LayoutMinHeight: =16
                              LayoutMinWidth: =44
                              Padding: ='Toolbar.Padding'.Medium
                            Children:
                              - ItemAppearance1_1:
                                  Control: ToolbarDataField@1.5.0
                                  Variant: textualColumn
                                  IsLocked: true
                                  Properties:
                                    FieldDisplayName: ="ItemAppearance"
                                    FieldName: ="ItemAppearance"
                                    FieldType: ="s"
                                    Order: =1
                              - ItemDisabled1_1:
                                  Control: ToolbarDataField@1.5.0
                                  Variant: textualColumn
                                  IsLocked: true
                                  Properties:
                                    FieldDisplayName: ="ItemDisabled"
                                    FieldName: ="ItemDisabled"
                                    FieldType: ="b"
                                    Order: =2
                              - ItemDisplayName1_1:
                                  Control: ToolbarDataField@1.5.0
                                  Variant: textualColumn
                                  IsLocked: true
                                  Properties:
                                    FieldDisplayName: ="ItemDisplayName"
                                    FieldName: ="ItemDisplayName"
                                    FieldType: ="s"
                                    Order: =3
                              - ItemIconName1_1:
                                  Control: ToolbarDataField@1.5.0
                                  Variant: textualColumn
                                  IsLocked: true
                                  Properties:
                                    FieldDisplayName: ="ItemIconName"
                                    FieldName: ="ItemIconName"
                                    FieldType: ="s"
                                    Order: =4
                              - ItemIconStyle1_1:
                                  Control: ToolbarDataField@1.5.0
                                  Variant: textualColumn
                                  IsLocked: true
                                  Properties:
                                    FieldDisplayName: ="ItemIconStyle"
                                    FieldName: ="ItemIconStyle"
                                    FieldType: ="s"
                                    Order: =5
                              - ItemTooltip1_1:
                                  Control: ToolbarDataField@1.5.0
                                  Variant: textualColumn
                                  IsLocked: true
                                  Properties:
                                    FieldDisplayName: ="ItemTooltip"
                                    FieldName: ="ItemTooltip"
                                    FieldType: ="s"
                                    Order: =6
                              - ItemKey1_1:
                                  Control: ToolbarDataField@1.5.0
                                  Variant: textualColumn
                                  IsLocked: true
                                  Properties:
                                    FieldDisplayName: ="ItemKey"
                                    FieldName: ="ItemKey"
                                    FieldType: ="s"
                                    Order: =7
                  - ctn_Content_1:
                      Control: GroupContainer@1.5.0
                      Variant: AutoLayout
                      Properties:
                        DropShadow: =DropShadow.Semilight
                        Fill: =Color.White
                        LayoutDirection: =LayoutDirection.Vertical
                        LayoutGap: =8
                        RadiusBottomLeft: =8
                        RadiusBottomRight: =8
                        RadiusTopLeft: =8
                        RadiusTopRight: =8
                      Children:
                        - lbl_SousTitre_4:
                            Control: Label@2.5.1
                            Properties:
                              AlignInContainer: =AlignInContainer.Stretch
                              Color: =App.Theme.Colors.Lighter80
                              Fill: =App.Theme.Colors.Lighter20
                              FontWeight: =FontWeight.Semibold
                              Height: =32
                              LayoutMinHeight: =16
                              LayoutMinWidth: =16
                              Text: ="KPI"
                        - ctn_kpi_1:
                            Control: GroupContainer@1.5.0
                            Variant: AutoLayout
                            Properties:
                              DropShadow: =DropShadow.None
                              FillPortions: =0
                              Height: =kpi_CA_1.Y+kpi_CA_1.Height+Self.PaddingBottom
                              LayoutDirection: =LayoutDirection.Horizontal
                              LayoutGap: =16
                              LayoutJustifyContent: =LayoutJustifyContent.Center
                              LayoutMaxHeight: =140
                              LayoutMinHeight: =60
                              LayoutMinWidth: =16
                              LayoutOverflowY: =LayoutOverflow.Scroll
                              LayoutWrap: =true
                              PaddingBottom: =8
                              PaddingLeft: =8
                              PaddingRight: =8
                              PaddingTop: =8
                              RadiusBottomLeft: =0
                              RadiusBottomRight: =0
                              RadiusTopLeft: =0
                              RadiusTopRight: =0
                            Children:
                              - kpi_Clients_1:
                                  Control: GroupContainer@1.5.0
                                  Variant: AutoLayout
                                  Properties:
                                    AlignInContainer: =AlignInContainer.SetByContainer
                                    DropShadow: =DropShadow.Semilight
                                    Fill: =RGBA(255, 244, 240, 1)
                                    Height: =40
                                    LayoutAlignItems: =LayoutAlignItems.Center
                                    LayoutDirection: =LayoutDirection.Horizontal
                                    LayoutJustifyContent: =LayoutJustifyContent.Center
                                    LayoutMinHeight: =50
                                    LayoutMinWidth: =210
                                    LayoutWrap: =true
                                    PaddingBottom: =5
                                    PaddingLeft: =5
                                    PaddingRight: =5
                                    PaddingTop: =5
                                    RadiusBottomLeft: =8
                                    RadiusBottomRight: =8
                                    RadiusTopLeft: =8
                                    RadiusTopRight: =8
                                    X: =40
                                    Y: =40
                                  Children:
                                    - img_IconClients_1:
                                        Control: Image@2.2.3
                                        Properties:
                                          AlignInContainer: =AlignInContainer.Center
                                          FillPortions: =1
                                          Height: =30
                                          Image: ="data:image/svg+xml;utf8, " & EncodeUrl("<svg viewBox='0 0 24 24' xmlns='[http://www.w3.org/2000/svg](http://www.w3.org/2000/svg)'><path d='M16 11c1.66 0 2.99-1.34 2.99-3S17.66 5 16 5c-1.66 0-3 1.34-3 3s1.34 3 3 3zm-8 0c1.66 0 2.99-1.34 2.99-3S9.66 5 8 5C6.34 5 5 6.34 5 8s1.34 3 3 3zm0 2c-2.33 0-7 1.17-7 3.5V19h14v-2.5c0-2.33-4.67-3.5-7-3.5zm8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45V19h6v-2.5c0-2.33-4.67-3.5-7-3.5z' fill='#D83B01'/></svg>")
                                          LayoutMinHeight: =28
                                          LayoutMinWidth: =28
                                          Width: =40
                                    - lbl_ValueClients_1:
                                        Control: Label@2.5.1
                                        Properties:
                                          Align: =Align.Center
                                          AlignInContainer: =AlignInContainer.Center
                                          Color: =RGBA(216, 59, 1, 1)
                                          FillPortions: =1
                                          FontWeight: =FontWeight.Bold
                                          Height: =30
                                          LayoutMinHeight: =28
                                          LayoutMinWidth: =28
                                          Size: =11
                                          Text: ="34"
                              - kpi_Ventes_1:
                                  Control: GroupContainer@1.5.0
                                  Variant: AutoLayout
                                  Properties:
                                    AlignInContainer: =AlignInContainer.SetByContainer
                                    DropShadow: =DropShadow.Semilight
                                    Fill: =RGBA(240, 255, 244, 1)
                                    Height: =40
                                    LayoutAlignItems: =LayoutAlignItems.Center
                                    LayoutDirection: =LayoutDirection.Horizontal
                                    LayoutJustifyContent: =LayoutJustifyContent.Center
                                    LayoutMinHeight: =50
                                    LayoutMinWidth: =210
                                    LayoutWrap: =true
                                    PaddingBottom: =5
                                    PaddingLeft: =5
                                    PaddingRight: =5
                                    PaddingTop: =5
                                    RadiusBottomLeft: =8
                                    RadiusBottomRight: =8
                                    RadiusTopLeft: =8
                                    RadiusTopRight: =8
                                    X: =40
                                    Y: =40
                                  Children:
                                    - img_IconVentes_1:
                                        Control: Image@2.2.3
                                        Properties:
                                          AlignInContainer: =AlignInContainer.Start
                                          FillPortions: =1
                                          Height: =30
                                          Image: ="data:image/svg+xml;utf8, " & EncodeUrl("<svg viewBox='0 0 24 24' xmlns='[http://www.w3.org/2000/svg](http://www.w3.org/2000/svg)'><path d='M7 18c-1.1 0-1.99.9-1.99 2S5.9 22 7 22s2-.9 2-2-.9-2-2-2zM1 2v2h2l3.6 7.59-1.35 2.45c-.16.28-.25.61-.25.96 0 1.1.9 2 2 2h12v-2H7.42c-.14 0-.25-.11-.25-.25l.03-.12.9-1.63h7.45c.75 0 1.41-.41 1.75-1.03l3.58-6.49c.08-.14.12-.31.12-.48 0-.55-.45-1-1-1H5.21l-.94-2H1zm16 16c-1.1 0-1.99.9-1.99 2s.89 2 1.99 2 2-.9 2-2-.9-2-2-2z' fill='#107C10'/></svg>")
                                          LayoutMinHeight: =28
                                          LayoutMinWidth: =28
                                          Width: =40
                                    - lbl_ValueVentes_1:
                                        Control: Label@2.5.1
                                        Properties:
                                          Align: =Align.Center
                                          AlignInContainer: =AlignInContainer.Start
                                          Color: =RGBA(16, 124, 16, 1)
                                          FillPortions: =1
                                          FontWeight: =FontWeight.Bold
                                          Height: =30
                                          LayoutMinHeight: =28
                                          LayoutMinWidth: =28
                                          Size: =11
                                          Text: ="128"
                              - kpi_CA_1:
                                  Control: GroupContainer@1.5.0
                                  Variant: AutoLayout
                                  Properties:
                                    AlignInContainer: =AlignInContainer.SetByContainer
                                    DropShadow: =DropShadow.Semilight
                                    Fill: =RGBA(240, 244, 255, 1)
                                    Height: =40
                                    LayoutAlignItems: =LayoutAlignItems.Center
                                    LayoutDirection: =LayoutDirection.Horizontal
                                    LayoutJustifyContent: =LayoutJustifyContent.Center
                                    LayoutMinHeight: =50
                                    LayoutMinWidth: =210
                                    LayoutWrap: =true
                                    PaddingBottom: =5
                                    PaddingLeft: =5
                                    PaddingRight: =5
                                    PaddingTop: =5
                                    RadiusBottomLeft: =8
                                    RadiusBottomRight: =8
                                    RadiusTopLeft: =8
                                    RadiusTopRight: =8
                                    X: =40
                                    Y: =40
                                  Children:
                                    - img_IconCA_1:
                                        Control: Image@2.2.3
                                        Properties:
                                          AlignInContainer: =AlignInContainer.Start
                                          FillPortions: =1
                                          Height: =30
                                          Image: ="data:image/svg+xml;utf8, " & EncodeUrl("<svg viewBox='0 0 24 24' xmlns='[http://www.w3.org/2000/svg](http://www.w3.org/2000/svg)'><path d='M16 6l2.29 2.29-4.88 4.88-4-4L2 16.59 3.41 18l6-6 4 4 6.3-6.29L22 12V6z' fill='#0078D4'/></svg>")
                                          LayoutMinHeight: =28
                                          LayoutMinWidth: =28
                                          Width: =40
                                    - lbl_ValueCA_1:
                                        Control: Label@2.5.1
                                        Properties:
                                          Align: =Align.Center
                                          AlignInContainer: =AlignInContainer.Start
                                          Color: =App.Theme.Colors.Primary
                                          FillPortions: =1
                                          FontWeight: =FontWeight.Bold
                                          Height: =30
                                          LayoutMinHeight: =28
                                          LayoutMinWidth: =28
                                          Size: =11
                                          Text: ="45.2 K€"
                        - lbl_SousTitre_3:
                            Control: Label@2.5.1
                            Properties:
                              AlignInContainer: =AlignInContainer.Stretch
                              Color: =App.Theme.Colors.Lighter80
                              Fill: =App.Theme.Colors.Lighter20
                              FontWeight: =FontWeight.Semibold
                              Height: =32
                              LayoutMinHeight: =16
                              LayoutMinWidth: =16
                              Text: ="Sous-titre 1"
                        - gal_Cards_1:
                            Control: Gallery@2.15.0
                            Variant: Vertical
                            Properties:
                              FillPortions: =3
                              Items: =Table(CustomGallerySample,CustomGallerySample,CustomGallerySample)
                              LayoutMinHeight: =16
                              LayoutMinWidth: =16
                              TemplatePadding: =0
                              TemplateSize: =Max(If(Self.Layout = Layout.Horizontal, Min(280, Self.Width - 60), Min(280, Self.Height - 60)),90)
                              WrapCount: |-
                                =Min(Max(1,Trunc(Self.Width/250,0)),6) // Personnalisable
                                //'Mon Ă©cran rĂ©actif Partie 3'.Size  // Variante plus simple
                            Children:
                              - Card1_1:
                                  Control: ModernCard@1.0.0
                                  Properties:
                                    DropShadow: =DropShadow.Semilight
                                    HeaderImage: =ThisItem.SampleImage
                                    Height: =Parent.TemplateHeight-Self.Y*2
                                    Image: =ThisItem.SampleImage
                                    OnSelect: =Select(Parent)
                                    Subtitle: =ThisItem.SampleText
                                    Title: =ThisItem.SampleHeading
                                    Width: =Parent.TemplateWidth-Self.X*2-5
                                    X: =10
                                    Y: =10
            - ctn_Footer_1:
                Control: GroupContainer@1.5.0
                Variant: AutoLayout
                Properties:
                  DropShadow: =DropShadow.Semilight
                  Fill: =Color.White
                  FillPortions: =0
                  Height: =44
                  LayoutAlignItems: =LayoutAlignItems.Center
                  LayoutDirection: =LayoutDirection.Horizontal
                  LayoutGap: =15
                  LayoutJustifyContent: =LayoutJustifyContent.SpaceBetween
                  LayoutMinHeight: =80
                  PaddingBottom: =8
                  PaddingLeft: =15
                  PaddingRight: =15
                  PaddingTop: =8
                  RadiusBottomLeft: =8
                  RadiusBottomRight: =8
                  RadiusTopLeft: =8
                  RadiusTopRight: =8
                Children:
                  - HtmlText1_1:
                      Control: HtmlViewer@2.1.0
                      Properties:
                        AlignInContainer: =AlignInContainer.Stretch
                        FillPortions: =1
                        HtmlText: |-
                          ="<marquee direction='left' scrollamount='3' behavior='scroll' style='font-size:16px; background:#0000; padding:0px;'>
                            Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi. Proin porttitor orci nec nonummy molestie. Enim est eleifend mi, non fermentum diam nisl sit amet erat. Duis semper, dui et placerat cursus, nibh nisl feugiat velit, at dignissim sapien orci vel sem. Pellentesque congue efficitur nunc, in porta nisl.
                          </marquee>"
                        LayoutMinHeight: =16
                        LayoutMinWidth: =16
                        PaddingBottom: =0
                        PaddingLeft: =0
                        PaddingRight: =0
                        PaddingTop: =0







Votre application possÚde désormais une structure robuste et un contenu adaptatif.

En combinant les propriĂ©tĂ©s Screen.Size, la fonction d’enveloppement des conteneurs horizontaux et les calculs sur la propriĂ©tĂ© WrapCount des galeries, les thĂ©ories du Responsive Design sont appliquĂ©es sans recourir Ă  des coordonnĂ©es fixes. L’interface s’ajuste et se repositionne selon le support matĂ©riel utilisĂ© par l’utilisateur.

Et aprĂšs ?

Pour la suite, nous aborderons le cas particulier des formulaires, nous verrons que les formulaires natifs disposent de prĂ©cieux paramĂštres pour s’adapter dynamiquement Ă  la rĂ©solution de l’écran. N’hĂ©sitez pas Ă  vous abonner Ă  la Newsletter pour recevoir directement les prochains articles !

Échanger autour de cet article

Les commentaires utilisent Giscus et GitHub Discussions. Le service externe n’est contactĂ© qu’aprĂšs activation.