WinForms для создания различных макетов Дои


Каким-то образом формы и элементы управления, созданные с помощью Visual Studio и конструктора, имеют отличную возможность масштабироваться в зависимости от текущего размера DPI/шрифта Windows. Одна часть моего пользовательского интерфейса-это элемент управления tab, полный динамических страниц и меток / входных данных, генерируемых в зависимости от выбора пользователя. Когда они создаются, они используют жестко закодированные размеры, которые выглядят правильно для 96 точек на дюйм.

Существует ли автоматизированный Способ в .Net взять эти сгенерированные элементы управления и сделать то же самое изменение размера, которое выполняется для конструктора сгенерированных элементов управления? Я хотел бы избежать масштабирования элементов управления сам, так как это старый код, который не так легко поддерживать.

3 4

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);  
}