Как сделать разветкитель сплит-панелей видимым для пользователя, а не быть невидимым с изменением курсора мыши?
Создание сплиттера для Split Panel
Ответ 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
На самом деле видна линия сплиттера. Реальный вопрос заключается в том, что с другими элементами управления трудно отличить.
Одна идея состоит в том, чтобы установить новый цвет фона в контейнер разделения и сделать его другим с его дочерними панелями.
Возможно, иногда мы могли бы решить проблему с точки зрения дизайнера, а не разработчика.: -)