gpt4 book ai didi

c# - 有没有办法显示 "blocking"WinForms 上下文菜单?

转载 作者:行者123 更新时间:2023-11-30 12:50:48 26 4
gpt4 key购买 nike

有没有办法显示 ContextMenu 并阻止进一步执行,直到选择了一个项目?特别是,我希望获得类似于 ShowDialog() 的行为,但对于 ContextMenu

直接的方法行不通:

ContextMenu cm = new ContextMenu();
cm.MenuItems.Add("1", (s,e) => {value = 1;});
cm.Show(control, location);

因为 Click 回调不是直接从 Show() 调用的,而是在稍后消息循环处理点击事件时调用的。

如果你不走运,menu 在处理事件之前被垃圾收集,在这种情况下,事件只是默默地丢失了。 (这意味着您不能真正以这种方式为 ContextMenu 使用局部变量。)

这似乎有效,但感觉“不干净”:

using (ContextMenu cm = new ContextMenu()) {
cm.MenuItems.Add("1", (s,e) => {value = 1;});
cm.Show(control, location);
Application.DoEvents();
}

有没有更好的办法?

最佳答案

抱歉第一个回答。这是我试过的。我制作了另一个表单,我在其中放置了上下文菜单和一个计时器。Form2 从 Form1 显示为模态,然后计时器在 Form2 上显示上下文菜单。

请注意,Form 2 设置了一些属性:在任务栏中不可见,没有边框,大小应与上下文菜单的大小相等。

希望这对您有所帮助。

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
Form2 ctxForm = new Form2();
ctxForm.Location = this.PointToScreen(e.Location);
ctxForm.Size = new Size(0, 0);
ctxForm.ShowDialog();
}
}



}


public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}

private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Close();
}

private void timer1_Tick(object sender, EventArgs e)
{
//show menu once
contextMenuStrip1.Show(this, PointToClient(Location));
contextMenuStrip1.Focus();
timer1.Enabled = false;
}

private void contextMenuStrip1_Closed(object sender, ToolStripDropDownClosedEventArgs e)
{
this.Close();
}
}

关于c# - 有没有办法显示 "blocking"WinForms 上下文菜单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8402943/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com