【问题标题】:Can't find the right handler for my desired event找不到适合我想要的事件的处理程序
【发布时间】:2014-02-28 07:07:24
【问题描述】:

我在为我的 ContextMenu 找到正确的 Eventhandler 时遇到问题。请注意,这不是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 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 关闭时触发事件。我的猜测是我对第一段代码的声明是错误的,但我似乎无法弄清楚。

【问题讨论】:

标签: c# wpf button browser bookmarks


【解决方案1】:

您必须绑定MenuItemClick 事件。它可能最终看起来像这样(我现在没有测试此代码的方法,但它应该很接近):

// (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 很有用,如果您想执行一些代码,无论用户选择什么,但在这种特定情况下它看起来对您没有用处。

handler方法也应该调整一下,当然要适应不同的sender

// ...
Button button = ((ContextMenu)((MenuItem)sender).Parent).PlacementTarget as Button;
// .SourceControl could also be a viable alternative to .PlacementTarget
// ...

【讨论】:

  • 该代码在Button button = ((ContextMenu)sender).PlacementTarget as Button; 行上给了我一个异常错误
  • sender 现在是 MenuItem,而不是 ContextMenu(它可能有一个 Parent 属性来检索菜单本身,我不记得了,将返回在我能够验证后修改评论)
  • 但是MenuItem 没有.PlacementTarget 的定义是否有另一种方法来获取实际右键单击的按钮?
  • 非常感谢先生。
猜你喜欢
  • 2013-11-02
  • 1970-01-01
  • 2016-11-01
  • 2021-01-20
  • 1970-01-01
  • 2015-05-09
  • 2016-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多