在屏幕截图中,我用绿色矩形标记了空白区域,我想在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;
}
答案 0 :(得分:1)
VB版本(实际上箭头有18个像素:10个用于大小,8个用于边距,留下2个像素用于边距)
Parent.DropDown.GetType.GetField("ArrowPadding",
Reflection.BindingFlags.NonPublic Or
Reflection.BindingFlags.Static).SetValue(Nothing, New Padding(0, 0, -16, 0))
答案 1 :(得分:0)
如上所述,此空间仅供“打开子菜单”使用。箭头,一般情况下我不建议触摸它,但当然可以删除该空间。实际上有几种方法可以做到这一点,但所有这些方法都需要一些编码。这里是最简单的方法,你必须知道预期的宽度(它可以通过ToolstripItem.GetPreferredSize计算):
private void RecentButton_DropDownOpening(object sender, EventArgs e)
{
ToolStripDropDownItem RecentButton = (ToolStripDropDownItem)sender;
RecentButton.DropDown.SuspendLayout();
try
{
RecentButton.DropDownItems.Clear();
// Populate items
RecentButton.DropDown.MinimumSize = new Size(RecentButton.Bounds.Right - DisplayRectangle.Left, 0);
RecentButton.DropDown.MaximumSize = RecentButton.DropDown.MinimumSize;
}
finally
{
RecentButton.DropDown.ResumeLayout();
}
}
ToolStip引擎一般非常灵活,当你知道它的内部结构时,可以用它来实现非常有趣的东西。
答案 2 :(得分:0)
将Ark的答案转换为C#:
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();
编辑:
我现在注意到因为它是静态字段,它会从所有控件中删除箭头填充。所以这也不是一个好的解决方案。