如何停止文本框显示默认上下文菜单?

3

我注意到WinForm文本框的右键菜单有些奇怪。文本框控件有一个默认的右键菜单,包括剪切、复制、粘贴等选项。我试图用自己的菜单替换它。我创建了一个简单的测试应用程序,在表单上添加了一个文本框,并添加了以下代码:

Form1()
{
    InitailizeComponent();
    ContextMenu menu = new ContextMenu();
    menu.MenuItems.Add("Hello World", HelloWorld_Clicked);
    textBox1.ContextMenu = menu;
}

private void HelloWorld_Clicked(object sender, EventArgs e)
{
    MessageBox.Show("Hello World!");
}

当我运行这个程序时,我可以通过右键单击文本框并释放鼠标按钮而不移动鼠标来打开上下文菜单。但是,如果我在文本框上按住右键,将其移动到文本框外部,最后释放鼠标按钮,则会获得默认的文本框上下文菜单。是否有可能停止这样做?
更新:如果有所不同,该系统正在运行Windows XP Pro SP3和.Net 3.5。
更新2:我在Windows 11上尝试了.Net Core 6中的以下代码,并遇到了相同的问题。
namespace WinFormsApp1;

public partial class Form1 : Form
{
    public Form1()
    {
        this.InitializeComponent();
        ContextMenuStrip menu = new ContextMenuStrip();
        menu.Items.Add("Hello World", null, HelloWorld_Clicked);
        textBox1.ContextMenuStrip = menu;
    }

    private void HelloWorld_Clicked(object? sender, EventArgs e)
    {
        MessageBox.Show("Hello World!");
    }
}

考虑到微软现在开始使用GitHub,我在这里提出了一个问题。

3个回答

1

我怀疑在文本框外释放鼠标按钮会为表单而不是文本框打开上下文菜单。我没有测试过,这只是一个猜测。您可能也可以使用类似以下代码的代码为表单设置上下文菜单,但我自己还没有尝试过:

Form1()
{
    InitilizeComponent();
    ContextMenu menu = new ContextMenu();
    menu.MenuItems.Add("Hello World", HelloWorld_Clicked);
    textBox1.ContextMenu = menu;
    this.ContextMenu = menu;
}

private void HelloWorld_Clicked(object sender, EventArgs e)
{
    MessageBox.Show("Hello World!");
}

我尝试了你的修复措施,恐怕你怀疑是错误的。无论如何,出现的菜单对于该表单来说都没有意义。 - Martin Brown
很抱歉听到这个消息,@MartinBrown。这个答案讨论了本地控件上的模态循环,可能可以解释您看到的行为。我怀疑修复它会比它值得的麻烦多。 - Don Kirkby
你是否将代码放置在文本框的父窗体的“New”方法中,或者如果文本框是用户定义控件的一部分,则将其放置在文本框的“New”方法中? 也许你的项目中的其他代码在某个阶段更改了文本框属性“ContextMenu”。 - Chris Raisin

1

你可以尝试的一件事:

[DllImport("user32.dll")]
public static extern bool ReleaseCapture();

void textBox1_MouseDown(object sender, MouseEventArgs e) {
  if (e.Button == MouseButtons.Right) {
    ReleaseCapture();
  }
}

0
如果有帮助的话,我在互联网的另一个部分找到了这个答案:
[C#] textBox1.ContextMenu = new ContextMenu();
[VB.Net] textBox1.ContextMenu = New ContextMenu()

我已经将上下文菜单属性设置为新的ContextMenu,所以不是那个问题。我刚刚尝试了一下使用.Net Core的新ContextMenuStrip,似乎也有同样的问题。 - Martin Brown
你是否将代码放置在文本框的父窗体的“New”方法中,或者如果文本框是用户定义控件的一部分,则将其放置在文本框的“New”方法中? 也许你的项目中的其他代码在某个阶段更改了文本框属性“ContextMenu”。 - Chris Raisin
我实际上已经在我的问题示例中放置了整个程序代码。我不确定你所说的“New”方法是什么意思?你是指构造函数吗?如果是,那么是的,我把代码放在窗体的构造函数中。 - Martin Brown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接