Свернуть «кнопку» для управления сплитконтейнером - PullRequest
7 голосов
/ 17 июня 2011

Я использую элемент управления Microsoft splitcontainer в моем WinForms настольном приложении (.net 4 / c # / vs 2010).

Мне бы хотелось иметь маленькую кнопку (или любой приятный элемент пользовательского интерфейса) между панелями элемента управления spliiter, чтобы свернуть одну из панелей. Например. «кнопка» с двумя частями, если я щелкаю одну часть, правая боковая панель разрушается, если я нажимаю другую часть, левая боковая панель разрушается.

Как я могу решить это?

Спасибо заранее!

Ответы [ 3 ]

8 голосов
/ 17 июня 2011

Для этого вам нужно написать собственное событие. Вы должны решить дизайн. Надеюсь, вам нужно что-то вроде ниже.

private void radButton1_Click(object sender, EventArgs e) 
{ 
    splitPanel1.Collapsed = !splitPanel1.Collapsed; 
}

РЕДАКТИРОВАТЬ 1

Легкого пути, как ты думаешь, не существует. Взгляните здесь и здесь , чтобы получить представление.

РЕДАКТИРОВАТЬ 2

Вы можете добавить два toolStrips на обе панели, которые являются Dock: Top и добавить две кнопки, как на рисунке ниже, что выглядит довольно хорошо. Просто мысль ...

enter image description here

Edit3

Splitter - еще один вариант для вас. Взгляните здесь .

3 голосов
/ 24 января 2012

Я использовал это решение в своей реализации, возможно, вам уже слишком поздно, но он может помочь другим людям.

В моей реализации я также перемещал элементы управления с одной панели на другую, поэтому в качестве последнего действия я изменяю только свернутое состояние панели.

Поскольку я не могу публиковать изображения, просто попытайтесь выяснить это в соответствии со следующей схемой (кнопки [<] и [>] - это кнопки):

 ╔════════════╤═════════════╗
 ║         [<]│[>]          ║ 
 ║            │             ║ 
 ║            │             ║ 
 ║            │             ║ 
 ║            │             ║ 
 ║            │             ║ 
 ╚════════════╧═════════════╝

Ниже приведена реализация для левой панели (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();
    }
2 голосов
/ 24 октября 2013

Вдохновленный макетом 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;


        }
}
...