Программа, над которой я сейчас работаю, использует C# WinForms (на 2.0 .NET Framework, хотя в данном случае это, вероятно, не будет иметь значения). Дизайн требует возможности масштабирования формы и всех ее элементов управления вверх и вниз. Я сделал это, перебирая каждый из элементов управления, сохраняя их исходные размеры и расположение и получая их отношение к исходному размеру формы для масштабирования. Это выглядит примерно так:
const int SCALE_W = 600;
const int SCALE_H = 500;
...
if (!listsBuilt){
foreach (Control c in this.Controls){
sizes.Add(c.Size);
positions.Add(c.Location);
}
listsBuilt = true;
}
int count = 0;
foreach (Control c in this.Controls){
c.Height = this.Height * (sizes[count].Height / SCALE_H);
c.Width = this.Width * (sizes[count].Width / SCALE_W);
c.Left = this.Width * (positions[count].X / SCALE_W);
c.Top = this.Height * (positions[count].Y / SCALE_H);
}
До сих пор он отлично работал, и я смог сделать его глобальным и применить ко всем своим формам. Проблема возникает, когда в форме есть скрытые объекты. Я предполагал, что они все еще будут созданы, и когда программа впервые зациклится, чтобы получить исходный размер / положение объектов, она подберет их, но это не так. Если я переключаю режимы в форме и показываю некоторые объекты, которых раньше не было, а затем изменяю их размер, объекты оказываются в неправильных местах с неправильными размерами.
Есть ли способ заставить его создавать экземпляры скрытых объектов в form_load, даже если они еще не были показаны, чтобы списки всегда имели правильные значения для соответствующих элементов управления? Если мне абсолютно необходимо, я мог бы просто сделать быстрый цикл в начале:
foreach (Control c in this.Controls){
c.Show();
c.Hide();
}
но это не похоже на хороший способ сделать это. Это может привести к тому, что приложение начнет мерцать или заметно замедляться для пользователя. Любые предложения будут приветствоваться (включая предложения, касающиеся метода, с помощью которого я масштабирую форму, если это особенно плохой или неэлегантный способ. Я как бы наткнулся на свой текущий метод с небольшими догадками).
Изменить: видимость скрытых элементов управления установлена на «False» через конструктор. Они отображаются с помощью функции .Show() на более позднем этапе программы.
Edit Again!: Получается, что проблема даже не в видимости. Проблема скорее в том, что как только отображается элемент управления, он, кажется, перетасовывает свой индекс в коллекции элементов управления, поэтому, когда я возвращаюсь и сравниваю их, они не в том порядке, в котором они были, когда я впервые заполнил сравнение Список. Это означает, что один элемент управления, скорее всего, будет сравниваться со значениями другого и в конечном итоге будет иметь эту позицию и размер, а не свои собственные.