2011-09-26 62 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; 
}