vMenu Docs
API Reference

Events

Every event is a member of Menu, so you subscribe on the menu the item belongs to, not on the item. Lambdas and methods both work.

Every event is a member of Menu, so you subscribe on the menu the item belongs to, not on the item. Lambdas and methods both work.

// Lambda
menu.OnMenuOpen += (_menu) => Debug.WriteLine("Opened!");

// Method group
menu.OnMenuOpen += HandleMenuOpen;

private void HandleMenuOpen(Menu menu)
{
    Debug.WriteLine($"'{menu.MenuTitle}' was opened.");
}

Which event fires for which item?

OnItemSelect is not a catch-all. Each item type raises only its own select event, so pressing a checkbox raises OnCheckboxChange, pressing a list item raises OnListItemSelect, and so on.

Item typePressing selectPressing left / right
MenuItemOnItemSelectRight selects the item, left goes back to the parent menu.
MenuCheckboxItemOnCheckboxChangeRight toggles the checkbox (raising OnCheckboxChange), left goes back to the parent menu.
MenuListItemOnListItemSelectOnListIndexChange
MenuDynamicListItemOnDynamicListItemSelectOnDynamicListItemCurrentItemChange
MenuSliderItemOnSliderItemSelectOnSliderPositionChange

Not tied to an item type: OnIndexChange, OnMenuOpen, OnMenuClose and OnPageChange.

In a paginated menu, left and right turn the page on every item type except list, dynamic list and slider items.


Full example

Menu menu = new Menu("Main Menu", "Subtitle");
MenuController.AddMenu(menu);

MenuItem button = new MenuItem("Normal Button", "A simple button.");
MenuCheckboxItem box = new MenuCheckboxItem("Checkbox", "A checkbox.", false);
MenuListItem list = new MenuListItem("List", new List<string>() { "One", "Two", "Three" }, 0);

menu.AddMenuItem(button);
menu.AddMenuItem(box);
menu.AddMenuItem(list);

menu.OnItemSelect += (_menu, _item, _index) =>
{
    if (_item == button)
    {
        Debug.WriteLine("The normal button was pressed!");
    }
};

menu.OnCheckboxChange += (_menu, _item, _index, _checked) =>
{
    Debug.WriteLine($"'{_item.Text}' is now {(_checked ? "checked" : "unchecked")}.");
};

menu.OnListIndexChange += (_menu, _listItem, _oldIndex, _newIndex, _itemIndex) =>
{
    Debug.WriteLine($"List changed to '{_listItem.GetCurrentSelection()}'.");
};

menu.OnListItemSelect += (_menu, _listItem, _listIndex, _itemIndex) =>
{
    Debug.WriteLine($"'{_listItem.ListItems[_listIndex]}' was picked.");
};

menu.OnMenuOpen += (_menu) => Debug.WriteLine("Menu opened.");
menu.OnMenuClose += (_menu) => Debug.WriteLine("Menu closed.");

OnItemSelect

A MenuItem was pressed. For an item bound with MenuController.BindMenuItem(), this fires before the submenu opens. Disabled items never raise it, they play the error sound instead.

ParameterTypeDescription
menuMenuThe menu in which this event occurred.
menuItemMenuItemThe item that was pressed.
itemIndexintThe index of that item in the menu.
menu.OnItemSelect += (_menu, _item, _index) =>
{
    // Comparing against the item you created is the most reliable check.
    if (_item == deleteButton)
    {
        DeleteTheThing();
    }

    // Or use ItemData when your items are created in a loop.
    if (_item.ItemData != null)
    {
        SpawnVehicle(_item.ItemData.model);
    }
};

OnCheckboxChange

A MenuCheckboxItem was toggled with select or right. Checked is already updated when this fires.

ParameterTypeDescription
menuMenuThe menu in which this event occurred.
menuItemMenuCheckboxItemThe checkbox that was toggled.
itemIndexintThe index of that checkbox in the menu.
newCheckedStatebooleanThe new checked state.
menu.OnCheckboxChange += (_menu, _item, _index, _checked) =>
{
    if (_item == godModeBox)
    {
        SetPlayerInvincible(Game.Player.Handle, _checked);
    }
};

OnListItemSelect

A MenuListItem was pressed with select. Changing its value with left or right does not raise this.

ParameterTypeDescription
menuMenuThe menu in which this event occurred.
listItemMenuListItemThe list item that was pressed.
selectedIndexintThe selected index inside that list item's ListItems.
itemIndexintThe index of the list item in the menu.
menu.OnListItemSelect += (_menu, _listItem, _listIndex, _itemIndex) =>
{
    if (_listItem == weatherList)
    {
        SetWeather(_listItem.ListItems[_listIndex]);
    }
};

OnListIndexChange

The value of a MenuListItem was changed with left or right. Lists wrap around at both ends.

ParameterTypeDescription
menuMenuThe menu in which this event occurred.
listItemMenuListItemThe list item that was changed.
oldSelectionIndexintThe previously selected index.
newSelectionIndexintThe newly selected index.
itemIndexintThe index of the list item in the menu.
// Live preview: update something as soon as the value changes.
menu.OnListIndexChange += (_menu, _listItem, _oldIndex, _newIndex, _itemIndex) =>
{
    if (_listItem == hairColors)
    {
        SetPedHairColor(PlayerPedId(), _newIndex, 0);
    }
};

OnSliderPositionChange

The position of a MenuSliderItem was changed with left or right. Sliders do not wrap: at Min or Max the error sound plays and this does not fire.

ParameterTypeDescription
menuMenuThe menu in which this event occurred.
sliderItemMenuSliderItemThe slider that was changed.
oldPositionintThe previous slider position.
newPositionintThe new slider position.
itemIndexintThe index of the slider in the menu.
menu.OnSliderPositionChange += (_menu, _sliderItem, _oldPosition, _newPosition, _itemIndex) =>
{
    if (_sliderItem == volumeSlider)
    {
        SetVolume(_newPosition / 10f);
    }
};

OnSliderItemSelect

A MenuSliderItem was pressed with select.

ParameterTypeDescription
menuMenuThe menu in which this event occurred.
sliderItemMenuSliderItemThe slider that was pressed.
sliderPositionintThe current slider position.
itemIndexintThe index of the slider in the menu.

OnDynamicListItemCurrentItemChange

The value of a MenuDynamicListItem was changed with left or right. Fires right after the item's callback returned the new value.

ParameterTypeDescription
menuMenuThe menu in which this event occurred.
dynamicListItemMenuDynamicListItemThe dynamic list item that was changed.
oldValuestring?The value before the change.
newValuestringThe value the callback returned.
menu.OnDynamicListItemCurrentItemChange += (_menu, _item, _oldValue, _newValue) =>
{
    Debug.WriteLine($"'{_item.Text}' changed from {_oldValue} to {_newValue}.");
};

OnDynamicListItemSelect

A MenuDynamicListItem was pressed with select.

ParameterTypeDescription
menuMenuThe menu in which this event occurred.
dynamicListItemMenuDynamicListItemThe dynamic list item that was pressed.
currentItemstring?The value currently displayed.

OnIndexChange

The highlighted item changed, by up, down or the scroll wheel. The list wraps around at both ends. It does not fire in a menu with fewer than 2 items.

ParameterTypeDescription
menuMenuThe menu in which this event occurred.
oldItemMenuItemThe item that was highlighted before.
newItemMenuItem?The item that is highlighted now. Can be null.
oldIndexintThe previous index.
newIndexintThe new index.
// Load a preview of whatever the user is currently looking at.
menu.OnIndexChange += (_menu, _oldItem, _newItem, _oldIndex, _newIndex) =>
{
    if (_newItem?.ItemData != null)
    {
        PreviewVehicle(_newItem.ItemData.model);
    }
};

OnMenuOpen

The menu was opened, by the player or by Menu.OpenMenu().

ParameterTypeDescription
menuMenuThe menu that was opened.
// Refresh the contents every time the menu is opened.
menu.OnMenuOpen += (_menu) =>
{
    _menu.ClearMenuItems();
    BuildItems(_menu);
};

OnMenuClose

The menu was closed, by the player or by Menu.CloseMenu(), Menu.GoBack() or MenuController.CloseAllMenus().

Opening a submenu closes the parent menu first, so this also fires when the player goes into a submenu.

ParameterTypeDescription
menuMenuThe menu that was closed.
menu.OnMenuClose += (_menu) =>
{
    SaveSettings();
};

Delegate signatures

All delegate types are nested in Menu.

EventDelegate
OnItemSelectvoid ItemSelectEvent(Menu menu, MenuItem menuItem, int itemIndex)
OnCheckboxChangevoid CheckboxItemChangeEvent(Menu menu, MenuCheckboxItem menuItem, int itemIndex, bool newCheckedState)
OnListItemSelectvoid ListItemSelectedEvent(Menu menu, MenuListItem listItem, int selectedIndex, int itemIndex)
OnListIndexChangevoid ListItemIndexChangedEvent(Menu menu, MenuListItem listItem, int oldSelectionIndex, int newSelectionIndex, int itemIndex)
OnSliderPositionChangevoid SliderPositionChangedEvent(Menu menu, MenuSliderItem sliderItem, int oldPosition, int newPosition, int itemIndex)
OnSliderItemSelectvoid SliderItemSelectedEvent(Menu menu, MenuSliderItem sliderItem, int sliderPosition, int itemIndex)
OnDynamicListItemCurrentItemChangevoid DynamicListItemCurrentItemChangedEvent(Menu menu, MenuDynamicListItem dynamicListItem, string? oldValue, string newValue)
OnDynamicListItemSelectvoid DynamicListItemSelectedEvent(Menu menu, MenuDynamicListItem dynamicListItem, string? currentItem)
OnIndexChangevoid IndexChangedEvent(Menu menu, MenuItem oldItem, MenuItem? newItem, int oldIndex, int newIndex)
OnMenuOpenvoid MenuOpenedEvent(Menu menu)
OnMenuClosevoid MenuClosedEvent(Menu menu)
OnPageChangevoid PageChangedEvent(Menu menu, int oldPage, int newPage, bool wrapped)

On this page