Winforms MenuStrip快捷键间距

Winforms MenuStrip快捷键间距,winforms,menustrip,Winforms,Menustrip,在WinForms MenuStrip中,是否有一种简单的方法可以增加菜单项文本与其快捷键之间的间距?如下所示,即使是VS生成的默认模板看起来也很糟糕,文本“打印预览”超出了其他项目的快捷键: 我正在寻找一种方法,使最长的菜单项和快捷键边距的开头之间有一定的间距。一种简单的方法是将较短的菜单项隔开。例如,将“新建”菜单项的“文本”属性填充为“新建”,这样它的末尾就有了所有额外的空格,这将推到快捷方式上 更新 我建议在代码中自动实现这一点以帮助您。下面是让代码为您完成工作的结果: 我编写了以下

在WinForms MenuStrip中,是否有一种简单的方法可以增加菜单项文本与其快捷键之间的间距?如下所示,即使是VS生成的默认模板看起来也很糟糕,文本“打印预览”超出了其他项目的快捷键:


我正在寻找一种方法,使最长的菜单项和快捷键边距的开头之间有一定的间距。

一种简单的方法是将较短的菜单项隔开。例如,将“新建”菜单项的“文本”属性填充为“新建”,这样它的末尾就有了所有额外的空格,这将推到快捷方式上

更新

我建议在代码中自动实现这一点以帮助您。下面是让代码为您完成工作的结果:

我编写了以下代码,您可以调用这些代码,它将遍历菜单条下的所有主菜单项,并调整所有菜单项的大小:

// put in your ctor or OnLoad
// Note: the actual name of your MenuStrip may be different than mine
// go through each of the main menu items
foreach (var item in menuStrip1.Items)
{
    if (item is ToolStripMenuItem)
    {
        ToolStripMenuItem menuItem = (ToolStripMenuItem)item;
        ResizeMenuItems(menuItem.DropDownItems);
    }
}
这些是完成这项工作的方法:

private void ResizeMenuItems(ToolStripItemCollection items)
{
    // find the menu item that has the longest width 
    int max = 0;
    foreach (var item in items)
    {
        // only look at menu items and ignore seperators, etc.
        if (item is ToolStripMenuItem)
        {
            ToolStripMenuItem menuItem = (ToolStripMenuItem)item;
            // get the size of the menu item text
            Size sz = TextRenderer.MeasureText(menuItem.Text, menuItem.Font);
            // keep the longest string
            max = sz.Width > max ? sz.Width : max;
        }
    }

    // go through the menu items and make them about the same length
    foreach (var item in items)
    {
        if (item is ToolStripMenuItem)
        {
            ToolStripMenuItem menuItem = (ToolStripMenuItem)item;
            menuItem.Text = PadStringToLength(menuItem.Text, menuItem.Font, max);
        }
    }
}

private string PadStringToLength(string source, Font font, int width)
{
    // keep padding the right with spaces until we reach the proper length
    string newText = source;
    while (TextRenderer.MeasureText(newText, font).Width < width)
    {
        newText = newText.PadRight(newText.Length + 1);
    }
    return newText;
}
private void ResizeMenuItems(ToolStripItemCollection项)
{
//查找宽度最长的菜单项
int max=0;
foreach(项目中的var项目)
{
//只查看菜单项,忽略分隔符等。
if(项目为ToolStripMenuItem)
{
ToolStripMenuItem menuItem=(ToolStripMenuItem)项;
//获取菜单项文本的大小
Size sz=textrender.MeasureText(menuItem.Text,menuItem.Font);
//保留最长的字符串
最大=深宽>最大?深宽:最大;
}
}
//浏览菜单项,使其长度大致相同
foreach(项目中的var项目)
{
if(项目为ToolStripMenuItem)
{
ToolStripMenuItem menuItem=(ToolStripMenuItem)项;
menuItem.Text=PadStringToLength(menuItem.Text,menuItem.Font,max);
}
}
}
私有字符串PadStringToLength(字符串源、字体、整型宽度)
{
//继续在右边填充空格,直到达到合适的长度
字符串newText=源;
while(TextRenderer.MeasureText(newText,font).Width
问题在于,很难确定非固定宽度字体所需的空格数——这不像字符串长度那么简单+1.尽管如此,谢谢,我接受了这个答案--我真的不想最终使用
MeasureText
,但我找不到更好的方法。