Skip to content

Latest commit

 

History

History
78 lines (57 loc) · 4.02 KB

File metadata and controls

78 lines (57 loc) · 4.02 KB

Cas d'implémentation d'un layout personnalisé : DashboardLayout

Imaginons que vous ayez besoin de créer un DashboardLayout dans votre application MAUI pour organiser plusieurs widgets (par exemple, graphiques, listes, et indicateurs) de manière flexible et dynamique. Chaque widget peut être redimensionné et déplacé librement par l'utilisateur.

Cas d'utilisation réel :

Ce type de layout personnalisé est indispensable lorsque vous devez créer une interface utilisateur complexe et interactive, telle qu'un tableau de bord personnalisable où les utilisateurs peuvent organiser et manipuler les widgets selon leurs besoins. Cela dépasse les fonctionnalités offertes par les layouts standard comme StackLayout ou Grid, et nécessite une logique de positionnement plus avancée et flexible.

Implémentation de DashboardLayout

Voici comment vous pourriez implémenter DashboardLayout en utilisant AbsoluteLayout pour gérer la position absolue des widgets et permettre leur redimensionnement :

using Microsoft.Maui.Controls;

public class DashboardLayout : Layout<View>
{
    protected override void LayoutChildren(double x, double y, double width, double height)
    {
        foreach (var child in Children)
        {
            if (!(child is View view))
                continue;

            // Positionner chaque enfant selon ses coordonnées spécifiques
            AbsoluteLayout.SetLayoutBounds(view, new Rect(x, y, width, height));
        }
    }

    protected override SizeRequest OnMeasure(double widthConstraint, double heightConstraint)
    {
        // Mesurer le layout en fonction des contraintes spécifiées
        double totalWidth = 0;
        double totalHeight = 0;

        foreach (var child in Children)
        {
            var childSize = child.Measure(widthConstraint, heightConstraint);
            totalWidth = Math.Max(totalWidth, childSize.Request.Width);
            totalHeight = Math.Max(totalHeight, childSize.Request.Height);
        }

        return new SizeRequest(new Size(totalWidth, totalHeight));
    }
}

Utilisation de DashboardLayout:

Pour utiliser DashboardLayout dans votre application MAUI, vous pouvez ajouter dynamiquement des vues (widgets) et les positionner comme nécessaire :

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:MauiApp1"
             x:Class="MauiApp1.MainPage">
             
    <local:DashboardLayout>
        <BoxView BackgroundColor="LightGray" WidthRequest="200" HeightRequest="100"
                 AbsoluteLayout.LayoutBounds="0, 0, 0.5, 0.5" />
        
        <BoxView BackgroundColor="LightBlue" WidthRequest="150" HeightRequest="150"
                 AbsoluteLayout.LayoutBounds="0.5, 0.5, 0.5, 0.5" />
        
        <!-- Ajoutez plus de widgets ici au besoin -->
    </local:DashboardLayout>

</ContentPage>

Explication :

  • DashboardLayout : Ce layout personnalisé DashboardLayout utilise AbsoluteLayout pour permettre un positionnement absolu des widgets, ce qui est nécessaire lorsque les widgets doivent être déplacés librement par l'utilisateur.

  • LayoutChildren : La méthode LayoutChildren positionne chaque widget en utilisant AbsoluteLayout.SetLayoutBounds, ce qui permet de spécifier les coordonnées et la taille de chaque widget de manière précise.

  • OnMeasure : La méthode OnMeasure calcule la taille requise du layout en mesurant la taille maximale nécessaire pour tous les widgets, afin de s'assurer qu'ils sont tous visibles à l'écran.

Cas d'utilisation réel : Ce type de layout personnalisé est indispensable lorsque vous devez créer une interface utilisateur complexe et interactive, telle qu'un tableau de bord personnalisable où les utilisateurs peuvent organiser et manipuler les widgets selon leurs besoins. Cela dépasse les fonctionnalités offertes par les layouts standard comme StackLayout ou Grid, et nécessite une logique de positionnement plus avancée et flexible.