문제

Visual Studio 2005와 함께 .NET 2.0을 사용하고 있으며 나란히 표시되도록 양식 상단에 두 개의 다른 도구 스트립을 추가하려고합니다. Word 2003처럼, 동일한 행에 여러 개의 도구 스트립을 추가하고 각 도구 스트립에 행을 전념하기보다는 서로 일치하게 표시 할 수 있습니다.

그래서 Toolstrippanel을 추가하고 양식의 상단에 도킹했습니다 (추가 패널이 필요하지 않기 때문에 ToolStripContainer를 사용하지 않았습니다. 상단에 하나만 필요합니다). 공구 스트립을 모두 추가하고 스트레치 속성을 False로 설정했습니다. 디자이너 창에 나란히 표시되도록 할 수 있지만 런타임에 도구 스트립 파넬은 도구 스트립을 분리하고 각 도구 스트립 자체 전용 행을 제공합니다. 부상에 대한 모욕을 더하는 것처럼 디버깅을 중단하고 디자이너에게 다시 돌아올 때 디자이너가 도구 스트립을 자신의 행으로 옮기고 있음을 알게되었습니다! 내가 여기서 뭔가 잘못하고 있는가?

나는 하루 종일 인터넷 검색을했고 Toolstrippanelrow 객체에 대한 정보를 찾았지만 툴 스트립을 추가하는 쉬운 방법은 보이지 않습니다 (즉, Toolstrippanelrow.controls.add 메소드가 없음) 그것은 컨트롤 객체를 반환하는 컨트롤 () 속성이며, 해당 배열에 항목을 추가하려는 운이 많지 않았습니다. 또한 Thollstrippanel.join 메소드에 대한 문서를 찾았습니다.이 방법은 작업을 수행 해야하는 것처럼 들리므로 3 개의 과부하를 모두 시도했지만 광고대로 작동하지 않습니다. 내가 무엇을하는지 또는 내가 시도하는 옵션에 관계없이, 그것은 항상 자체 행의 패널 상단에 새 공구 스트립을 추가하고 다른 모든 것을 아래로 밀어 넣습니다.

전체 공개의 이익을 위해 나는 도구 스트립 파넬과 도구 스트립 중 하나가베이스 클래스 형식에 추가된다고 경고해야하며, 다른 도구 스트립을베이스 클래스 형태에서 상속하는 서브 클래스 형태에 추가하려고합니다. 베이스 클래스 형태의 Toolstrippanel과 Toolstrip은 모두 "보호 된 친구"로 선언되었으므로 작동해야합니다. 앞서 언급했듯이 서브 클래스 양식의 디자이너 창은 (적어도 한동안) 그렇게 할 수 있습니다.

누군가 내가이 일을하도록 도와 주거나 적어도 그것이 왜 그렇지 않은지에 대해 약간의 빛을 비추도록 도와 줄 수 있다면, 나는 매우 감사 할 것입니다.

도움이 되었습니까?

해결책

LayoutEngine에 과부하를 줄 수 있도록 사용자 정의 Toolstrippanel을 만들었습니다.

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

그런 다음 맞춤형 레이아웃 엔진은 공구 스트립을 제시합니다.

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

시간이 오래 걸리는 한 가지는 하나의 공구 스트립 항목의 위치 / 크기를 변경하면 컨트롤이 재정렬 된 상태에서 레이아웃이 다시 발사 될 수 있다는 것입니다. 그래서 레이아웃 루프 전에 컨트롤 사본을 가져옵니다. 그리고 AddRange (...)를 사용하여 어떤 이유로 사용자 정의 패널에 항목을 추가 할 수 없습니다. 한 번에 하나씩 추가해야합니다.

그것이 도움이되기를 바랍니다 (그것은 기반입니다 MSDN LayoutEngine 예제, Toolstrippanels 용으로 고정)

Wyzfen

다른 팁

System.windows.forms.flowlayoutpanel은 작업을 수행 할 수 있습니다.

ToolStrip 컨트롤을 올바른 순서로 넣으십시오.

귀하의 경우에는 ToolStrip에서 LayoutStyle을 ToolStriplayoutStyle.horizontalStackwithOverFlow로 설정하여 자신의 사용자 정의 레이아웃을 필요로하지 않고 도망 갈 수 있다고 생각합니다.

나는 물었다 다른 질문 오버플로를 더 잘 제어하기 위해 동적 항목으로 레이아웃을 처리하는 방법에 대한 유사한 주제에서.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top