2011-11-22 74 views
1

我試圖模仿Windows資源管理器的行爲,以及收藏夾項目如何啓動上下文菜單。從ToolStripMenuItem打開ContextMenu

我目前正在使用:

contextMenu.Show((sender as ToolStripMenuItem).GetCurrentParent().PointToScreen(e.Location)); 

這發生在ToolStripMenuItem的MouseDown事件。問題在於菜單在右鍵單擊後立即關閉,我不知道任何方式在上下文菜單打開時掛起它。

我試着從ToolStripMenuItem派生並重寫MouseDown/MouseUp,但我無法弄清楚如何保持它打開點擊。

有沒有這樣做的好方法?

回答

0

您可以完成此操作的一種方法是使用ToolStripDropDown控件託管ToolStripDropDown內的ListBox。

這可能需要有關AutoClose行爲的一些調整,但它應該讓你開始:

首先在主窗體,將下面的行添加到您的ToolStripDropDropDown項目

toolStripDropDownButton1.DropDown = new CustomListDropDown(); 

然後創建一個自定義下拉班如下:

public class CustomListDropDown : ToolStripDropDown 
{ 
    private ContextMenuStrip contextMenuStrip1; 
    private ToolStripMenuItem toolStripMenuItem1; 
    private ToolStripMenuItem toolStripMenuItem2; 
    private ToolStripMenuItem toolStripMenuItem3; 
    private System.ComponentModel.IContainer components; 

    public ListBox ListBox { get; private set; } 

    public CustomListDropDown() 
    { 
     InitializeComponent(); 

     this.ListBox = new ListBox() { Width = 200, Height = 600 }; 
     this.Items.Add(new ToolStripControlHost(this.ListBox)); 

     this.ListBox.ContextMenuStrip = contextMenuStrip1; 
     this.ListBox.MouseDown += new MouseEventHandler(ListBox_MouseDown); 

     contextMenuStrip1.Closing += new ToolStripDropDownClosingEventHandler(contextMenuStrip1_Closing); 

     //add sample items 
     this.ListBox.Items.Add("Item1"); 
     this.ListBox.Items.Add("Item2"); 
     this.ListBox.Items.Add("Item3"); 
     this.ListBox.Items.Add("Item4"); 
    } 

    void contextMenuStrip1_Closing(object sender, ToolStripDropDownClosingEventArgs e) 
    { 
     this.Close(); 
     this.AutoClose = true; 
    } 

    void ListBox_MouseDown(object sender, MouseEventArgs e) 
    { 
     this.AutoClose = false; 
     this.ListBox.SelectedIndex = this.ListBox.IndexFromPoint(e.Location); 
    } 

    private void InitializeComponent() 
    { 
     this.components = new System.ComponentModel.Container(); 
     this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); 
     this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); 
     this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); 
     this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripMenuItem(); 
     this.contextMenuStrip1.SuspendLayout(); 
     this.SuspendLayout(); 
     // 
     // contextMenuStrip1 
     // 
     this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { 
     this.toolStripMenuItem1, 
     this.toolStripMenuItem2, 
     this.toolStripMenuItem3}); 
     this.contextMenuStrip1.Name = "contextMenuStrip1"; 
     // 
     // contextMenuStrip1.ContextMenuStrip 
     // 
     this.contextMenuStrip1.Size = new System.Drawing.Size(181, 48); 
     // 
     // toolStripMenuItem1 
     // 
     this.toolStripMenuItem1.Name = "toolStripMenuItem1"; 
     this.toolStripMenuItem1.Size = new System.Drawing.Size(180, 22); 
     this.toolStripMenuItem1.Text = "toolStripMenuItem1"; 
     // 
     // toolStripMenuItem2 
     // 
     this.toolStripMenuItem2.Name = "toolStripMenuItem2"; 
     this.toolStripMenuItem2.Size = new System.Drawing.Size(180, 22); 
     this.toolStripMenuItem2.Text = "toolStripMenuItem2"; 
     // 
     // toolStripMenuItem3 
     // 
     this.toolStripMenuItem3.Name = "toolStripMenuItem3"; 
     this.toolStripMenuItem3.Size = new System.Drawing.Size(180, 22); 
     this.toolStripMenuItem3.Text = "toolStripMenuItem3"; 
     // 
     // CustomListDropDown 
     // 
     this.Size = new System.Drawing.Size(2, 4); 
     this.contextMenuStrip1.ResumeLayout(false); 
     this.ResumeLayout(false); 

    } 
} 

在我的測試這工作相當不錯。讓我知道事情的後續。

0

這是我有運氣,這是多一點直接:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 
    void MenuItemContext(object sender, MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Left) return; 

     ToolStripMenuItem mID = (ToolStripMenuItem)sender; 

     ContextMenu tsmiContext = new ContextMenu(); 

     MenuItem Item1 = new MenuItem(); 
     MenuItem Item2 = new MenuItem(); 

     Item1.Text = "Item1"; 
     Item2.Text = "Item2"; 

     tsmiContext.MenuItems.Add(Item1); 
     tsmiContext.MenuItems.Add(Item2); 

     Item1.Click += new EventHandler(Item1_Click); 
     Item2.Click += new EventHandler(Item2_Click); 

     hndPass = mID.Text; 

     tsmiContext.Show(menuStrip1, menuStrip1.PointToClient(new Point(Cursor.Position.X, Cursor.Position.Y))); 
    } 

    private String hndPass; 

    void Item1_Click(object sender, EventArgs e) 
    { 
     MenuItem mID = (MenuItem)sender; 
     MessageBox.Show("You clicked " + mID.Text + " in the context menu of " + hndPass); 
    } 
    void Item2_Click(object sender, EventArgs e) 
    { 
     MenuItem mID = (MenuItem)sender; 
     MessageBox.Show("You clicked " + mID.Text + " in the context menu of " + hndPass); ; 
    } 
} 
相關問題