Щелкните правой кнопкой мыши меню, затем пункт, указывающий на класс - PullRequest
2 голосов
/ 22 марта 2012

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

    private void link1add_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
        ContextMenu cm = new ContextMenu();
        cm.MenuItems.Add("Add", HandleContextMenuAdd);
        cm.MenuItems.Add("Remove", HandleContextMenuRemove); 
        link1add.ContextMenu = cm;
        }
    }
        private void HandleContextMenuAdd(object sender, EventArgs e) 
        { 
            MessageBox.Show("Adding");
        }
        private void HandleContextMenuRemove(object sender, EventArgs e)
        {
            MessageBox.Show("Removing");
        }

Код, отредактированный с момента первой публикацииСпасибо всем за помощь.

Ответы [ 3 ]

1 голос
/ 22 марта 2012

А как насчет лямбда-выражения?

cm.MenuItems.Add("Item 2", (_, __) => { 
  if (...) ReadDocument();
});

или

cm.MenuItems.Add("Item 2", (_, __) => { this.myClassInstance.DoSomething(); });

Кроме того, вы можете создать метод с подписью ожидаемого обработчика события:

cm.MenuItems.Add("Item 2", HandleContextMenuClick);

private void HandleContextMenuClick(object sender, EventArgs e)
{
  if (...) ReadDocument();
}

Этот метод не обязательно должен находиться в одном классе (например, вы можете написать this.myClassInstance.HandleContextMenuclick). Но я бы скрыл детали реализации от других классов, чтобы избежать ненужной связи.

1 голос
/ 23 марта 2012

Шаблон для вашего собственного кода после этого:

    public class ReadDocumentEventArgs : EventArgs
    {
        public string ImageInfo { get; set; }
    }

    public void ReadDocument(object sender, ReadDocumentEventArgs ea)
    {
        // do whatever you need to do
        MessageBox.Show(ea.ImageInfo);  // example
    }

    private void link1add_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            PictureBox imageCtrl = sender as PictureBox;

            // get the information you need to get from your control to identify it
            string imgInfo = "Hello, World!"; // example

            ContextMenu cm = new ContextMenu();
            cm.MenuItems.Add("Item 1");
            cm.MenuItems.Add("Item 2", 
               (EventHandler)((s, rde) => 
               { ReadDocument(s, new ReadDocumentEventArgs() 
                  { ImageInfo = imgInfo }); 
               }));

            link1add.ContextMenu = cm;
        }
    }

В вашем MouseDown поверх вашего изображения вы можете создать пункт меню, используя код, который я предоставил выше, который будет вызывать обработчик событий с именем ReadDocument.Обратите внимание, что существует класс ReadDocumentEventArgs, который можно настроить так, чтобы он содержал необходимые свойства, которые помогут вам определить, на какое изображение вы щелкнули.

Итак, в приведенном выше примере одна из первых вещей, которая происходит вMouseDown - это то, что вы получаете экземпляр управления изображением (я предполагаю, что это Picture Box, но вы можете привести его к тому, чем он является на самом деле).

В этот момент вы можете получить имя файла или что-то еще из вашего изображения, которое идентифицирует его, с помощью других элементов управления в вашей форме.

Далее, при создании элемента контекстного меню, он сообщаетпункт меню для вызова ReadDocument, но передает специальные данные, только что взятые из элемента управления изображением.

В методе ReadDocument вы можете затем делать все, что вам нужно.В моем примере я просто выбрасываю MessageBox, чтобы показать вам, какие данные вы передали.

0 голосов
/ 22 марта 2012

То, что вам нужно, это установить другой обработчик событий и вызвать ваш метод readdocument.

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