Skip to content

Example: Scrolling Item Grid

Contributed by focustense

  • Bindings
  • Repeaters
  • Grid
  • Scrolling

Simple grid showing a large number of items inside a scrollable container. This is the same example as the one on the home page.

internal record EdiblesViewModel(string HeaderText, ParsedItemData[] Items)
{
    public static EdiblesViewModel LoadFromGameData()
    {
        int[] edibleCategories = [
            StardewValley.Object.CookingCategory,
            StardewValley.Object.EggCategory,
            StardewValley.Object.FishCategory,
            StardewValley.Object.FruitsCategory,
            StardewValley.Object.meatCategory,
            StardewValley.Object.MilkCategory,
            StardewValley.Object.VegetableCategory,
        ];
        var items = ItemRegistry.ItemTypes
            .Single(type => type.Identifier == ItemRegistry.type_object)
            .GetAllIds()
            .Select(id => ItemRegistry.GetDataOrErrorItem(id))
            .Where(data => edibleCategories.Contains(data.Category))
            .ToArray();
        return new("All Edibles", items);
    }
}
<lane orientation="vertical" horizontal-content-alignment="middle">
    <banner background={@Mods/StardewUI/Sprites/BannerBackground}
            background-border-thickness="48,0"
            padding="12"
            text={HeaderText} />
    <frame layout="880px 640px"
           margin="0,16,0,0"
           padding="32,24"
           background={@Mods/StardewUI/Sprites/ControlBorder}>
        <scrollable peeking="128">
            <grid layout="stretch content"
                  item-layout="length: 64"
                  item-spacing="16,16"
                  horizontal-item-alignment="middle">
                <image *repeat={Items}
                       layout="stretch content"
                       sprite={this}
                       tooltip={DisplayName}
                       focusable="true" />
            </grid>
        </scrollable>
    </frame>
</lane>