Как получить родительское имя элемента контекстного меню?
Я пытаюсь получить родительское имя элемента контекстного меню.
Поэтому я попробовал что-то вроде этого в 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;
(...)
}
Алекс.