簡體   English   中英

如何在ToolStripMenuItem中刪除右側空白區域

[英]How to remove right side empty space in ToolStripMenuItem

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;
    }

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

如上所述,這個空間是為“打開子菜單”箭頭保留的,一般我不建議觸摸它,但當然可以刪除該空間。 實際上有幾種方法可以做到這一點,但所有這些方法都需要一些編碼。 這里是最簡單的方法,你必須知道預期的寬度(它可以通過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引擎通常非常靈活,當您了解其內部結構時,可以使用它來實現非常有趣的事情。

轉換方舟對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();

編輯:

我現在注意到它是靜態字段,它從所有控件中刪除箭頭填充。 所以這也不是一個好的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM