Событие «Отменить выбор» для MenuItem - PullRequest
2 голосов
/ 29 ноября 2011

Я пытаюсь реализовать сценарий «предварительного просмотра», когда пользователь наводит курсор на элемент меню.

Например, предположим, что в программе есть контекстное меню с подменю «Установить цвет».В подменю появляется список цветов на выбор.Теперь, когда курсор мыши находится над определенным цветом, я хочу, чтобы он поменял метку «Выбранный цвет».И когда курсор мыши покидает выбранный пункт меню цвета, я хочу пометить, чтобы восстановить его исходный текст.

Следующий код демонстрирует изменение метки при выборе пункта меню - мышь находится над.

    private void Init()
    {
        var mnuContextMenu = new ContextMenu();
        this.ContextMenu = mnuContextMenu;

        var smthingElseMenu = new MenuItem("Do something else");
        var setColorMenu = new MenuItem("Set Color");

        var colorBlue = new MenuItem("Blue");
        var colorRed = new MenuItem("Red");
        var colorGreen = new MenuItem("Green");

        mnuContextMenu.MenuItems.Add(smthingElseMenu);
        mnuContextMenu.MenuItems.Add(setColorMenu);
        setColorMenu.MenuItems.Add(colorBlue);
        setColorMenu.MenuItems.Add(colorRed);
        setColorMenu.MenuItems.Add(colorGreen);

        colorBlue.Select += ColorSelect;
        colorRed.Select += ColorSelect;
        colorGreen.Select += ColorSelect;
    }

    void ColorSelect(object sender, EventArgs e)
    {
        lblSelectedColor.Text = ((MenuItem) sender).Text;
    }

Но я не смог найти способ восстановить текст метки, когда курсор мыши покинет пункт меню.Любые идеи, как я могу реализовать какое-то событие «Отменить выбор» / «MouseLeave» для MenuItem?

Ответы [ 4 ]

1 голос
/ 29 ноября 2011

Не могли бы вы просто сохранить старую ссылку MenuItem

private MenuItem _oldMenuItem;

void ColorSelect(object sender, EventArgs e)
    {
        if(_oldMenuItem != null) _oldMenuItem.Text = someText;
        _oldMenuItem = sender as MenuItem;

        lblSelectedColor.Text = ((MenuItem) sender).Text;
    }
1 голос
/ 29 ноября 2011

К сожалению, для MenuItems нет события отмены выбора.

Я бы просто перехватил событие Свернуть вашего контекстного меню и сбросил там вашу метку. Это даст дополнительное преимущество: если ваш пользователь наводит курсор на параметр «Красный», а затем парит над контекстным меню, ярлык должен оставаться красным до закрытия контекстного меню.

mnuContextMenu.Collapse += (s, e) => lblSelectedColor.Text = "None";

Если вам действительно нужно сбросить метку, когда мышь покидает контекстное меню, тогда вы можете перехватить событие MouseEnter на панели (или что-то еще), которое у вас есть, которое окружает ContextMenu.

MyPanel.MouseEnter += (s, e) => lblSelectedColor.Text = "None";

РЕДАКТИРОВАТЬ Попробуйте вместо этого использовать класс ContextMenuStrip. Класс ToolSTripMenuItem имеет событие MouseLeave. И свойство Checked, вероятно, то, что вы действительно хотите.

0 голосов
/ 29 ноября 2011

Не можете ли вы использовать:

    private void colorBlue_MouseEnter(object sender, EventArgs e)
    {
         // use color blue
    }

    private void colorBlue_MouseLeave(object sender, EventArgs e)
    {
         // use old color
    }
0 голосов
/ 29 ноября 2011

Используйте события MouseEnter и MouseLeave для обработки всего.Первый вызывается, когда указатель мыши входит в границы этого элемента.И второй указатель мыши покидает границы - в этот момент вы восстанавливаете текст метки по умолчанию.

EDIT , как указывал Ганс в комментарии, используйте ContextMenuStrip и ToolStripMenuItems, и у вас будут эти события.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...