C# 删除子菜单项图像边距

C# Removing Submenu Item Image Margins

请参阅下面链接的屏幕截图。

简而言之,我需要那些小白框消失 - 它们应该包含图像,但没有图像,所以我宁愿它们消失。

我使用以下代码完成了此操作:

foreach (ToolStripMenuItem menuItem in mnuMain.Items)
   ((ToolStripDropDownMenu)menuItem.DropDown).ShowImageMargin = false;

我猜这适用于主要项目,但不适用于子项目,正如您在图片中看到的那样。

我尝试了上述代码的一些变体,试图让它捕获所有内容,而不仅仅是第一级项目,但没有成功。

我做错了什么?

http://i.imgur.com/bst1i4v.png

您也应该对子项目执行此操作。为此,您可以使用此代码:

private void Form1_Load(object sender, EventArgs e)
{
    SetValuesOnSubItems(this.menuStrip1.Items.OfType<ToolStripMenuItem>().ToList());
}

private void SetValuesOnSubItems(List<ToolStripMenuItem> items)
{
    items.ForEach(item =>
            {
                var dropdown = (ToolStripDropDownMenu)item.DropDown;
                if (dropdown != null)
                {
                    dropdown.ShowImageMargin = false;
                    SetValuesOnSubItems(item.DropDownItems.OfType<ToolStripMenuItem>().ToList());
                }
            });
}

这是上面的修改版本。使用:

    MainMenuStrip.HideImageMargins(); 

因为递归方法执行预期的操作,所以我使用重载来使预期的更清楚。使用模式匹配是因为上面的示例会抛出异常,而不是return null.

    public static void HideImageMargins([NotNull] this MenuStrip menuStrip)
    {
        HideImageMargins(menuStrip.Items.OfType<ToolStripMenuItem>().ToList());
    }

    private static void HideImageMargins([NotNull] this List<ToolStripMenuItem> toolStripMenuItems)
    {
        toolStripMenuItems.ForEach(item =>
                      {
                          if (!(item.DropDown is ToolStripDropDownMenu dropdown))
                          {
                              return;
                          }

                          dropdown.ShowImageMargin = false;

                          HideImageMargins(item.DropDownItems.OfType<ToolStripMenuItem>().ToList());
                      });
    }