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

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

Поэтому я попробовал что-то вроде этого в menuItem_click:

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

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

3 ответа

Решение

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

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

private void GestureListener_DoubleTap(object sender, GestureEventArgs e)
{
    Button clikance = (Button)sender;
    ButtonEnvoyeur = Convert.ToString(clikance.Content);
}

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

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

VisualTreeHelper.GetParent((sender as DependencyObject));

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

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

Используйте свойство 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;
    (...)         
}

Алекс.

Другие вопросы по тегам