установить толщину границы панели в С# winform

У меня есть поиск, и результат не может решить мое дело. На самом деле у меня есть панель, и я хочу, чтобы панель имела более толстую рамку, чем Windows. Мне нужен БордерСтайл

BorderStyle.FixedSingle

толще .. Спасибо перед


person rifleon    schedule 03.10.2013    source источник
comment
Используйте событие Paint(), чтобы оно выглядело настолько толстым, насколько вы хотите.   -  person Hans Passant    schedule 03.10.2013
comment
Это дублировать. Однако принятый ответ здесь - единственный, который сработал для меня. Другие решения обрезали правую и нижнюю границы.   -  person nunzabar    schedule 07.12.2013


Ответы (3)


Вы должны настроить свой собственный Panel с помощью небольшого пользовательского рисунка:

//Paint event handler for your Panel
private void panel1_Paint(object sender, PaintEventArgs e){ 
  if(panel1.BorderStyle == BorderStyle.FixedSingle){
     int thickness = 3;//it's up to you
     int halfThickness = thickness/2;
     using(Pen p = new Pen(Color.Black,thickness)){
       e.Graphics.DrawRectangle(p, new Rectangle(halfThickness,
                                                 halfThickness,
                                                 panel1.ClientSize.Width-thickness,
                                                 panel1.ClientSize.Height-thickness));
     }
  }
}

Вот скриншот панели толщиной 30:

Снимок экрана панели с толщиной границы 30

ПРИМЕЧАНИЕ. Размер Rectangle рассчитывается по середине линии рисунка. Предположим, вы рисуете линию толщиной 4, будет смещение 2 снаружи и 2 внутри.

Я не проверял случай, указанный мистером Hans, чтобы исправить его, просто обработайте событие SizeChanged для вашего panel1 следующим образом:

private void panel1_SizeChanged(object sender, EventArgs e){
   panel1.Invalidate();
}

Вы также можете установить ResizeRedraw = true с помощью Reflection без необходимости обрабатывать событие SizeChanged, как указано выше, следующим образом:

typeof(Control).GetProperty("ResizeRedraw", BindingFlags.NonPublic | BindingFlags.Instance)
               .SetValue(panel1, true, null);

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

typeof(Panel).GetProperty("DoubleBuffered",
                          BindingFlags.NonPublic | BindingFlags.Instance)
             .SetValue(panel1,true,null);
person King King    schedule 03.10.2013
comment
Спасибо, это то, что я действительно хочу :D - person rifleon; 03.10.2013
comment
Закрепите панель справа+снизу и измените размер формы, чтобы увидеть, что что-то пойдет не так. - person Hans Passant; 03.10.2013
comment
@HansPassant спасибо, что указали на это, похоже, что при настройке управления нам всегда нужно добавлять обработку кода resizing. - person King King; 03.10.2013
comment
@KingKing еще один в мою коллекцию. - person Federico Berasategui; 03.10.2013
comment
@HighCore, что ты собирал? Только не говорите мне, что вы собирали winforms sample code, чтобы лучше изучить :))) - person King King; 03.10.2013
comment
@KingKing Я собирал образцы, которые показывают, как вещи, которые могут быть достигнуты с помощью одной строки XAML, требуют всевозможных ужасных хаков в дерьмовых winforms динозавров =). Это будет <Border BorderThickness="30"/>, понимаешь? - person Federico Berasategui; 03.10.2013
comment
@KingKing Недавно я также обнаружил, что winforms не поддерживает изменение размера шрифта. Я в восторге. - person Federico Berasategui; 03.10.2013

Чтобы создать панель с рамкой, я помещаю панель в панель. Панель границы имеет цвет фона желаемого цвета границы и отступы, а размер padding соответствует желаемой границе thickness.

Преимущество такого решения в том, что нет мерцания и нет проблем с изменением размера.

введите здесь описание изображения

введите здесь описание изображения

Это может быть очень просто создано в дизайнере или в коде позади.

Код позади:

Panel panel_Border = new Panel();
Panel panel_Embedded = new Panel();

panel_Border.BackColor = Color.Green;
panel_Border.Controls.Add(panel_Embedded);
// this is the border thickness
panel_Border.Padding = new System.Windows.Forms.Padding(6);
panel_Border.Size = new System.Drawing.Size(200, 100);
        
panel_Embedded.BackColor = System.Drawing.SystemColors.Control;
panel_Embedded.Dock = System.Windows.Forms.DockStyle.Fill;
person marsh-wiggle    schedule 01.07.2020

Создайте новую панель немного большего размера и установите цвет фона на черный (или любой другой). Поместите оригинальную панель ВНУТРИ большей панели.

person dik leatherdale    schedule 08.11.2017