Не могу найти подходящий обработчик для желаемого события
У меня проблема с поиском подходящего 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
}
Пример:
Затем обработчик (который сейчас неверен, .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
// ...