右键单击菜单项并显示选项。

3

我有一个名为ServerList的菜单,我正在使用C#代码动态添加菜单项。它从文件中读取服务器列表并填充菜单项。我已经为每个服务器添加了右键单击选项:编辑和删除。

所有这些都很好地运行着,问题是当单击编辑/删除时,如何读取实际的服务器名称。

以下是代码:

       public MainWindow()
    {
        InitializeComponent();
        LoadMenuItems();
    }

    //Currently static values, but reads from file. later
    private void LoadMenuItems()
    {
        MenuItem item2 = new MenuItem();
        item2.Header = "Server1";
        AddContextMenu(item2);

        MenuItem item3 = new MenuItem();
        item3.Header = "Server2";
        AddContextMenu(item3);

        ActualMenu.Items.Add(item2);
        ActualMenu.Items.Add(item3);
    }

    private void AddContextMenu(MenuItem item)
    {
        MenuItem item1 = new MenuItem();
        item1.Header = "Edit";            
        item1.Click += item_Click;

        MenuItem item2 = new MenuItem();
        item2.Header = "Detlete";
        item2.Click += item_Click;

       ContextMenu menu = new ContextMenu();
        menu.Items.Add(item1);
        menu.Items.Add(item2);

        item.ContextMenu = menu;
    }

    void item_Click(object sender, RoutedEventArgs e)
    {
        MenuItem item = sender as MenuItem;
        string header = item.Header.ToString();            
    }      

我猜你的item_Click代码有问题,因为这将是我第一个询问发送者的猜测。你尝试过在item_click处理程序中使用RoutedEventArgs参数吗?应该有一个Source属性,它是被点击的菜单项。 - dowhilefor
2个回答

3

使用 PlacementTarget 实现此功能。

 private void AddContextMenu(MenuItem item)
 {
    MenuItem item1 = new MenuItem();
    ....
    ContextMenu menu = new ContextMenu();
    ....
    menu.PlacementTarget = item;   /// 'Connects' context menu to source menu item.
    item.ContextMenu = menu;
 } 

 void item_Click(object sender, RoutedEventArgs e)
 {
    MenuItem item = sender as MenuItem;
    string header
       = ((MenuItem)((ContextMenu)((MenuItem)sender).Parent).PlacementTarget).Header;
 }  

干杯。


0

默认情况下,MenuItem的标题使用TextBlock来显示内容。因此,在这种情况下,您需要将标题转换为TextBox,然后查看Text属性。

例如,

void item_Click(object sender, RoutedEventArgs e){
    string servername =  ((sender as MenuItem).Header as TextBlock).Text;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接