Свернуть "кнопку" для управления splitcontainer
Я использую Microsoft splitcontainer control в своем приложения WinForms настольное приложение (.net 4 / c# / vs 2010).
Я хотел бы иметь маленькую кнопку (или любой хороший элемент пользовательского интерфейса) между панелями элемента управления spliiter, чтобы свернуть одну из панелей. Например. "кнопка" с двумя частями, если я нажимаю одну часть, правая боковая панель рушится, если я нажимаю на другую часть, левая боковая панель рушится.
Как я могу солва что?
Thx в вперед!
3 ответов
вам придется написать свое собственное событие для этого. Вы должны решить дизайн. Надеюсь, вам нужно что-то вроде ниже.
private void radButton1_Click(object sender, EventArgs e)
{
splitPanel1.Collapsed = !splitPanel1.Collapsed;
}
правка 1
нет простого способа, как вы думаете. Посмотрите здесь и здесь чтобы получить представление.
Изменить 2
вы можете добавить две полосы инструментов на обе панели, которые являются док: сверху и добавить две кнопки, как на рисунке ниже, который выглядит довольно хорошо. Просто мысль...
Edit3
Splitter-еще один вариант для вас. Посмотрите здесь.
я использовал это решение в своей реализации, вероятно, слишком поздно для вас, но может помочь другим людям.
в моей реализации я также перемещал элементы управления с одной панели на другую, поэтому я только изменяю состояние свернутой панели как последнее действие.
поскольку я не могу публиковать изображения, просто попробуйте выяснить это в соответствии со следующей диаграммой (кнопки [ ]):
╔════════════╤═════════════╗
║ [<]│[>] ║
║ │ ║
║ │ ║
║ │ ║
║ │ ║
║ │ ║
╚════════════╧═════════════╝
Ниже приведена реализация для левого панель (panel1), аналогичная функция также используется для правой панели.
private void setSplitterLeftPanelCollapsedState(bool collapse)
{
splitContainer1.SuspendLayout();
// Collapse the left panel
if (collapse)
{
if (!splitContainer1.Panel1Collapsed)
{
// restoring the panel in the end to apply layout changes
buttonOpenPanel1.Text = ">";
splitContainer1.Panel1Collapsed = true;
}
}
// Open the left panel
else
{
if (splitContainer1.Panel1Collapsed)
{
// collapsing the panel in the end to apply layout changes
buttonOpenPanel1.Text = "<";
splitContainer1.Panel1Collapsed = false;
}
}
splitContainer1.ResumeLayout();
comboBoxSearchText.Focus();
}
вдохновленный макетом 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) . Просто убедитесь, что еще есть какая-то часть панели, доступная для нажатия / перетаскивания на.
Установите максимальное значение with средней панели на низкое число. Размер зависит от того, насколько широкими должны быть ваши кнопки.
код:
панель переключится в противоположное состояние
Если вам действительно нужна одна кнопка с двумя частями вместо двух кнопок или кнопки переключения, вам нужно будет щелкнуть координаты мыши и иметь различную логику в зависимости от того, где произошел щелчок.
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;
}
}
Handel изменение размера панелей из-за перемещения искусственного сплиттера
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;
}
}