我有一個上下文菜單,看起來像這樣獲取上下文菜單
A
|--1
|--2
|--3
我需要訪問的上下文菜單從調用時,對象選擇1 2或3
後的控制這意味着如果這是一個文本框1的上下文菜單,那麼我需要訪問該對象,我該怎麼做?
忘了提及,這是一個WPF應用程序。因此Im使用System.Windows.Controls 和文本菜單中創建程序
我有一個上下文菜單,看起來像這樣獲取上下文菜單
A
|--1
|--2
|--3
我需要訪問的上下文菜單從調用時,對象選擇1 2或3
後的控制這意味着如果這是一個文本框1的上下文菜單,那麼我需要訪問該對象,我該怎麼做?
忘了提及,這是一個WPF應用程序。因此Im使用System.Windows.Controls 和文本菜單中創建程序
使用
ContextMenu.SourceControl
這是調用上下文菜單中的變量。所有你需要做的就是投入控制
你可以看看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;
我用MenuItem和ContextMenu類。 是否有區別使用ContextMenuStrips和只是一個ContextMenu和MenuItems(上下文菜單是動態生成的)除了SourceControl屬性? – Bg1987
對不起,我是WPF-dumb。 :( –
你可以走上樹並從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;
//...
}
}
這是最簡單和最好的解決方案。 –
找到了答案,從一個類似的問題
Get owner of context menu in code VIKY的代碼工作,但我不得不投了兩次。
我猜循環家長的鑄造,可以更好的靈活性 (更蒙上取決於被點擊的項目有多深)
醜陋的解決方案
我在尋找一個更好的方式來做同樣的事。現在,下面的代碼工作:
TextBlock tb = ((sender as MenuItem).Parent as ContextMenu).PlacementTarget as TextBlock;
替換TextBlock
與控件的類型。
對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;
}
上下文菜單不需要擁有所有者控制。特別是對於TextBox而言,它實現了自己的上下文菜單。但是,如果您使用正確的方式來調用它,那麼SourceControl是查找源代碼管理的絕佳方式。一定要使用帶控件的Show()方法。 –
發現類似問題的答案 http://stackoverflow.com/questions/1884117/get-owner-of-context-menu-in-code viky的代碼工作,但我不得不投它兩次。(我想循環是可能的更好的靈活性) – Bg1987