Получение контроля над контекстным меню - PullRequest
3 голосов
/ 17 июля 2011

У меня есть контекстное меню, которое выглядит так

 A
 |--1
 |--2
 |--3

Мне нужно получить доступ к объекту, из которого вызывается контекстное меню, после выбора 1 2 или 3

означает, что если это контекстное меню текстового поля1, то мне нужно получить доступ к этому объекту, как мне это сделать?

Забыл упомянуть, это приложение WPF. поэтому я использую System.Windows.Controls и ContextMenu создается программно

Ответы [ 6 ]

8 голосов
/ 17 июля 2011

Вы можете подняться по дереву и получить контроль от ContextMenu.PlacementTarget, например,

private void MenuItem_Click(object sender, RoutedEventArgs e)
{
    var item = sender as MenuItem;
    while (item.Parent is MenuItem)
    {
        item = (MenuItem)item.Parent;
    }
    var menu = item.Parent as ContextMenu;
    if (menu != null)
    {
        var droidsYouAreLookingFor = menu.PlacementTarget as TextBox;
        //...
    }
}
3 голосов
/ 17 июля 2011

Вы можете взглянуть на SourceControl свойство ContextMenuStrip, которое владеет элементом контекстного меню, по которому щелкнули.

Например, в обработчике Click для пункта меню:

private void aToolStripMenuItem_Click(object sender, EventArgs e)
{
    var control = ((sender as ToolStripMenuItem).Owner as ContextMenuStrip).SourceControl;
       ...
}

Конечно, если у вас есть только одна ContextMenuStrip в форме, вы можете просто ссылаться на нее напрямую

var control = myContextMenuStrip.SourceControl;
0 голосов
/ 18 июня 2017

Незначительная настройка ответа HB.HB заслуживает кредита.Помог мне найти DataGrid.

private void MenuItem_Click(object sender, RoutedEventArgs e)
{
    MenuItem item = sender as MenuItem;
    ContextMenu cm = (ContextMenu)item.Parent; 
    Popup popup = (Popup)cm.Parent; 

    var finalGoal = popup.PlacementTarget as DataGrid; 
}
0 голосов
/ 05 декабря 2015

Гадкий раствор

Я ищу лучший способ сделать то же самое. На данный момент код ниже работает:

TextBlock tb = ((sender as MenuItem).Parent as ContextMenu).PlacementTarget as TextBlock;

Замените TextBlock типом вашего элемента управления.

0 голосов
/ 17 июля 2011

нашел ответ на аналогичный вопрос

Получить владельца контекстного меню в коде Код Вики работает, но мне пришлось дважды его разыграть.

Я полагаю, что зацикливание на Родителе возможно для большей гибкости. (большее количество приведений зависит от того, насколько глубоко выбран элемент)

0 голосов
/ 17 июля 2011

используйте

ContextMenu.SourceControl

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

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