2011-07-16 195 views
2

我有一個上下文菜單,看起來像這樣獲取上下文菜單

A 
|--1 
|--2 
|--3 

我需要訪問的上下文菜單從調用時,對象選擇1 2或3

後的控制這意味着如果這是一個文本框1的上下文菜單,那麼我需要訪問該對象,我該怎麼做?

忘了提及,這是一個WPF應用程序。因此Im使用System.Windows.Controls 和文本菜單中創建程序

+0

上下文菜單不需要擁有所有者控制。特別是對於TextBox而言,它實現了自己的上下文菜單。但是,如果您使用正確的方式來調用它,那麼SourceControl是查找源代碼管理的絕佳方式。一定要使用帶控件的Show()方法。 –

+0

發現類似問題的答案 http://stackoverflow.com/questions/1884117/get-owner-of-context-menu-in-code viky的代碼工作,但我不得不投它兩次。(我想循環是可能的更好的靈活性) – Bg1987

回答

0

使用

ContextMenu.SourceControl 

這是調用上下文菜單中的變量。所有你需要做的就是投入控制

3

你可以看看ContextMenuStrip的SourceControl屬性,該屬性擁有被點擊的上下文菜單項。

例如,在菜單項的Click處理程序:

private void aToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    var control = ((sender as ToolStripMenuItem).Owner as ContextMenuStrip).SourceControl; 
     ... 
} 

當然,如果你只有一個的ContextMenuStrip的形式,你可以參考它直接

var control = myContextMenuStrip.SourceControl; 
+0

我用MenuItem和ContextMenu類。 是否有區別使用ContextMenuStrips和只是一個ContextMenu和MenuItems(上下文菜單是動態生成的)除了SourceControl屬性? – Bg1987

+0

對不起,我是WPF-dumb。 :( –

6

你可以走上樹並從ContextMenu.PlacementTarget獲得控制權,例如

private void MenuItem_Click(object sender, RoutedEventArgs e) 
{ 
    var item = sender as MenuItem; 
    while (item.Parent is MenuItem) 
    { 
     item = (MenuItem)item.Parent; 
    } 
    var menu = item.Parent as ContextMenu; 
    if (menu != null) 
    { 
     var droidsYouAreLookingFor = menu.PlacementTarget as TextBox; 
     //... 
    } 
} 
+0

這是最簡單和最好的解決方案。 –

0

找到了答案,從一個類似的問題

Get owner of context menu in code VIKY的代碼工作,但我不得不投了兩次。

我猜循環家長的鑄造,可以更好的靈活性 (更蒙上取決於被點擊的項目有多深)

0

醜陋的解決方案

我在尋找一個更好的方式來做同樣的事。現在,下面的代碼工作:

TextBlock tb = ((sender as MenuItem).Parent as ContextMenu).PlacementTarget as TextBlock; 

替換TextBlock與控件的類型。

0

對HB的回答略作調整。 HB值得信任。幫助我找到一個DataGrid。

private void MenuItem_Click(object sender, RoutedEventArgs e) 
{ 
    MenuItem item = sender as MenuItem; 
    ContextMenu cm = (ContextMenu)item.Parent; 
    Popup popup = (Popup)cm.Parent; 

    var finalGoal = popup.PlacementTarget as DataGrid; 
}