2011-04-11 35 views
3

這可能非常簡單,我沒有看到它,因爲這是漫長一天的結束,如果是我提前道歉。C#= MenuItem.Click處理程序 - 獲取上下文菜單所屬的對象?

我有一組按鈕,當右鍵單擊時彈出一個ContextMenu。該菜單有兩個MenuItem,它們都有一個Click處理函數分配。我觸發文本菜單彈出按鈕上的右鍵像這樣:

過於簡化的例子:


public void InitiailizeButtonContextMenu() 
{ 
    buttonContextMenu = new ContextMenu(); 
    MenuItem foo = new MenuItem("foo"); 
    foo.Click += OnFooClicked; 

    MenuItemCollection collection = new MenuItemCollection(buttonContextMenu); 
    collection.Add(foo); 
} 

public void OnButtonMouseClick(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Left) 
     // left click stuff handling 
    if (e.Button == MouseButtons.Right) 
     buttonContextMenu.Show((Button)sender, new Point(e.X, e.Y)); 
} 


public void OnFooClicked(object sender, EventArgs e) 
{ 
    // Need to get the Button the ContextMenu .Show'd on in 
    // OnButtonMouseClick... thoughts? 
} 


ContextMenu buttonContextMenu; 

我需要能夠得到觸發文本菜單的按鈕在MenuItem的Click處理程序中彈出,或以某種方式獲取它。 MenuItem.Click採用EventArgs,因此在那裏沒有用。我可以將對象發送者重新映射回MenuItem,但是我找不到任何能告訴我是什麼讓它彈出的東西。這可能嗎?

+0

這是WinForms或WPF的問題嗎? – 2011-04-12 00:03:11

回答

7

使用ContextMenu.SourceControl屬性,它給你一個Button實例的引用。

+3

值得注意的是(如果有人遇到同樣的問題會遇到這個問題)你必須做的: Button parent =(Button)((ContextMenu)((MenuItem)sender).Parent)。 SourceControl; 從MenuItem一路回到按鈕,但這是有效的!謝謝。 – trycatch 2011-04-12 13:59:42

+1

如果像我這樣的人需要這個wpf,應該使用PlacementTarget屬性:Button btn =(Button)((ContextMenu)((MenuItem)sender).Parent).PlacementTarget; – SepehrM 2013-12-27 17:18:22

0


Button buttonThatTriggeredTheContextMenu; 

public void OnButtonMouseClick(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Left) 
     // left click stuff handling 
    if (e.Button == MouseButtons.Right) { 
     buttonThatTriggeredTheContextMenu = (Button)sender; 
     buttonContextMenu.Show((Button)sender, new Point(e.X, e.Y)); 
    } 
} 


public void OnFooClicked(object sender, EventArgs e) 
{ 
    //buttonThatTriggeredTheContextMenu contains the button you want 
} 

2

在上面的代碼片段,當你調用buttonContextMenu Show方法,您通過按鈕對象buttonContextMenu,當您在按鈕上單擊鼠標右鍵。

要訪問OnFooClicked方法中的按鈕,只需將'發件人'轉換回按鈕即可。

public void OnFooClicked(object sender, EventArgs e) 
{ 
    ((MenuItem)sender).Parent //This is the button 
} 

*我不知道,如果菜單項是正確的投,但它應該是沿着這些線路。

+0

我現在遠離我的代碼,但我90%確定我嘗試了這一點,並且它拋出了一個異常,因爲發件人是MenuItem,因爲它是一個MenuItem.Click處理程序。 – trycatch 2011-04-11 23:09:51

+0

哎呀,對不起。是的,這是行不通的。你應該能夠引用父母,那將是你的按鈕。抱歉。 – 2011-04-12 05:50:35

+0

MenuItem的父項是菜單。 – trycatch 2011-04-12 13:57:42

0

我不是100%的 - 它來自我2年前寫的代碼,但我希望它能讓你繼續這樣做。

MenuItem item = (MenuItem)sender; 
DependencyObject dep = item.Parent; 
while((dep != null) && !(dep is Button)) 
    dep = VisualTreeHelper.GetParent(dep); 

if (dep == null) 
    return; 
Button button = dep as Button; 
0
button mybutton = ((ContextMenu)((MenuItem)sender).Parent).SourceControl as button; 
1

如果您正在使用的ContextMenuStrip及ToolStripItem的,而不是文本菜單和菜單項,你需要:

private void myToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    Button parent = (Button)((ContextMenuStrip)((ToolStripItem)sender).Owner).SourceControl; 
    ... 

一個普通文本菜單和菜單項(從漢斯帕桑特的帖子trycatch的評論):

Button parent = (Button)((ContextMenu)((MenuItem)sender).Parent).SourceControl;