我已经通过面板的扩展以及其他一些东西以编程方式添加了一个contextmenustrip, 它通过面板的构造函数设置到面板的contextmenu中。
我第一次右键单击不起作用,然后它会在第一次之后总是。
我还尝试将contextmenustrip的构造函数和其分配给面板的上下文菜单,例如 Load 和表单的构造函数,甚至是带有标志的计时器,所有产生了相同的结果..
编辑:(根据要求提供一些代码(原样并切入重点))
class FiniteAutomationController : System.Windows.Forms.Panel
{
public FiniteAutomationController()
: base()
{
this.ContextMenuStrip = (cms = new ContextMenuStrip());
}
public ContextMenuStrip cms;
}
编辑:(每个blaze_125的请求,更多代码)
//at form designer initializecomponents after Controller(FiniteAutomationController)'s initialization
this.Controller.cms.Opening += new System.ComponentModel.CancelEventHandler(this.cms_Load);
//at form code class
static State contextS = null;
static Action contextA = null;
private void cms_Load(object sender, CancelEventArgs e)
{
Controller.cms.Items.Clear();
if ((contextS = FiniteAutomationData.GetStateFrom(mouseX, mouseY)) != null) // Rclick States
{
Controller.cms.Items.Add("Delete"); Controller.cms.Items[0].Click += new EventHandler(cms_DeleteState);
Controller.cms.Items.Add("Rename"); Controller.cms.Items[1].Click += new EventHandler(cms_RenameState);
Controller.cms.Items.Add((contextS.final ? '\u2714' : ' ') + " Final"); Controller.cms.Items[2].Click += new EventHandler(cms_Final);
Controller.cms.Items.Add((contextS.initial ? '\u2714' : ' ') + " Initial"); Controller.cms.Items[3].Click += new EventHandler(cms_Initial);
Controller.cms.Items.Add("Trap"); Controller.cms.Items[4].Click += new EventHandler(cms_Trap);
if (!contextS.error.Equals(""))
{
Controller.cms.Items.Add("Error: " + contextS.error);
Controller.cms.Items[5].Enabled = false;
}
}
else if((contextA = FiniteAutomationData.GetActionFrom(mouseX,mouseY)) != null) // Rclick Action
{
Controller.cms.Items.Add("Delete"); Controller.cms.Items[0].Click += new EventHandler(cms_DeleteAction);
}
else // Rclick null
{
Controller.cms.Items.Add("Add State"); Controller.cms.Items[0].Click += new EventHandler(cms_AddState);
}
}
答案 0 :(得分:0)
在过去的3天里,我设法找到了一个我认为非常糟糕的解决方案,但仍然是一个解决方案..
我所做的是使用Controller的MouseDown事件并使用标志, 首次使用它的 Show(Point)方法显示上下文菜单。
show方法放下了菜单,我选择了" new Point(e.X,e.Y + 45)"正确地放置它仍然我不喜欢我做的,因为它似乎真的不专业..
非常感谢,我猜..
答案 1 :(得分:0)
对于我来说,我需要通过单击ToolStripButton显示上下文菜单。第一次单击时未显示。我以这种方式解决了这个问题
void _TsiMenu_Click(object sender, EventArgs e)
{
AdjustableMenu.Show(this, this.PointToClient(Cursor.Position), ToolStripDropDownDirection.Default);
Application.DoEvents();
if (AdjustableMenu.Visible == false)
AdjustableMenu.Show(this, this.PointToClient(Cursor.Position), ToolStripDropDownDirection.Default);
}
答案 2 :(得分:0)
我发现(在DotPeek的帮助下)当对ContextMenuStrip
的{{1}}属性使用空白的Control
时,您可以在其中动态添加代码实际上,ContextMenuStrip
会将传递给System.Windows.Forms
处理程序的Cancel
的{{1}}属性设置为CancelEventArgs
,因为首先上下文菜单为空并且不包含任何项目
在后续调用中,即使您在Opening
处理程序中所做的第一件事是清除所有项目,true
属性也将设置为Opening
。
因此,确保始终显示上下文菜单(包括第一个菜单)的方法是始终将Cancel
'false
属性设置为CancelEventArgs
或{{1 }},而不是(错误地)始终依靠它初始化为Cancel
...