Элемент управления исчезает из родительского UserControl после события OnRepaint UserControl
У меня есть UserControl
который имеет button
в теме. На UserControl
OnPaint
В случае, если я рисую границу закругленного угла (или простой прямоугольник, если радиус равен нулю), а затем заполняю весь элемент управления. После этих манипуляций мой Button
(btnClose
) исчезает. Как мне сделать мой button
опять видно?
protected override void OnPaint(PaintEventArgs pe)
{
using (System.Drawing.Pen p = new Pen(new SolidBrush(this.BorderColor)))
{
if (borderRadius > 0)
{
DrawRoundRect(pe.Graphics, p, 0, 0, this.Width - 1, this.Height - 1, borderRadius, this.FillColor);
}
else
{
this.BackColor = this.FillColor;
pe.Graphics.DrawRectangle(p, 0, 0, this.Width - 1, this.Height - 1);
}
btnClose.Location = new Point(this.Width - btnClose.Width - BTN_MARGIN_DELTA, BTN_MARGIN_DELTA);
}
base.OnPaint(pe);
}
На всякий случай, функция DrawRoundRect:
void DrawRoundRect(Graphics g, Pen p, float X, float Y, float width, float height, float radius, Color _fillColor)
{
using (GraphicsPath gp = new GraphicsPath())
{
gp.AddLine(X + radius, Y, X + width - (radius * 2), Y);
gp.AddArc(X + width - (radius * 2), Y, radius * 2, radius * 2, 270, 90);
gp.AddLine(X + width, Y + radius, X + width, Y + height - (radius * 2));
gp.AddArc(X + width - (radius * 2), Y + height - (radius * 2), radius * 2, radius * 2, 0, 90);
gp.AddLine(X + width - (radius * 2), Y + height, X + radius, Y + height);
gp.AddArc(X, Y + height - (radius * 2), radius * 2, radius * 2, 90, 90);
gp.AddLine(X, Y + height - (radius * 2), X, Y + radius);
gp.AddArc(X, Y, radius * 2, radius * 2, 180, 90);
gp.CloseFigure();
using (SolidBrush brush = new SolidBrush(_fillColor))
{
g.FillPath(brush, gp);
g.DrawPath(p, gp);
}
}
}
3 ответа
Попробуйте переместить код местоположения в метод изменения размера:
protected override void OnResize(EventArgs e) {
btnClose.Location = new Point(this.Width - btnClose.Width - BTN_MARGIN_DELTA, BTN_MARGIN_DELTA);
}
Перемещение элементов управления в событии рисования может вызвать рекурсивные вызовы события рисования. Только "рисовать" в событии рисования.
Ну, моя ошибка. Это была функция, которая удаляла все элементы управления из UserControl. Поэтому я фильтрую элементы управления при удалении.
void ClearControls()
{
for (int i = 0; i < Items.Count; i++)
{
foreach (Control cc in Controls)
{
if (cc.Name.Contains(LINK_LABEL_FAMILY) || (cc.Name.Contains(LABEL_FAMILY)))
{
Controls.RemoveByKey(cc.Name);
}
}
}
}
Я поставил FillColor = Color.Gray
, BorderColor = Color.Black
, borderRadius = 5
, BTN_MARGIN_DELTA = 2
и, кажется, работает без проблем. Вот скриншот:
Я думаю, что проблема не в этих строках кода.