右键单击Rich Text Box后,我将创建一个Context Menu Strip。有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;
}
}
}
这就是发生的事情:
答案 0 :(得分:1)
您不想创建ContextMenuStrip
并且每次都手动显示它。更好的方法是创建ContextMenuStrip
一次。然后通过将其分配给RichTextBox
的{{1}}属性为ContextMenuStrip
分配。这样,您每次用户点击它时都不再需要手动启动RichTextBox
。它会自动发生。它还会以您点击它时的方式自动隐藏自己。
执行一次,然后删除MouseUp事件的事件处理程序:
ContextMenuStrip
此外,请不要使用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;
尝试强制UI自行更新。 Head over to here and read the top answer.一般来说,如果您使用的是Application.DoEvents();
,那么您做错了什么,应该考虑改变您的做法。
您可能还会考虑做一件事,但这只是一个偏好问题......如果您使用的是Visual Studio,请考虑在设计器中创建Application.DoEvents()
。这样,您可以非常轻松,直观地为每个项目添加项目,图标和单个回调。出于纯粹的个人喜好,我喜欢做的事情。
答案 1 :(得分:0)
在ToolStripItemClickedEventArgs
中声明:
ContextMenuStrip menu = (ContextMenuStrip)(Sender)
if (e.ClickedItem.Text == "Change Font")
{
menu.hide();
/* and your code here*/...
}