Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用c的Winform上下文菜单#_C#_Winforms - Fatal编程技术网

C# 使用c的Winform上下文菜单#

C# 使用c的Winform上下文菜单#,c#,winforms,C#,Winforms,我需要在Winform应用程序中使用上下文菜单。请注意,它需要是一个ContextMenu,而不是ContextMenuStrip。ContextMenu的问题是,我没有看到任何方法或属性来设置字体并在菜单项旁边显示图像/图标,这在ContextMenuStrip中很容易 是否可以在ContextMenu中设置字体并在菜单项旁边显示图像/图标?默认ContextMenu不提供此功能。如果需要此功能,您应该创建自己的自定义菜单项,或者可以在事件处理程序中启用项的模式并进行手动绘制: var ite

我需要在Winform应用程序中使用上下文菜单。请注意,它需要是一个ContextMenu,而不是ContextMenuStrip。ContextMenu的问题是,我没有看到任何方法或属性来设置字体并在菜单项旁边显示图像/图标,这在ContextMenuStrip中很容易


是否可以在ContextMenu中设置字体并在菜单项旁边显示图像/图标?

默认ContextMenu不提供此功能。如果需要此功能,您应该创建自己的自定义菜单项,或者可以在事件处理程序中启用项的模式并进行手动绘制:

var item = new MenuItem("foo");
item.OwnerDraw = true;
item.DrawItem += item_DrawItem;
顺便说一句,您还需要处理MeasureItem事件,以提供您将手动绘制的项目的大小。例如,创建斜体字体

void item_MeasureItem(object sender, MeasureItemEventArgs e)
{
    var item = (MenuItem)sender;
    var g = e.Graphics;
    Font font = new Font("Arial", 10, FontStyle.Italic);

    e.ItemWidth = 200;
    var size = g.MeasureString(item.Text, font, e.ItemWidth);
    e.ItemHeight = (int)size.Height;            
}

void item_DrawItem(object sender, DrawItemEventArgs e)
{
    var item = (MenuItem)sender;
    var g = e.Graphics;            
    var font = new Font("Arial", 10, FontStyle.Italic);
    var brush = new SolidBrush(e.ForeColor);
    g.DrawString(item.Text, font, brush, e.Bounds.X, e.Bounds.Y);
}
以及增加项目:

ContextMenu = new ContextMenu(new []{new MenuItem("foo"), new MenuItem("bar")});
foreach (MenuItem item in ContextMenu.MenuItems)
{
    item.OwnerDraw = true;
    item.MeasureItem += item_MeasureItem;
    item.DrawItem += item_DrawItem;
}
ContextMenu = new ContextMenu(new []{ 
     new MenuItemWithItalicFont("foo"), 
     new MenuItemWithItalicFont("bar")});

与自定义菜单项类相同:

public class MenuItemWithItalicFont : MenuItem
{
    private Font font;

    public MenuItemWithItalicFont(string text)
        : base(text)
    {
        OwnerDraw = true;
        font = new Font("Arial", 10, FontStyle.Italic);
    }

    protected override void OnMeasureItem(MeasureItemEventArgs e)
    {
        var g = e.Graphics;
        e.ItemWidth = 200;
        var size = g.MeasureString(Text, font, e.ItemWidth);
        e.ItemHeight = (int)size.Height;
    }

    protected override void OnDrawItem(DrawItemEventArgs e)
    {
        base.OnDrawItem(e);
        var g = e.Graphics;
        var brush = new SolidBrush(e.ForeColor);
        g.DrawString(Text, font, brush, e.Bounds.X, e.Bounds.Y);
    }
}
添加项目:

ContextMenu = new ContextMenu(new []{new MenuItem("foo"), new MenuItem("bar")});
foreach (MenuItem item in ContextMenu.MenuItems)
{
    item.OwnerDraw = true;
    item.MeasureItem += item_MeasureItem;
    item.DrawItem += item_DrawItem;
}
ContextMenu = new ContextMenu(new []{ 
     new MenuItemWithItalicFont("foo"), 
     new MenuItemWithItalicFont("bar")});

注意实际上ContextMenu已被ContextMenuStrip控件替换,如果需要此功能,则应使用新控件。旧的ContextMenu仍然存在,主要是为了向后兼容:

保留ContextMenu是为了向后兼容和将来使用 如果您选择,请使用


你能解释一下为什么不使用ContextMenuStrip吗?@Asaf我更喜欢旧ContextMenu的外观和感觉