C # = MenuItem.Click handler - Получить объект, к которому принадлежит контекстное меню? - PullRequest
3 голосов
/ 12 апреля 2011

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

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

Слишком упрощенный пример:


public void InitiailizeButtonContextMenu()
{
    buttonContextMenu = new ContextMenu();
    MenuItem foo = new MenuItem("foo");
    foo.Click += OnFooClicked;

    MenuItemCollection collection = new MenuItemCollection(buttonContextMenu);
    collection.Add(foo);
}

public void OnButtonMouseClick(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
        // left click stuff handling
    if (e.Button == MouseButtons.Right)
        buttonContextMenu.Show((Button)sender, new Point(e.X, e.Y));
}


public void OnFooClicked(object sender, EventArgs e)
{
    // Need to get the Button the ContextMenu .Show'd on in
    // OnButtonMouseClick...  thoughts?
}


ContextMenu buttonContextMenu; 

Мне нужно иметь возможностьполучить кнопку, которая вызвала ContextMenu для всплывающего в обработчике Click для MenuItem, или получить его как-нибудь.MenuItem.Click принимает EventArgs, поэтому ничего полезного там нет.Я могу привести объект-отправитель обратно в MenuItem, но не могу найти ничего, что бы сообщало мне, что заставило его всплыть.Это возможно?

Ответы [ 6 ]

7 голосов
/ 12 апреля 2011

Используйте свойство ContextMenu.SourceControl, оно возвращает ссылку на экземпляр Button назад.

2 голосов
/ 12 апреля 2011

В приведенном выше фрагменте кода, когда вы вызываете метод show buttonContextMenu, вы передаете объект кнопки в buttonContextMenu, когда вы щелкаете правой кнопкой мыши по кнопке.

Для доступа к кнопке в методе OnFooClicked просто приведите «отправителя» обратно к кнопке.

public void OnFooClicked(object sender, EventArgs e)
{
     ((MenuItem)sender).Parent //This is the button
}

* Я не знаю, является ли MenuItem правильным приведением, но оно должновдоль этих линий.

1 голос
/ 07 апреля 2015

Если вы используете ContextMenuStrip и ToolStripItem, а не ContextMenu и MenuItem, вам потребуется:

private void myToolStripMenuItem_Click(object sender, EventArgs e)
{
   Button parent = (Button)((ContextMenuStrip)((ToolStripItem)sender).Owner).SourceControl;
   ...

С обычными ContextMenu и MenuItem (из комментария trycatch к сообщению Ханса Пассанта):

Button parent = (Button)((ContextMenu)((MenuItem)sender).Parent).SourceControl; 
0 голосов
/ 06 ноября 2013
button mybutton = ((ContextMenu)((MenuItem)sender).Parent).SourceControl as button;
0 голосов
/ 12 апреля 2011

Я не на 100% в этом - это из кода, который я написал около 2 лет назад, но я надеюсь, что это заставит вас двигаться дальше.

MenuItem item = (MenuItem)sender;
DependencyObject dep = item.Parent;
while((dep != null) && !(dep is Button))
    dep =  VisualTreeHelper.GetParent(dep);

if (dep == null)
    return;
Button button = dep as Button;
0 голосов
/ 12 апреля 2011


Button buttonThatTriggeredTheContextMenu; 

public void OnButtonMouseClick(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
        // left click stuff handling
    if (e.Button == MouseButtons.Right) {
        buttonThatTriggeredTheContextMenu = (Button)sender;
        buttonContextMenu.Show((Button)sender, new Point(e.X, e.Y));
    }
}


public void OnFooClicked(object sender, EventArgs e)
{
    //buttonThatTriggeredTheContextMenu contains the button you want
}

...