2012-03-19 92 views
2

我對其中每個節點在它,我想與大家分享的ContextMenuStrip裏面有兩個ToolStripMenuItems一個TreeView控件,即:設置ToolStripMenuItem.Visible爲true不起作用

this.BuildTree = new MyApp.MainForm.TreeView(); 
this.ItemMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); 
this.DeleteMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 
this.ShowLogMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 
... 
this.ItemMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { 
this.DeleteMenuItem, 
this.ShowLogMenuItem}); 

所以我顯示和隱藏這些來在MouseUp事件中按一定標準右鍵單擊項目。當兩者都隱藏時,我隱藏了ContextMenuStrip本身。問題是,當我隱藏ContextMenuStrip時,似乎下次我想要顯示其中一個菜單項時,我必須在節點上單擊兩次。奇怪的是在第一次點擊重新顯示的,我有以下的代碼項目的一個或兩個:

ItemMenuStrip.Visible = true; 
ShowLogMenuItem.Visible = true; 

上面的兩行似乎並沒有做任何事情,即經過調試視圖都保持假跨越每條線。

我不認爲我已經設置了這些值的任何事件,至少我沒有附加任何事件。

我在做什麼錯?

+1

可見性也是父控制的一部分。由於您處於「開放」過程中,因此您沒有UI,因此不可見。從試驗和錯誤中我發現即使get/set不是直接賦值,但它確實記得您在渲染之前將其設置爲的內容。顯示控件時,會適當使用'.Visible'。 – 2013-02-07 15:23:09

回答

3

我建議你設置:

this.BuildTree.ContextMenuStrip = this.ItemMenuStrip;

使菜單上右鍵單擊樹中自動打開。

然後訂閱ItemMenuStrip.Opening事件來改變項目的可見性和文本菜單本身:

void ItemMenuStrip_Opening(object sender, CancelEventArgs e) 
{ 
    if (something) 
    { 
     e.Cancel = true; // don't show the menu 
    } 
    else 
    { 
     // show/hide the items... 
    } 
} 

如果您需要了解點擊點的當前位置(例如,以檢查是否被點擊樹節點)您可以使用Control.MousePosition屬性。請注意,MousePosition是屏幕座標中的一個點,因此您需要撥打treeView1.PointToClient(position)以獲取樹座標。 :

private void ItemMenuStrip_Opening(object sender, CancelEventArgs e) 
{ 
    var pointClicked = this.BuildTree.PointToClient(Control.MousePosition); 
    var nodeClicked = this.BuildTree.GetNodeAt(pointClicked); 
    if (nodeClicked == null) 
    { 
     // no tree-node is clicked --> don't show the context menu 
     e.Cancel = true; 
    } 
    else 
    { 
     // nodeClicked variable is the clicked node; 
     // show/hide the context menu items accordingly 
    } 
} 
+0

對不起,也沒有工作,我試圖使用可用。我注意到的一件事是,如果我只使用Available或Visible,並且不隱藏實際的ItemMenuStrip,那麼當我右鍵單擊具有空ItemMenuStrip的節點時,我會看到一個空的ItemMenuStrip,但下一次單擊(問題一)沒有看到任何事情就好像抽籤沒有發生。 – user176168 2012-03-20 11:32:58

+0

這工作,但要留意觀察員的影響。我設置了一個斷點,在我的調試工具中,Visible總是顯示爲false,但這是因爲當Visual Studio中的斷點打開時,整個上下文菜單被隱藏,從而強制可見爲假。 – kampsj 2013-09-05 19:11:42

0

所以想通了什麼事情錯了我設置上this.ItemMenuStrip而非this.BuildTree.ContextMenuStrip可見。

這對我來說似乎很奇怪,因爲我以爲BuildTree.ContextMenuStrip只是對ItemMenuStrip的直接引用,但顯然不是。

+0

它應該是相同的參考。檢查你是否正確地將ItemMenuStrip傳遞給樹。 – digEmAll 2012-03-20 13:37:24

相關問題