Cuando no puedes ver lo que estás diseñando, y además utilizas una tecnología antigua como Windows Forms que no es como WPF, en la que puedes implementar todo con medidas relativas y que no se solapen los controles, tienes que andar contando los píxeles a mano para que esto no ocurra.
Estaba hoy actualizando una aplicación que tiene algunos años, y he acabado hasta las narices de contar con los dedos para ver si había controles que solapaban a otros controles… Así que he acabado haciéndome una extensión para System.Windows.Forms.Control, que me devuelve una cadena indicándome qué solapamientos existen entre los controles hijos de ese control.
Ya sé que para quien me lea, posiblemente tendrá utilidad cero, pero me apetecía compartir las chapuzas que tengo que montar a veces para no acabar con dolor de cabeza 🙂
La extensión es la siguiente:
public static string GetOverlapping(this Control control) { StringBuilder strbOverlap = new StringBuilder(); foreach (Control ctl in control.Controls.Cast<Control>().OrderBy(ct => ct.TabIndex)) { int xFrom = ctl.Location.X, xTo = xFrom + ctl.Size.Width; int yFrom = ctl.Location.Y, yTo = yFrom + ctl.Size.Height; List<Control> controlsOverlapping = control.Controls.Cast<Control>().Where(ct => ct!= ctl && xFrom < ct.Location.X + ct.Size.Width && ct.Location.X< xTo && yFrom < ct.Location.Y + ct.Size.Height&& ct.Location.Y < yTo) .ToList(); if (controlsOverlapping.Any()) { strbOverlap.AppendLine($"{ctl.Name} Es solapado por: " + $"{String.Join(", ", controlsOverlapping.Select(ct => ct.Name).ToArray())}."); } if (ctl.Controls.Count > 0) { strbOverlap.Append(ctl.GetOverlapping()); } } return strbOverlap.ToString(); } }
Para los que véis esto os parecerá una chorrada, pero oye, a mí me ha sacado los colores la muy hija de ….
Estaría bien aumentar la funcionalidad para que detecte desbordamientos, y sea capaz de decir en qué esquina se solapan los controles entre sí… Pero por lo pronto, así me vale 😉
¡Espero que os haya hecho gracia la curiosidad!
¡Un saludo!
Entrada visitada 158 veces