Попытка добавить ToolStrip к ToolStripPanel бок о бок с существующим ToolStrip

Другой метод:

my_list = [480, 9, 104]
pat = r'({})'.format('|'.join(str(i) for i in my_list))
#'(480|9|104)' <-- This is how the pat looks like
df.loc[df.split_categories.astype(str).str.extract(pat, expand=False).dropna().index]

Или:

pat = '|'.join(r"\b{}\b".format(x) for x in my_list)
df[df.split_categories.astype(str).str.contains(pat,na=False)]

    album_id    categories  split_categories
0   66562       480.494     [480, 494]
3   1709        9.000       [9]
4   59239       105.104     [105, 104]

Это будет работать с колонками split_categories и categories.

5
задан Patrick 31 December 2008 в 18:54
поделиться

3 ответа

Я создал пользовательский ToolStripPanel так, чтобы я мог перегрузить LayoutEngine;

using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.Layout;

namespace CustomGUI
{
  class CustomToolStripPanel : ToolStripPanel
  {
    private LayoutEngine _layoutEngine;

    public override LayoutEngine LayoutEngine
    {
      get
      {
        if (_layoutEngine == null) _layoutEngine = new CustomLayoutEngine();
        return _layoutEngine;
      }
    }

    public override Size GetPreferredSize(Size proposedSize)
    {
      Size size = base.GetPreferredSize(proposedSize);

      foreach(Control control in Controls)
      {
        int newHeight = control.Height + control.Margin.Vertical + Padding.Vertical;
        if (newHeight > size.Height) size.Height = newHeight;
      }

      return size;
    }
  }
}

Затем пользовательский LayoutEngine размечает ToolStrips;

using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.Layout;

namespace CustomGUI
{
  class CustomLayoutEngine : LayoutEngine
  {
    public override bool Layout(object container, LayoutEventArgs layoutEventArgs)
    {
      Control parent = container as Control;

      Rectangle parentDisplayRectangle = parent.DisplayRectangle;

      Control [] source = new Control[parent.Controls.Count];
      parent.Controls.CopyTo(source, 0);

      Point nextControlLocation = parentDisplayRectangle.Location;

      foreach (Control c in source)
      {
        if (!c.Visible) continue;

        nextControlLocation.Offset(c.Margin.Left, c.Margin.Top);
        c.Location = nextControlLocation;

        if (c.AutoSize)
        {
          c.Size = c.GetPreferredSize(parentDisplayRectangle.Size);
        }

        nextControlLocation.Y = parentDisplayRectangle.Y;
        nextControlLocation.X += c.Width + c.Margin.Right + parent.Padding.Horizontal;
      }

      return false;
    }
  }
}

Одна вещь, которая требовала времени, является этим изменяющим местоположение / размер одного объекта ToolStrip заставит расположение повторно стрелять с переупорядоченными средствами управления. Таким образом, я делаю копию средств управления перед циклом расположения. И Вы наклоняетесь, используют AddRange (...), чтобы добавить, что объекты к Пользовательской Панели по некоторым причинам - должны Добавить (...) их по одному.

надежда, которая помогает (она основана на примере MSDN LayoutEngine, зафиксированном для ToolStripPanels),

Wyzfen

5
ответ дан 14 December 2019 в 04:49
поделиться

Я думаю в Вашем случае, можно сойти с рук просто установка LayoutStyle на ToolStrip к ToolStripLayoutStyle. HorizontalStackWithOverflow, а не потребность Ваш собственный LayoutEngine.

Я задал другой вопрос по подобной теме о том, как обработать расположение с динамическими объектами, чтобы иметь лучший контроль над переполнением.

1
ответ дан 14 December 2019 в 04:49
поделиться

System.Windows.Forms.FlowLayoutPanel может выполнять эту работу.

Просто поместите в него элементы управления ToolStrip в правильном порядке.

2
ответ дан 14 December 2019 в 04:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: