У меня есть поиск, и результат не может решить мое дело. На самом деле у меня есть панель, и я хочу, чтобы панель имела более толстую рамку, чем Windows. Мне нужен БордерСтайл
BorderStyle.FixedSingle
толще .. Спасибо перед
У меня есть поиск, и результат не может решить мое дело. На самом деле у меня есть панель, и я хочу, чтобы панель имела более толстую рамку, чем Windows. Мне нужен БордерСтайл
BorderStyle.FixedSingle
толще .. Спасибо перед
Вы должны настроить свой собственный 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
:
ПРИМЕЧАНИЕ. Размер 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);
resizing
.
- person King King; 03.10.2013
winforms sample code
, чтобы лучше изучить :)))
- person King King; 03.10.2013
<Border BorderThickness="30"/>
, понимаешь?
- 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;
Создайте новую панель немного большего размера и установите цвет фона на черный (или любой другой). Поместите оригинальную панель ВНУТРИ большей панели.