每当用户右键单击 ContextMenu
中的特定位置时,我都会显示 DataGridView
。
我希望 ContextMenu
的项目根据其内容具有背景色和前景色。
由于 ContextMenu
没有背景颜色或前景色属性,我该怎么做?
我尝试查找 ContextMenuStrip
但这必须连接到我没有也不想要的 ToolStripButton
。
最佳答案
为了更改 MenuItem
的背景颜色,您需要指定一个绘制项目处理程序并将每个项目的 owner-draw 设置为 true。此外,为了使颜色实际占用一些空间,您需要实现 MeasureMenuItem 处理程序。
所以例如
color.MenuItems.Add(new MenuItem("#123456", menuHandler));
color.MenuItems.Add(new MenuItem("Green", menuHandler));
color.MenuItems.Add(new MenuItem("Red", menuHandler));
foreach (MenuItem item in color.MenuItems)
{
item.OwnerDraw = true;
item.DrawItem += item_DrawItem;
item.MeasureItem += MeasureMenuItem;
}
上面的代码连接了项目及其处理程序。
void item_DrawItem(object sender, DrawItemEventArgs e)
{
MenuItem cmb = sender as MenuItem;
string color = SystemColors.Window.ToString();
if (e.Index > -1)
{
color = cmb.Text;
}
if (checkHtmlColor(color))
{
e.DrawBackground();
e.Graphics.FillRectangle(new SolidBrush(ColorTranslator.FromHtml(color)), e.Bounds);
e.Graphics.DrawString(color, new Font("Lucida Sans", 10), new SolidBrush(ColorTranslator.FromHtml(color)), e.Bounds);
}
}
上面的代码获取 MenuItem 内容,将其转换为颜色,为该颜色创建一个矩形并绘制它。
void MeasureMenuItem(object sender, MeasureItemEventArgs e)
{
MenuItem m = (MenuItem)sender;
Font font = new Font(Font.FontFamily, Font.Size, Font.Style);
SizeF sze = e.Graphics.MeasureString(m.Text, font);
e.ItemHeight = (int)sze.Height;
e.ItemWidth = (int)sze.Width;
}
最后,上面几行简单地测量了 MenuItem 在绘制之前应该占用的区域(基本上是测量它的字符串内容的空间),因此 draw_item 处理程序知道要占用多少空间
关于c# - 如何在 ContextMenu 上添加背景色和前景色,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26779418/