2012-11-12 38 views
3

我創建了一個ToolStripMenu,它應該允許用戶與項目「XML」和「非XML」交互,就好像它們是表單上的常規復選框。但是,當一個項目被選中/取消選中時,菜單關閉。如何在不關閉菜單的情況下允許項目被選中/取消選中?或者是否有實現相同行爲的不同標準方法?如何讓ToolStripMenu在點擊一個項目後打開

enter image description here

所以,我想是能夠點擊「非XML」,顯示的複選框,並離開菜單打開。 這個想法是,最後一個菜單項將是「完成」,當它被點擊時,「G2S」子項目將保持打開,但「顯示」子項目(XML,非XML)將關閉。

任何想法?

注:我知道這可能不是最好的用戶界面設計。不過,我想知道如何才能做到這一點,以獲得有關處理菜單的一些技術知識。

+2

這聽起來像一個可怕的用戶體驗,僅僅因爲它違背了菜單的概念。也許你應該重新思考如何顯示這個選項。 –

+0

我同意肯德爾。他們可以一次做出所有選擇然後點擊「繼續按鈕」的模式形式會更有意義。 – krillgar

+0

嗯,我想點擊「顯示」可以彈出一個小對話框。但是如果我真的想要創建上述用戶體驗呢? – Chimera

回答

2

有趣的概念在this thread on Stackoverflow描述:

這裏是公認的答案的精髓:

ParentMenu.DropDown.AutoClose = false; 

它做你問什麼了 - 防止菜單,點擊子項目時關閉。

+0

啊!謝謝。我想試試看。 – Chimera

+0

謝謝Neolisk。您可能還想添加: ParentMenu.AutoClose = false; 否則,下拉框會自行懸掛在那裏。這是有效的,但我不喜歡我的應用程序中的視覺效果。 –

+0

@MarkAinsworth:如果你有多層次的菜單嵌套,那麼也許還可以遍歷到父級?我將把這作爲參觀者的練習。謝謝你的注意。 – Neolisk

1

張貼萬一有人發現它有幫助。

,而不是試圖做的正是我本來也想,我已經想出了以下內容:

1-使用ContextMenuStrip
2 - 當用戶點擊ToolStripMenu項目我顯示ContextMenuStrip處的菜單項附近的位置如下圖所示:(注意定位仍然需要調整)

enter image description here

爲了得到這個工作,我建ContextMenuStrip代碼運行時,可以根據情況動態構建ContextMenuStrip中的項目。

代碼片段:

顯示ContextMenuStrip被點擊菜單項時:

private void filterToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    contextMenuStrip1.Show(this, 180, 20); 
} 

構建ContextMenuStrip

if (protInfo.Name == "QCOM") 
    { 
     BroadCast = new CheckBox(); 
     BroadCast.Text = "Date/Time Broadcast"; 
     BroadCast.Checked = FlagSet(CurrentFilter, (Byte)Filter.DateTimeBC); 
     ToolStripControlHost Ch1 = new ToolStripControlHost(BroadCast); 

     GenPoll = new CheckBox(); 
     GenPoll.Text = "Status Poll"; 
     GenPoll.Checked = FlagSet(CurrentFilter, (Byte)Filter.GenStatusPoll); 
     ToolStripControlHost Ch2 = new ToolStripControlHost(GenPoll); 

     GenPollResp = new CheckBox(); 
     GenPollResp.Text = "Status Poll Response"; 
     GenPollResp.Checked = FlagSet(CurrentFilter, (Byte)Filter.GenStatusResponse); 
     ToolStripControlHost Ch3 = new ToolStripControlHost(GenPollResp); 

     Button btnDone = new Button(); 
     btnDone.Text = "Done"; 
     ToolStripControlHost Ch4 = new ToolStripControlHost(btnDone); 
     btnDone.Click += new EventHandler(btnDone_Click); 

     contextMenuStrip1.Items.Clear(); 
     contextMenuStrip1.Items.Add(Ch1); 
     contextMenuStrip1.Items.Add(Ch2); 
     contextMenuStrip1.Items.Add(Ch3); 
     contextMenuStrip1.Items.Add(Ch4); 
     contextMenuStrip1.Enabled = true; 
     filterToolStripMenuItem.Enabled = true; 
    } 
    else 
    { 
     filterToolStripMenuItem.Enabled = false; 
    } 

這可能不是最好的用戶界面設計,但它似乎工作。

+0

爲什麼downvote? – Chimera

+1

Upvoted用於顯示如何將一個按鈕(或其他控件)添加到菜單。謝謝。 –

0

最初的解決方案將使用鼠標事件。

在鼠標上輸入事件:

parent.dropdown。autoclose = false;

上鼠標離開事件:

parent.dropdown.autoclose = TRUE;

唯一的問題是用戶是否通過鼠標以外的其他方式訪問菜單項。

0

我使用Neolisk's和Chimera的答案的組合來允許從樹視圖中刪除多個葉子項目。我的解決方案是低於

注:在設計時創建了以下項用於: TreePromotions(TreeView控件) menuVendorSection(上下文菜單條) removeMultipleItemsToolStripMenuItem(menuVendorSection的下拉)

private void removeMultipleItemsToolStripMenuItem_MouseHover(object sender, EventArgs e) 
    { 
     removeMultipleItemsToolStripMenuItem.DropDownItems.Clear(); 
     ToolStripMenuItem detailMenuItem; 
     TreeNode vendorSectionNode = treePromotions.SelectedNode; 
     for (int vsn = 0; vsn < vendorSectionNode.Nodes.Count; vsn++) 
     { 
      //add checkbox item 
      detailMenuItem = new ToolStripMenuItem(vendorSectionNode.Nodes[vsn].Text); 
      detailMenuItem.Tag = vendorSectionNode.Nodes[vsn].Tag; 
      detailMenuItem.CheckOnClick = true; 
      removeMultipleItemsToolStripMenuItem.DropDownItems.Add(detailMenuItem); 

     } 
     //add action buttons 
     Button buttonDeleteMultiple = new Button(); 
     buttonDeleteMultiple.Text = "Remove Checked Items"; 
     ToolStripControlHost buttonHost = new ToolStripControlHost(buttonDeleteMultiple); 
     buttonDeleteMultiple.Click += new EventHandler(buttonDeleteMultiple_Click); 
     removeMultipleItemsToolStripMenuItem.DropDownItems.Add(buttonHost); 

     Button buttonCancelMultipleDelete = new Button(); 
     buttonCancelMultipleDelete.Text = "CANCEL"; 
     buttonHost = new ToolStripControlHost(buttonCancelMultipleDelete); 
     buttonCancelMultipleDelete.Click += new EventHandler(buttonCancelMultipleDelete_Click); 
     removeMultipleItemsToolStripMenuItem.DropDownItems.Add(buttonHost); 



     removeMultipleItemsToolStripMenuItem.DropDown.AutoClose = false; 
     menuVendorSection.AutoClose = false; 





    } 

    private void buttonDeleteMultiple_Click(object sender, EventArgs e) 
    { 

     //delete items 
     for (int dmi = 0; dmi < removeAllItemsToolStripMenuItem.DropDownItems.Count - 2; dmi++) //do not include buttons 
     { 
      ((Detail)removeAllItemsToolStripMenuItem.DropDownItems[dmi].Tag).Delete(); //deletes item from database 
     } 
     //rebuild leaf 
     treePromotions.SelectedNode.Nodes.Clear(); 
     addItemNodes(treePromotions.SelectedNode); //builds leaf nodes from database 

     //close menus 
     removeMultipleItemsToolStripMenuItem.DropDown.Close(); 
     menuVendorSection.AutoClose = true; 
     menuVendorSection.Close(); 
    } 

    private void buttonCancelMultipleDelete_Click(object sender, EventArgs e) 
    { 
     //just close menus 
     removeMultipleItemsToolStripMenuItem.DropDown.Close(); 
     menuVendorSection.AutoClose = true; 
     menuVendorSection.Close(); 
    } 

And here is what it looks like

相關問題