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

本文关键字:图像 菜单项 删除 | 更新日期: 2023-09-27 18:12:48

见下面的链接截图

简而言之,我需要那些白色的小盒子消失——它们应该容纳图像,但是没有图像,所以我宁愿它们消失。

我用下面的代码完成了这个任务:

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

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

我已经尝试了上面的代码的一些变化,试图让它捕捉一切,而不仅仅是第一个级别的项目,但没有运气。

我做错了什么?

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

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

对于子条目也应该这样做。为此,您可以使用以下代码:

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(); 

因为递归方法执行预期的操作,所以我使用重载来更清楚地说明预期的操作。使用模式匹配是因为上面的示例将抛出异常,而不是返回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());
                      });
    }