1

右键单击富文本框后,我正在创建上下文菜单条。有 2 个选项,一个用于更改字体,一个用于更改背景颜色。但是,一旦我单击其中一个菜单选项,上下文菜单条就不会关闭并覆盖显示的对话框。我知道我可以使它“全局”并强制它关闭,但我宁愿不这样做。处理这个问题的最佳方法是什么?

// If the console is right clicked then show font options
private void rtb_console_MouseUp(object sender, MouseEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Right)
    {
        ContextMenuStrip menu = new ContextMenuStrip();
        menu.Items.Add("Change Font");
        menu.Items.Add("Change Background Color");
        menu.Show(this, new Point(e.X, e.Y));
        menu.ItemClicked += new ToolStripItemClickedEventHandler(menu_ItemClicked_ChangeFont);
    }
}  

// Determine whether to change the font or the font background color
void menu_ItemClicked_ChangeFont(object sender, ToolStripItemClickedEventArgs e)
{
    Application.DoEvents();  // Read that this might help, but it doesn't
    if (e.ClickedItem.Text == "Change Font")
    {
        FontDialog font = new FontDialog();

        font.ShowColor = true;
        font.Font = rtb_console.Font;
        font.Color = rtb_console.ForeColor;

        if (font.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            rtb_console.Font = font.Font;
            rtb_console.ForeColor = font.Color;
        }
    }
    else if (e.ClickedItem.Text == "Change Background Color")
    {
        ColorDialog color = new ColorDialog();
        color.Color = rtb_console.BackColor;

        if (color.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            rtb_console.BackColor = color.Color;
        }
    }
}  

所以这就是发生的事情:
ContextMenuStrip 持久化

4

2 回答 2

2

您不想ContextMenuStrip每次都手动创建并显示它。更好的方法是创建ContextMenuStrip一次。然后RichTextBox通过将其分配给 的ContextMenuStrip属性将其分配给RichTextBox。这样做,您将不再需要在ContextMenuStrip用户每次点击它时手动启动。它会自动发生。它还会以您单击它时所期望的方式自动隐藏自己。

执行一次,然后删除 MouseUp 事件的事件处理程序:

ContextMenuStrip menu = new ContextMenuStrip(); 
menu.Items.Add("Change Font"); 
menu.Items.Add("Change Background Color"); 
menu.ItemClicked += new ToolStripItemClickedEventHandler(menu_ItemClicked_ChangeFont);
rtb_console.ContextStripMenu = menu;

另外,请不要Application.DoEvents();尝试强制用户界面自行更新。 前往此处阅读最佳答案。 一般来说,如果你使用Application.DoEvents(),你做错了什么,应该考虑改变你的方法。

您也可以考虑做一件事,但这实际上只是一个偏好问题……如果您使用的是 Visual Studio,请考虑ContextMenuStrip在设计器中创建您。这样,您可以非常轻松且直观地为每个项目添加项目、图标和单独的回调。只是出于纯粹的个人喜好,我喜欢做的事情。

于 2012-09-19T14:07:06.937 回答
1

只需ToolStripItemClickedEventArgs声明:

ContextMenuStrip menu = (ContextMenuStrip)(Sender) 

if (e.ClickedItem.Text == "Change Font")
{
    menu.hide();
    /* and your code here*/...
}
于 2017-03-27T11:05:37.897 回答