C# 如何删除ToolStripMenuItem中的右侧空白

C# 如何删除ToolStripMenuItem中的右侧空白,c#,.net,winforms,toolstripitem,C#,.net,Winforms,Toolstripitem,在屏幕截图中,我用绿色矩形标记了空白区域,我希望ToolStripMenuItem中的左右空白区域大小相等,但右侧有更大的空白区域,我无法删除 代码: private void UpdateWorkflowsMenu() { ((ToolStripDropDownMenu)tsddbWorkflows.DropDown).ShowImageMargin = false; tsddbWorkflows.DropDownItems.Clear();

在屏幕截图中,我用绿色矩形标记了空白区域,我希望ToolStripMenuItem中的左右空白区域大小相等,但右侧有更大的空白区域,我无法删除

代码:

    private void UpdateWorkflowsMenu()
    {
        ((ToolStripDropDownMenu)tsddbWorkflows.DropDown).ShowImageMargin = false;

        tsddbWorkflows.DropDownItems.Clear();

        Program.HotkeyManager.Hotkeys.ForEach<HotkeySettings>(x =>
        {
            if (x.TaskSettings.Job != HotkeyType.None && (!Program.Settings.WorkflowsOnlyShowEdited || !x.TaskSettings.IsUsingDefaultSettings))
            {
                ToolStripMenuItem tsmi = new ToolStripMenuItem(x.TaskSettings.Description);
                if (x.HotkeyInfo.IsValidHotkey) tsmi.ShortcutKeyDisplayString = " " + x.HotkeyInfo.ToString();
                tsmi.Click += (sender, e) => HandleTask(x.TaskSettings);
                tsddbWorkflows.DropDownItems.Add(tsmi);
            }
        });

        tsddbWorkflows.Visible = tsddbWorkflows.DropDownItems.Count > 0;
    }
private void UpdateWorkflowsMenu()
{
((ToolStripDropDownMenu)tsddbWorkflows.DropDown).ShowImageMargin=false;
tsddbWorkflows.DropDownItems.Clear();
Program.HotkeyManager.Hotkeys.ForEach(x=>
{
if(x.TaskSettings.Job!=HotkeyType.None&(!Program.Settings.WorkflowsOnlyShowEdited | | |!x.TaskSettings.IsUsingDefaultSettings))
{
ToolStripMenuItem tsmi=新的ToolStripMenuItem(x.TaskSettings.Description);
如果(x.HotkeyInfo.IsValidHotkey)tsmi.ShortcutKeyDisplayString=“”+x.HotkeyInfo.ToString();
tsmi.点击+=(发送者,e)=>HandletTask(x.TaskSettings);
tsddbWorkflows.DropDownItems.Add(tsmi);
}
});
tsddbWorkflows.Visible=tsddbWorkflows.DropDownItems.Count>0;
}

如上所述,此空间是为“打开子菜单”箭头保留的,通常我不建议触摸此空间,但当然可以删除该空间。实际上有几种方法可以做到这一点,但它们都需要一些编码。这里是实现这一点的最简单方法的代码段,但您必须知道预期宽度(可以通过ToolstripItem.GetPreferredSize计算):

ToolStip引擎通常非常灵活,当您了解其内部结构时,可以使用它实现非常有趣的事情。

VB版本(实际上箭头有18个像素:10个表示大小,8个表示边距,留2个像素表示边距)

他对C的回答是:

使用扩展,这样我就可以在多个地方像这样使用它:

tsddbWorkflows.HideImageMargin();
tsddbWorkflows.HideArrowMargin();
编辑:


我现在注意到,因为它是静态字段,所以它删除了所有控件中的箭头填充。所以这也不是一个好的解决方案。

是的,它是Windows窗体。您不能删除它。看来你弄乱了ShowImageMargin的属性。期望我们从截图中调试您的代码是不合理的。显示代码。我添加了代码。即使ShowImageMargin为真,空间仍然存在。那么,如果他禁用了
ShowImageMargin
属性该怎么办?他不是在问如何恢复左边距。他想删除右边距。我尝试禁用/启用它,但仍然存在空白:并且没有x.HotkeyInfo.ToString()方法不会返回右侧有空白的字符串。我以前并没有添加代码,因为这只是一个简单的新工具StripMenuItem(),代码中的其他东西并没有造成此空间。我尝试了您的代码,但下拉列表大小是错误的:您应该理解,这是从工作代码中获取的示例,与默认行为相反,您必须自己计算下拉列表宽度。我现在注意到了这个问题,因为它是静态字段,所以从所有下拉控件中删除填充。因此,我无法使用此解决方案。由于每次显示一个下拉列表,您可以在DropDownOpen事件中设置负边距,并在DropdownClosed事件中恢复为默认值(0,0,8,0)
Parent.DropDown.GetType.GetField("ArrowPadding", 
Reflection.BindingFlags.NonPublic Or 
Reflection.BindingFlags.Static).SetValue(Nothing, New Padding(0, 0, -16, 0))
public static void HideArrowMargin(this ToolStripDropDownItem tsddi)
{
    tsddi.DropDown.GetType().GetField("ArrowPadding", BindingFlags.NonPublic | BindingFlags.Static).SetValue(null, new Padding(0, 0, -14, 0));
}

public static void HideImageMargin(this ToolStripDropDownItem tsddi)
{
    ((ToolStripDropDownMenu)tsddi.DropDown).ShowImageMargin = false;
}
tsddbWorkflows.HideImageMargin();
tsddbWorkflows.HideArrowMargin();