2013-05-14 2 views
-2

Есть ли способ левого выравнивания панелей инструментов (не выходя из «пробелов») по коду? enter image description hereСлева выровняйте панели инструментов по коду

(например, при нажатии на button2) enter image description here

PS
Кроме того, эта ситуация

enter image description here
К "выравнивание по левому краю" означает:
enter image description here

+0

Выровнять слева Панели инструментов означает, что Вы должны изменить ПОлОжЕНИЕ MenuStrip что-то подобное.? –

+0

Мне нужно, чтобы панели инструментов с первого изображения были выровнены как панели инструментов во втором изображении. – serhio

+0

Просто чтобы я мог убедиться, что понял эту проблему, не так ли, когда вы пристыковываете (DockStyle), вы не можете применить ширину? И как таковая, ширина намного шире, чем хотелось бы. – Dave

ответ

0

Update

Основываясь на ваших критериях, изменяющихся довольно резко, вот какой-то код, который заставит вас идти. Он не идеален и не близок к совершенству!

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     _otherStrips = new List<OtherStrips>(); 
    } 

    private int _currentHeight = 0; 
    private List<OtherStrips> _otherStrips; 

    private void button1_Click(object sender, EventArgs e) 
    { 
     foreach (var c in panel1.Controls) 
     { 
      if (c is ToolStrip) 
      { 
       ToolStrip ts = (ToolStrip)c; 
       _otherStrips.Add(new OtherStrips() { Top = ts.Top, Width = ts.Width, Name = ts.Name }); 
       MoveToPosition(ts); 
      } 
     } 
    } 

    private void MoveToPosition(ToolStrip toolStrip) 
    { 
     bool isInline; 
     toolStrip.Left = GetWidth(toolStrip, out isInline); 

     if (isInline) 
      toolStrip.Top = GetTop(toolStrip); 
    } 

    private int GetWidth(ToolStrip ts, out bool isInline) 
    { 
     int result = 0; 
     isInline = false; 
     foreach (var item in _otherStrips) 
     { 
      if (item.Name == ts.Name) 
       continue; 

      if (item.Top == ts.Top) 
      { 
       isInline = true; 
       break; 
      } 
     } 

     if (!isInline) 
      return result; 

     foreach (var item in _otherStrips) 
     { 
      if (item.Width == ts.Width) 
       result += item.Width; 
     } 

     return result + 22;//hack since the width is out by about 22pixels. Not going to spend any time fixing this 
    } 

    private int GetTop(ToolStrip ts) 
    { 
     foreach (var item in _otherStrips) 
     { 
      if (item.Name == ts.Name) 
       continue; 

      if (item.Top == ts.Top) 
       return item.Top; 
     } 

     _currentHeight += ts.Height; 
     return _currentHeight; 
    } 
} 

struct OtherStrips 
{ 
    public int Top { get; set; } 
    public int Width { get; set; } 
    public string Name { get; set; } 
} 
+0

см. Мое редактирование ... а также может быть переменное количество панелей инструментов ... – serhio

+0

@serhio, я обновил свой ответ. Это не идеальный вариант, но хороший старт – Dave

+0

- это не решение, которое я взял, однако я пометю это как ответ ... – serhio

0

Вы можете использовать это, чтобы осталось выровнять ToolStrip

toolStrip1.Location = new Point(0, toolStrip1.Location.Y); 
+0

используйте тот же код для toolStrip2 и toolStrip3, просто заменив имя .. я протестировал его работу:) – Jexfer

+0

см. Мое редактирование, и это не работает для переменного количества панелей инструментов ... – serhio