Не могу найти подходящий обработчик для желаемого события

У меня проблема с поиском подходящего Eventhandler для меня ContextMenu, Обратите внимание, что это не ContextMenuStrip, Я объявил ContextMenu следующее:

public void button_MouseRightButtonDown(object sender, MouseButtonEventArgs e)//add a context menu to buttons
{
   Button button = sender as Button;
    menu = new ContextMenu();
    menu.Items.Add(new MenuItem() { Header = "Delete" });
    button.ContextMenu = menu;
    menu.Closed += button_DeleteButtonClicked;//find the right event

}

Пример:

http://puu.sh/6Jymf.jpg

Затем обработчик (который сейчас неверен, .Closed запускает событие при закрытии меню):

private void button_DeleteButtonClicked(object sender, RoutedEventArgs e)//delete bookmark
{
    Button button = ((ContextMenu)sender).PlacementTarget as Button;
    string line_to_delete = button.ToString().Replace("System.Windows.Controls.Button: ", "");
    string[] lines = File.ReadAllLines(@"bookmarks.txt");
    File.WriteAllText(@"bookmarks.txt", String.Empty);
    for (int i = 0; i < lines.Length; i++)
    {
        if (lines[i] != line_to_delete)
        {
            using (StreamWriter wr = File.AppendText(@"bookmarks.txt"))
            {
                wr.WriteLine(lines[i]);
            }
        }
    }
}

Так что в основном я ищу обработчик, который запускает событие при нажатии "Удалить", а не когда ContextMenu закрыто. Я предполагаю, что мое объявление о первом фрагменте кода неверно, но я не могу понять это.

1 ответ

Решение

Вы должны связать Click событие MenuItem, Это, вероятно, в конечном итоге будет выглядеть так (у меня нет средств для тестирования этого кода сейчас, но он должен быть близок):

// (old) ...
menu.Items.Add(new MenuItem() { Header = "Delete" });
// ...

// (tweak to) ...
var deleteMenuItem = new MenuItem() { Header = "Delete" };
deleteMenuItem.Click += button_DeleteButtonClicked;
menu.Items.Add(deleteMenuItem);
// no need to bind menu.Close for this
// ...

переплет ContextMenu.Close полезно, если вы хотите выполнить некоторый код независимо от того, что выбрал пользователь, но не похоже, что он полезен для вас в этом конкретном сценарии.

Конечно, метод обработчика также должен быть скорректирован с учетом различных sender:

// ...
Button button = ((ContextMenu)((MenuItem)sender).Parent).PlacementTarget as Button;
// .SourceControl could also be a viable alternative to .PlacementTarget
// ...
Другие вопросы по тегам