2011-09-26 105 views
3

我有菜单ServerList,我使用C#代码动态添加menuItems。它从文件读取服务器列表并填充菜单项。我为每个服务器添加了右键单击选项。编辑&删除。右键单击菜单项并显示选项

这一切工作正常。问题是如何单击Edit/Detele时读取实际的服务器名称。

下面是代码

 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();    
    }  
+0

我想你的item_Click代码是错误的,因为这是我第一次猜测发件人。你是否尝试过item_click处理程序的RoutedEventArgs参数?应该有一个Source属性,这是一个点击菜单项。 – dowhilefor

回答

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

这完全按照要求工作。非常感谢。 –

0

缺省情况下,菜单项的报头使用一个TextBlock显示内容。因此,在这种情况下,您需要将标题转换为文本框,然后查看Text属性。

例如,

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