6

ss

在屏幕截图中,我用绿色矩形标记了空白区域,我希望 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;
    }
4

3 回答 3

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))
于 2017-05-26T07:42:13.863 回答
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 引擎通常非常灵活,当您了解其内部结构时,可以使用它来实现非常有趣的东西。

于 2014-05-21T09:15:50.427 回答
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();

编辑:

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

于 2017-05-26T20:56:50.873 回答