как получить родительское имя элемента контекстного меню? - PullRequest
1 голос
/ 24 февраля 2011

Я пытаюсь получить родительское имя элемента контекстного меню.

Итак, я попробовал что-то подобное в menuItem_click:

Button clikance = (Button)sender;
string ladyGaga = Convert.ToString(clikance.Content);

Но это не сработало (недопустимое исключение приведения). спасибо за любую помощь

Ответы [ 3 ]

2 голосов
/ 28 февраля 2011

Я использовал другой подход для получения кнопки отправителя моего контекстного меню.Я сделал событие в «hold_click»

, где я вернул содержимое кнопки в публичной строке

private void GestureListener_DoubleTap(object sender, GestureEventArgs e)
{
    Button clikance = (Button)sender;
    ButtonEnvoyeur = Convert.ToString(clikance.Content);
}
1 голос
/ 02 октября 2011

Используйте свойство Tag элемента MenuItem для получения вашей кнопки:

// Object creation
Button myButtonWithContextMenu = new Button();
ContextMenu contextMenu = new ContextMenu();
MenuItem aMenuItem = new MenuItem 
{
    Header = "some action",
    Tag = myButtonWithContextMenu, // tag contains the button
};

// Events handler
aMenuItem.Click += new RoutedEventHandler(itemClick);

private void itemClick(object sender, RoutedEventArgs e)
{
    // Sender is the MenuItem
    MenuItem menuItem = sender as MenuItem;

    // Retrieve button from tag
    Button myButtonWithContextMenu = menuItem.Tag as Button;
    (...)         
}

Alex.

1 голос
/ 24 февраля 2011

Если вы посмотрите в отладчике на точку, где сгенерировано исключение, вы увидите, что sender не Button, поэтому попытка явного приведения к Button приведет кочевидно, бросить InvalidCastException.

Вы можете использовать VisualTreeHelper для перехода по дереву от фактического отправителя к элементу Button:

VisualTreeHelper.GetParent((sender as DependencyObject));

ОБНОВЛЕНИЕ: В вашем случае отправитель - это MenuItem в ContextMenu.Вы можете добраться до родителя ContextMenu из MenuItem с помощью VisualTreeHelper, но, к сожалению, ContextMenu не предоставляет открытых членов, которые позволяют вам получить доступ к владельцу;свойство Owner является внутренним.Вы можете получить исходный код для Toolkit и вместо этого выставить свойство Owner как publi, или использовать совершенно другой подход.

Задумывались ли вы об использовании инфраструктуры MVVM (такой как MVVM Light *)1028 *) связать команды с этими пунктами контекстного меню?Ваш текущий подход очень хрупок и сломается, как только вы измените визуальное дерево.Если вы использовали команды, вы можете передать любую дополнительную информацию, необходимую для обработки, с помощью параметра команды.

...