Power Apps Canvas App – Vertical Menu with Sub Levels
In today’s article, I will describe how you can create a vertical menu control in Power Apps Canvas Application.
The process is as Follow;
I will start in Excel, for the sake of simplicity and create a table of all my menu items.
The idea is that for each entry of my menu, I will need:
Menu Items Table
- Screen Name: This is the actual name (or label) of the menu button.
- ID: For internal use, this needs to be unique.
- IDParent: This value group the sub menus per parent item. It is very important to set the IDParent to -1 (or another unique value) for all the parent items.
- Icon: Optional, this will be set to the image on the left side of the menu.
- Screen: This will be the actual app screen which we will navigate to when a menu item is selected.
| Screen Name | ID | IDParent | Icon | Screen |
| Home | 0 | -1 | ico_home | scrHome |
| Employees | 1 | -1 | ico_employees | scrEmployees |
| List of Employees | 11 | 1 | ico_list | scrListofEmployees |
| New Employee | 12 | 1 | ico_newemployee | scrNewEmployee |
| Leavers | 13 | 1 | ico_leavers | scrLeavers |
| Dashboard | 14 | 1 | ico_dashboard | scrDashboard |
| Requests | 2 | -1 | ico_request | scrRequests |
| Outstanding requests | 21 | 2 | ico_awaiting | scrOutstandingrequests |
| All requests | 22 | 2 | ico_list | scrAllrequests |
| Requests Dashbaord | 23 | 2 | ico_dashboard | scrRequestsDashbaord |
| Settings | 9 | -1 | ico_settings | scrSettings |
| Jobs list | 91 | 9 | ico_jobs | scrJobslist |
| Documents Types | 91 | 9 | ico_doctypes | scrDocumentsTypes |
| Locations | 92 | 9 | ico_location | scrLocations |
| Absences Types | 93 | 9 | ico_absence | scrAbsencesTypes |
| Benefits | 94 | 9 | ico_benefits | scrBenefits |
| Contacts Types | 95 | 9 | ico_contactstypes | scrContactsTypes |
| Equipments | 96 | 9 | ico_equipments | scrEquipments |
| OnBoarding Tasks | 97 | 9 | ico_onboardingtasks | scrOnBoardingTasks |
| Trainings | 98 | 9 | ico_training | scrTrainings |
| Forms | 99 | 9 | ico_forms | scrForms |
| Questions | 910 | 9 | ico_questions | scrQuestions |
| Employees Types | 911 | 9 | ico_employeestypes | scrEmployeesTypes |
| Job Types | 912 | 9 | ico_jobs | scrJobTypes |
| Employees Statuses | 913 | 9 | ico_statuses | scrEmployeesStatuses |
| System | 914 | 9 | ico_system | scrSystem |
Menu Record Entry
Now, for each entry, I will generate an entry, which will be a record that will be appended to my PowerApps collection later.
Example of a record
{
Title: "Home",
ID: 0,
IdParent: -1,
Icon: ico_home,
Screen: scrHome
}
At the bottom of the table, I will concatenate all the records in one entry.
Now, let the fun begin !
PowerApps Menu Table
Now, when the app starts, I will initialise a table which will be passed as a parameter to the Menu controls in each screen.
Set(
tblMenu,
Table(
{
Title: "Home",
ID: 0,
IdParent: -1,
Icon: ico_home,
Screen: scrHome
},
{
Title: "Employees",
ID: 1,
IdParent: -1,
Icon: ico_employees,
Screen: scrEmployees
},
{
Title: "List of Employees",
ID: 11,
IdParent: 1,
Icon: ico_list,
Screen: scrListofEmployees
},
{
Title: "New Employee",
ID: 12,
IdParent: 1,
Icon: ico_newemployee,
Screen: scrNewEmployee
},
{
Title: "Leavers",
ID: 13,
IdParent: 1,
Icon: ico_leavers,
Screen: scrLeavers
},
{
Title: "Dashboard",
ID: 14,
IdParent: 1,
Icon: ico_dashboard,
Screen: scrDashboard
},
{
Title: "Requests",
ID: 2,
IdParent: -1,
Icon: ico_request,
Screen: scrRequests
},
{
Title: "Outstanding requests",
ID: 21,
IdParent: 2,
Icon: ico_awaiting,
Screen: scrOutstandingrequests
},
{
Title: "All requests",
ID: 22,
IdParent: 2,
Icon: ico_list,
Screen: scrAllrequests
},
{
Title: "Requests Dashbaord",
ID: 23,
IdParent: 2,
Icon: ico_dashboard,
Screen: scrRequestsDashbaord
},
{
Title: "Settings",
ID: 9,
IdParent: -1,
Icon: ico_settings,
Screen: scrSettings
},
{
Title: "Jobs list",
ID: 91,
IdParent: 9,
Icon: ico_jobs,
Screen: scrJobslist
},
{
Title: "Documents Types",
ID: 91,
IdParent: 9,
Icon: ico_doctypes,
Screen: scrDocumentsTypes
},
{
Title: "Locations",
ID: 92,
IdParent: 9,
Icon: ico_location,
Screen: scrLocations
},
{
Title: "Absences Types",
ID: 93,
IdParent: 9,
Icon: ico_absence,
Screen: scrAbsencesTypes
},
{
Title: "Benefits",
ID: 94,
IdParent: 9,
Icon: ico_benefits,
Screen: scrBenefits
},
{
Title: "Contacts Types",
ID: 95,
IdParent: 9,
Icon: ico_contactstypes,
Screen: scrContactsTypes
},
{
Title: "Equipments",
ID: 96,
IdParent: 9,
Icon: ico_equipments,
Screen: scrEquipments
},
{
Title: "OnBoarding Tasks",
ID: 97,
IdParent: 9,
Icon: ico_onboardingtasks,
Screen: scrOnBoardingTasks
},
{
Title: "Trainings",
ID: 98,
IdParent: 9,
Icon: ico_training,
Screen: scrTrainings
},
{
Title: "Forms",
ID: 99,
IdParent: 9,
Icon: ico_forms,
Screen: scrForms
},
{
Title: "Questions",
ID: 910,
IdParent: 9,
Icon: ico_questions,
Screen: scrQuestions
},
{
Title: "Employees Types",
ID: 911,
IdParent: 9,
Icon: ico_employeestypes,
Screen: scrEmployeesTypes
},
{
Title: "Job Types",
ID: 912,
IdParent: 9,
Icon: ico_jobs,
Screen: scrJobTypes
},
{
Title: "Employees Statuses",
ID: 913,
IdParent: 9,
Icon: ico_statuses,
Screen: scrEmployeesStatuses
},
{
Title: "System",
ID: 914,
IdParent: 9,
Icon: ico_system,
Screen: scrSystem
},
{
Title: "Security",
ID: 10,
IdParent: -1,
Icon: ico_permissions,
Screen: scrSecurity
},
{
Title: "Users",
ID: 101,
IdParent: 10,
Icon: ico_security,
Screen: scrUsers
},
{
Title: "Profiles",
ID: 102,
IdParent: 10,
Icon: ico_profiles,
Screen: scrProfiles
}
)
);
The Menu Component
In Power Apps, create a new component, and add the following structure:
The use of a container is optional, but I like to keep all my controls within containers, it is just a good habit !
Now, the gallery will be fed the menu table as data source.
Wen it comes to the gallery’s controls, we need just two controls:
- Image: Which will be the menu icon
- Button: this is the actual actionable menu button.
The sub menu logic
In order to implement the sub levels logic, I will follow this simple logic.
Menu Icon
The menu icon X value, will be set by a simple formula:
If(ThisItem.IdParent=-1,2,26)
The idea is that, if the IdParent=-1 (Which mean, the menu is a root level menu), the X (left position) is set to 2px otherwise, we will shift it a bit to the right (to create the sub menus structure) to the value of 26px.
Menu Button
Same logic is applied to the button, where we set the X value based on the IdParent value (either 2px for parent menus, or 26px for sub menus).
Please note, that the buttons have a left padding of 35, regardless of whether it is a root or sub menu.



