# DropdownMenu

> Represents a dropdown menu, similar to the menus seen in most Operating Systems (OS) and across the Unity Editor.

## Definition

* **Type:** Class
* **Namespace:** [UnityEngine.UIElements](/engine/6000.7/script-reference/unityengine/uielements.md)
* **Assembly:** UnityEngine.UIElementsModule

```csharp
public class DropdownMenu
```

## Remarks

Use this class to set custom [DropdownMenuItem](/engine/6000.7/script-reference/unityengine/uielements/dropdownmenuitem.md) that executes a [DropdownMenuAction](/engine/6000.7/script-reference/unityengine/uielements/dropdownmenuaction.md) based on its status.

Use this class to create OS-like dropdown menus in the Unity Editor. For more generic dropdown menus designed for both Editor and Runtime use, use [GenericDropdownMenu](/engine/6000.7/script-reference/unityengine/uielements/genericdropdownmenu.md).

The following example shows how to create a dropdown menu with submenus and conditional actions.

## Examples

```csharp
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
public class DropdownMenuExample: EditorWindow
{
    public string[] playerNames = new string[] { "Alex", "Carol", "Ethan", "Jen" };

    [MenuItem("Window/UI Toolkit/DropdownMenu Example")]
    public static void ShowExample()
    {
        DropdownMenuExample wnd = GetWindow<DropdownMenuExample>();
        wnd.titleContent = new GUIContent("DropdownMenu Example");
    }

    public void CreateGUI()
    {
        var window = EditorWindow.GetWindow<EditorWindow>();
        var root = window.rootVisualElement;

        // Create a new dropdown menu
        var playersContainer = new VisualElement();
        var instructionLabel = new Label("Right Click on the player to edit their details");
        root.Add(instructionLabel);
        root.Add(playersContainer);

        for(int i = 0; i < playerNames.Length; i++)
        {
            var playerName = playerNames[i];
            // Set an ID for each player label
            var id = i+1;
            var playerLabel = new Label { text = playerName, name = $"label{playerName}"};
            playerLabel.AddManipulator(CreateDropdownMenu());
            playersContainer.Add(playerLabel);
        }
    }

    public IManipulator CreateDropdownMenu()
    {
       ContextualMenuManipulator menuManipulator = new ContextualMenuManipulator(
           menuEvent =>
           {
               if (menuEvent.target is not Label playerLabel)
                     return;

               // Player Name Actions
               menuEvent.menu.AppendAction("Retire Player", a =>
               {
                   playerLabel.text = $"[RETIRED] {playerLabel.text}";
                   playerLabel.style.backgroundColor = Color.gray;
                   playerLabel.style.color = Color.red;
                   playerLabel.userData = "retired";
               }, DropdownMenuAction.AlwaysEnabled, playerLabel.userData);

               menuEvent.menu.AppendAction("Set Player To Gold Status", a =>
               {
                   playerLabel.style.color = Color.yellow;
               });

               // Separate Team Actions from Player Name Actions
               menuEvent.menu.AppendSeparator();

               // Create a sub menu containing both teams
               menuEvent.menu.AppendAction("Change Team/Lizards", a =>
               {
                   playerLabel.style.backgroundColor = Color.green;
               }, ChangeTeamActionStatus, playerLabel.userData);
               menuEvent.menu.AppendAction("Change Team/Sharks", a =>
               {
                   playerLabel.style.backgroundColor = Color.cyan;
               }, ChangeTeamActionStatus, playerLabel.userData);
           });
       return menuManipulator;
    }

    public DropdownMenuAction.Status ChangeTeamActionStatus(DropdownMenuAction a)
    {
        // If a player is retired, hide the team change options
        return a.userData is string and "retired" ? DropdownMenuAction.Status.Hidden : DropdownMenuAction.Status.Normal;
    }
}
```

## Properties

| Property                                                                                                          | Description                                         |
| ----------------------------------------------------------------------------------------------------------------- | --------------------------------------------------- |
| [allowDuplicateNames](/engine/6000.7/script-reference/unityengine/uielements/dropdownmenu/allowduplicatenames.md) | Determines whether the menu allows duplicate names. |

## Methods

| Method                                                                                                        | Description                                                                                      |
| ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ |
| [AppendAction](/engine/6000.7/script-reference/unityengine/uielements/dropdownmenu/appendaction.md)           | Adds an item that executes an action in the dropdown menu.                                       |
| [AppendSeparator](/engine/6000.7/script-reference/unityengine/uielements/dropdownmenu/appendseparator.md)     | Adds a separator line in the menu.                                                               |
| [ClearItems](/engine/6000.7/script-reference/unityengine/uielements/dropdownmenu/clearitems.md)               | Clears all items from the menu.                                                                  |
| [InsertAction](/engine/6000.7/script-reference/unityengine/uielements/dropdownmenu/insertaction.md)           | Adds an item that executes an action in the dropdown menu.                                       |
| [InsertSeparator](/engine/6000.7/script-reference/unityengine/uielements/dropdownmenu/insertseparator.md)     | Adds a separator line in the menu.                                                               |
| [MenuItems](/engine/6000.7/script-reference/unityengine/uielements/dropdownmenu/menuitems.md)                 | Gets the list of menu items.                                                                     |
| [PrepareForDisplay](/engine/6000.7/script-reference/unityengine/uielements/dropdownmenu/preparefordisplay.md) | Gets the status of all items by calling their status callback and removes the excess separators. |
| [RemoveItemAt](/engine/6000.7/script-reference/unityengine/uielements/dropdownmenu/removeitemat.md)           | Removes the menu item at index.                                                                  |
