Вдохновленный макетом Lotus Notes, я разработал что-то, что, на мой взгляд, было бы полезно в этой ситуации. Он содержит только одну кнопку между панелями, которая переключает состояние раскрытия / сворачивания одной панели, но его можно легко изменить, используя две кнопки для управления правой и левой панелями. Он использует два разделенных контейнера, один закреплен внутри другого, и событие mouseMove «средней» панели для имитации перетаскивания разделителя ( Перемещение элемента управления путем перетаскивания его мышью в C # ).
Кроме того, я использую событие ClientSizedChanged контейнеров для обработки логики переключения изображений кнопок вместо метода, который сворачивает / разворачивает панель ( Обнаружение, когда свернутый SplitContainer изменяет ).
Дизайн:
splitContainer1
╔════════════╤═════════════════════════════════╗
║ │ splitContainer2 (docked fill) ║
║ │ ╔════════════╤════════════════╗ ║
║ │ ║ │ ║ ║
║ │ ║ Button(s) │ ║ ║
║ │ ║ [<>] │ ║ ║
║ │ ║ │ ║ ║
║ │ ╚════════════╧════════════════╝ ║
╚════════════╧═════════════════════════════════╝
splitContainer2.Dock = DockStyle.Fill;
splitContainer1 = splitContainer2.IsSplitterFixed = true;
splitContainer2.Panel1.Cursor = Cursors.VSplit;
Привязать кнопку влево или вправо (или закрепить несколько кнопок внутри элемента управления tableLayout). Просто убедитесь, что на панели все еще есть какая-то часть, на которую можно нажать / перетащить.
Установите максимальное значение средней панели на меньшее число. Размер зависит от того, насколько широкими должны быть ваши кнопки.
Код:
Панель переключится в противоположное состояние
Если вам действительно нужна одна кнопка с двумя частями вместо двух кнопок или кнопки переключения, вам нужно будет щелкнуть координаты мыши и иметь различную логику в зависимости от того, где произошел щелчок.
private void btnExpand_Click(object sender, EventArgs e)
{
splitContainer1.Panel1Collapsed = !splitContainer1.Panel1Collapsed;
}
логика Генделя, связанная с расширением / коллапсом. Я решил использовать это событие, потому что в моей программе есть несколько способов, которыми пользователь может свернуть / развернуть панели.
private void splitContainer1_Panel2_ClientSizeChanged(object sender, EventArgs e)
{
if (splitContainer1.Panel1Collapsed)
{
splitContainer2.Panel1.Cursor = Cursors.Default;
this.btnExpand.Image = imageExpand;
}
Else
{
splitContainer2.Panel1.Cursor = Cursors.VSplit;
this.btnExpand.Image = imageCollapse;
}
}
Изменение размеров панелей из-за перемещения искусственного разветвителя
private void splitContainer2_Panel1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
/* All you really need is this:
splitContainer1.SplitterDistance += e.X;
Note: Splitter distance must be a positive integer and e.X will be negitive when dragging to the left of the splitContainer. You could handel this check here or on the splitterMoving event.
The code I have below shows how to “snap” a panel closed if the splitter is moved close enough to the edge
Or prevent a panel from being hidden from view (which could also be accomplished by setting the minimum size of a panel).
*/
if (e.X + splitContainer1.SplitterDistance < 40)
{
while (splitContainer1.SplitterDistance > 1)
splitContainer1.SplitterDistance--;
splitContainer1.Panel1Collapsed = true;
}
else if ((e.X + splitContainer1.SplitterDistance) * 1.00 / this.Width * 1.00 < .75)
splitContainer1.SplitterDistance += e.X;
else
Cursor.Current = Cursors.No;
}
}