🏗️
MauiReactor
  • What is MauiReactor?
  • What's new in Version 2
  • What's new in Version 3
  • Getting Started
  • Getting Started Version 2
  • Components
    • State-less Components
    • Stateful Components
      • Inline Components
    • Component life-cycle
    • Component Properties
    • Component with children
    • Component Parameters
    • Theming
    • Navigation
      • NavigationPage
      • Shell
      • Back button
    • Controls
      • Button
      • RadioButton
      • FlyoutPage
      • CollectionView
        • Interactions
        • Layout
        • Selection
        • Empty view
        • Scrolling
        • Grouping
      • IndicatorView
      • Picker
      • Shell
      • Label
    • Wrap 3rd party controls
      • Lottie animations
      • Provide DataTemplate to native controls
    • Accessing native controls
    • Animation
      • Property-Based
      • AnimationController
      • Timer
    • Graphics
      • CanvasView control
    • Window
    • Testing
    • XAML Integration
  • Deep dives
    • Native tree and Visual tree
    • Dependency injection
    • Working with the GraphicsView
    • Migrating from MVVM Model
    • Using XAML Resources
    • Behaviors
  • resources
    • Source and Sample Applications
  • Q&A
    • How to deal with state shared across Components?
    • Does this support ObservableCollection for CollectionView?
    • Do we need to add states to create simple animations such as ScaleTo, FadeTo, etc on tap?
    • How to deal with custom dialogs/popups?
  • How to create a Menu/ContextMenu?
Powered by GitBook
On this page

Was this helpful?

Edit on GitHub
  1. Components
  2. Controls
  3. CollectionView

Layout

This page describe how to change the layout of the CollectionView

PreviousInteractionsNextSelection

Last updated 1 year ago

Was this helpful?

CollectionView control can arrange items in 4 different layouts. For more info about the properties of each layout please take a look at the official documentation .

The sample code below shows how to set a specific layout in MauiReactor:

enum LayoutType
{
    LinearVertical,

    LinearHorizontal,

    VerticalGrid,

    HorizontalGrid
}

class MainPageLayoutState
{
    public Person[] Persons { get; set; }

    public LayoutType CurrentLayout { get; set; }
}

class MainPageLayout : Component<MainPageLayoutState>
{
    protected override void OnMounted()
    {
        var person1 = new Person("John", "Doe", new DateTime(1980, 5, 10));
        var person2 = new Person("Jane", "Smith", new DateTime(1990, 6, 20));
        var person3 = new Person("Alice", "Johnson", new DateTime(1985, 7, 30));
        var person4 = new Person("Bob", "Williams", new DateTime(2000, 8, 15));
        var person5 = new Person("Charlie", "Brown", new DateTime(1995, 9, 25));
        var person6 = new Person("Daniel", "Robinson", new DateTime(1982, 10, 2));
        var person7 = new Person("Ella", "Martin", new DateTime(1992, 11, 13));
        var person8 = new Person("Frank", "Garcia", new DateTime(1987, 3, 19));
        var person9 = new Person("Grace", "Rodriguez", new DateTime(1979, 4, 23));
        var person10 = new Person("Harry", "White", new DateTime(1999, 2, 28));

        State.Persons = new [] { person1, person2, person3, person4, person5, person6, person7, person8, person9, person10 };
        base.OnMounted();
    }

    public override VisualNode Render()
    {
        return new ContentPage
        {
            new Grid("Auto, *", "*")
            {
                new Picker()
                    .ItemsSource(Enum.GetValues<LayoutType>().Select(_=>_.ToString()).ToList())
                    .SelectedIndex((int)State.CurrentLayout)
                    .OnSelectedIndexChanged(index => SetState(s => s.CurrentLayout = (LayoutType)index)),

                new CollectionView()
                    .ItemsSource(State.Persons, RenderPerson)
                    .ItemsLayout(GetCollectionViewLayout())
                    .GridRow(1)
            }
        };
    }

    private IItemsLayout GetCollectionViewLayout()
    {
        return State.CurrentLayout switch
        {
            LayoutType.LinearVertical => new VerticalLinearItemsLayout(),
            LayoutType.LinearHorizontal => new HorizontalLinearItemsLayout(),
            LayoutType.VerticalGrid => new VerticalGridItemsLayout(span: 3),
            LayoutType.HorizontalGrid => new HorizontalGridItemsLayout(span: 2),
            _ => throw new NotImplementedException(),
        };
    }

    private VisualNode RenderPerson(Person person)
    {
        return new VStack(spacing: 5)
        {
            new Label($"{person.FirstName} {person.LastName}"),
            new Label(person.DateOfBirth.ToShortDateString())
                .FontSize(12)
                .TextColor(Colors.Gray)
        }
        .Margin(5,10);
    }
}
https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/collectionview/layout