2011-11-22 75 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); ; 
    } 
} 
相关问题