WinForms для создания различных макетов Дои
Каким-то образом формы и элементы управления, созданные с помощью Visual Studio и конструктора, имеют отличную возможность масштабироваться в зависимости от текущего размера DPI/шрифта Windows. Одна часть моего пользовательского интерфейса-это элемент управления tab, полный динамических страниц и меток / входных данных, генерируемых в зависимости от выбора пользователя. Когда они создаются, они используют жестко закодированные размеры, которые выглядят правильно для 96 точек на дюйм.
Существует ли автоматизированный Способ в .Net взять эти сгенерированные элементы управления и сделать то же самое изменение размера, которое выполняется для конструктора сгенерированных элементов управления? Я хотел бы избежать масштабирования элементов управления сам, так как это старый код, который не так легко поддерживать.
3 ответа:
Ну, это технически легко сделать, повторяя коллекцию элементов управления страниц вкладок и умножая свойства точки и размера на коэффициент масштабирования. Но это становится ужасно сложно, как только вы начинаете учитывать свойства Дока и якоря.
Безусловно, самый простой подход заключается в том, чтобы позволить машинам масштабирования классов форм выполнять эту работу за вас. Вам нужно будет добавить элементы управления на страницы вкладок Перед запуском события загрузки. Сделайте это в конструкторе.
Быстрый совет избегайте боли переключения настройки DPI для проверки кода: добавьте это в конструктор формы, чтобы вызвать логику масштабирования:
protected override void OnLoad(EventArgs e) { this.Font = new Font(this.Font.FontFamily, this.Font.Size * 120 / 96); base.OnLoad(e); }
Вы пробовали свойство AutoScaleMode ?
Я решил ту же проблему, с элементами управления, созданными во время выполнения по мере необходимости, выполнив то, что конструктор.cs делает:
void CreateRuntimePanel() { //instantiate controls here... //suspend layouts //begin inits this.SuspendLayout(); //set control properties here //before adding any control to form's Controls collection, do this this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; //add controls to form's Controls collection here //resume layouts //end inits this.ResumeLayout(false); }