Подтвердить что ты не робот

Создание сплиттера для Split Panel

Как сделать разветкитель сплит-панелей видимым для пользователя, а не быть невидимым с изменением курсора мыши?

4b9b3361

Ответ 1

Попробуйте установить BorderStyle в Fixed3D

Ответ 2

Этот вопрос возникает из-за того, что элемент управления SplitContainer имеет нет прямого свойства для установки стиля самой перетаскиваемой панели разделителей.

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

@BluMonkMN предложил метод с использованием 3D-границы, но что, если вы не хотите какой-либо границы?

@Giles Bathgate предложила добавить обработчик событий Paint, который, несмотря на то, что он, безусловно, изящный и действительно работает, имеет небольшую стоимость, требуя, чтобы вы добавили больше кода в свой проект, который выполняется на уровне С# и может когда-нибудь стать проблема обслуживания.

@Philip Fourie предложила изменить значение свойства SplitContainer.BackColor; однако, что изначально заставляет контролировать весь фон, чтобы изменить цвет, а не только панель разделителя, не вызывая цветовой контраст.

Итак, мое решение является улучшением @Philip Fourie's.

Во-первых, я упомянул, что у SplitContainer есть два разных подконтейнера, разделенных разделительной панелью. Эти два представлены свойствами Panel1 и Panel2. Каждый из них представляет собой контейнер Panel со своими собственными свойствами BackColor, в дополнение к нескольким другим свойствам.

SplitContainer имеет его собственное свойство BackColor, в результате чего получается три уникальных возможных цвета.

Теперь, если вы должны установить это свойство SplitContainer.BackColor, субконтроллеры Panel1 и Panel2 автоматически наследуют это значение цвета, и теперь все они будут одинаковыми, что вызовет визуальный контраст NO! < бр /" > Это наследование свойств [вероятно, нежелательного] свойства происходит только тогда, когда свойства Panel1.BackColor и/или Panel2.BackColor имеют еще не, которые были явно заданы вами (хотя просмотр их значений свойств в свойствах Visual Studio окно раньше времени показало бы "Контроль".)

Следовательно, порядок, заданный для свойств, важен:

  • Задайте для свойств "child" Panel1.BackColor и Panel2.BackColor значение , отличное от значения по умолчанию "Control", чтобы принудительное явное значение (даже если вы действительно хотите "Control", мы исправим это позже.)
  • Задайте "родительский" SplitContainer.BackColor цвет, который вам нужен, чтобы разделительная панель была.
  • Наконец, вернитесь назад и установите свойства Panel1.BackColor и Panel2.BackColor в цвет, которым вы хотите их видеть (возможно, вернитесь в "Управление".)

И как ответил @Philip Fourie, вы можете установить свойство Width, на самом деле последовательно называемое SplitterWidth, независимо от свойства [Горизонтальное против вертикали] Orientation.

Вот несколько полезных советов:

Во время работы в конструкторе форм Visual Studio, если вы нажмете на SplitContainer по обе стороны от разделителя, выберете , что Panel1 или Panel2 "child" суб-контейнер. Но если вы нажмете на панель разделителя, вы выберете "родительский" SplitContainer.

И в связи с тем, что предложил @Stuart Helwig, значение по умолчанию SplitterWidth приведет к тому, что панель разделителя будет выделена, когда у него есть фокус, тем самым заслоняя выбранный вами цвет. Поднимите значение до 5, 6 или выше, что также облегчает захват и перетаскивание конечного пользователя.

Готово. Счастливое кодирование!

Ответ 3

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

private void SplitterPaint(object sender, PaintEventArgs e)
{
    SplitContainer s = sender as SplitContainer;
    if (s != null) {
        int top = 5;
        int bottom = s.Height - 5;
        int left = s.SplitterDistance;
        int right = left + s.SplitterWidth - 1;
        e.Graphics.DrawLine(Pens.Silver, left, top, left, bottom);
        e.Graphics.DrawLine(Pens.Silver, right, top, right, bottom);
    }
}

Ответ 4

Один из способов - изменить свойства Splitter BackColor и Width/Height (в зависимости от ориентации разделителя)

Ответ 5

Также, как и его BorderStyle Fixed3D как @BlueMonkMN, я предложил часто найти значение SplitterWidth по умолчанию для объекта splitContainer, равное 4, немного узкое.

Если вы используете это примерно до 6, с трехмерной рамкой, это немного более очевидно для пользователя.

Ответ 6

Вы можете использовать SplitterColor в дизайнере, чтобы изменить цвет рамки разделителя.

public class SplitContainerCustomSplitter : SplitContainer
{
    [DefaultValue(typeof(Color), "Black")]
    public Color SplitterColor { get; set; } = Color.Black;

    protected override void OnPaint(PaintEventArgs pevent)
    {
        Graphics g = pevent.Graphics;
        Rectangle rect = SplitterRectangle;

        using (Pen pen = new Pen(SplitterColor))
        {
            if (Orientation == Orientation.Vertical)
            {
                g.DrawLine(pen, rect.Left, rect.Top, rect.Left, rect.Bottom - 1);
                g.DrawLine(pen, rect.Right - 1, rect.Top, rect.Right - 1, rect.Bottom - 1);
            }
            else
            {
                g.DrawLine(pen, rect.Left, rect.Top, rect.Right - 1, rect.Top);
                g.DrawLine(pen, rect.Left, rect.Bottom - 1, rect.Right, rect.Bottom - 1);
            }
        }
    }
}

Ответ 7

Улучшенный вариант ответа Джайлса Батгейта:

private void ds_SplitContainer_Paint(object sender, PaintEventArgs e)
{
    SplitContainer l_SplitContainer = sender as SplitContainer;

    if (l_SplitContainer != null)
    {
        Rectangle ll_ShrinkedSplitterRectangle = l_SplitContainer.SplitterRectangle;
        ll_ShrinkedSplitterRectangle.Offset(0, 2);
        ll_ShrinkedSplitterRectangle.Height = ll_ShrinkedSplitterRectangle.Height - 2;
        e.Graphics.FillRectangle(Brushes.Silver, ll_ShrinkedSplitterRectangle);
    }
}

Ответ 8

Вот краткая реализация горизонтального сплиттера, заполненного цветом, имеет верхнюю и нижнюю границы (похожие на разветкители Visual Studio) и точки захвата посередине.

    private void splitContainer_Paint(object sender, PaintEventArgs e)
    {
        SplitContainer s = sender as SplitContainer;
        if (s != null)
        {
            int gripLineWidth = 9;
            // Fill Splitter rectangle
            e.Graphics.FillRectangle(SystemBrushes.ControlDark, 
                s.SplitterRectangle.X, s.SplitterDistance, s.SplitterRectangle.Width, s.SplitterWidth);
            // Draw Single Line Border on Top and Bottom
            e.Graphics.DrawLine(Pens.LightSlateGray,
                s.SplitterRectangle.X, s.SplitterDistance, s.SplitterRectangle.Width, s.SplitterDistance);
            e.Graphics.DrawLine(Pens.LightSlateGray,
                s.SplitterRectangle.X, s.SplitterDistance + s.SplitterWidth - 1, s.SplitterRectangle.Width, s.SplitterDistance + s.SplitterWidth - 1);
            // Draw gripper dots in center
            e.Graphics.DrawLine(_dashedPen,
                ((s.SplitterRectangle.Width / 2) - (gripLineWidth / 2)),
                s.SplitterDistance + s.SplitterWidth / 2,
                ((s.SplitterRectangle.Width / 2) + (gripLineWidth / 2)),
                s.SplitterDistance + s.SplitterWidth / 2);
        }
    }

Вы можете создать Pen как переменную-член в классе, который выполняет чертеж, который будет рисовать пунктирную линию в вашей схожей с:

private static Pen _dashedPen = new Pen(Color.DarkRed, 1);
_dashedPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;

Ответ 9

Задайте для свойства BackColor SplitContainer разный цвет. Скажем, черный. Затем каждый SpliterPanel меняет свое свойство BackColor на другой цвет. Пусть говорят белые. Затем вы заметите, что SplitLine станет более заметным.:)

Ответ 10

Попробовав несколько из предложенных здесь методов и не забавляя меня, я решил поместить в панель 1 и в панель2 тонкие метки, выровненные с разделителем, и все в порядке.

(label's.Autosize=false, label's.Text = "", label's.Color=SystemColor.Selected,  label1.Dock=left; label2.Dock=right)

Ответ 11

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

Одна идея состоит в том, чтобы установить новый цвет фона в контейнер разделения и сделать его другим с его дочерними панелями.

Возможно, иногда мы могли бы решить проблему с точки зрения дизайнера, а не разработчика.: -)