Свернуть "кнопку" для управления 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

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

enter image description here

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;


        }
}