Некоторые элементы управления на форме не меняют размеры на некоторых формах в C # окнах формы - PullRequest
0 голосов
/ 30 октября 2019

У меня есть код для изменения размеров элементов управления в моих формах, чтобы они могли отображаться «быстро» на любом разрешении экрана, этот код отлично работает на некоторых моих формах, но, к сожалению, не работает на других моих формах.

Я подозревал, что, может быть, потому, что некоторые элементы управления были в Групповых блоках и панелях, поэтому, может быть, они не были «достигнуты», но код доказал, что это не ответ.

Вотчасть кода

#region Scale Controls To Screen Size

        Responsive ResponsiveObj;

        private void ScaleControls(Control.ControlCollection controls)
        {
            foreach (Control ctl in controls)
            {
                Scale(ctl);
                if (ctl is GroupBox || ctl is StatusStrip || ctl is DevExpress.XtraEditors.BarCodeControl || ctl is Panel || ctl is LabelControl || ctl is DevExpress.XtraBars.Navigation.TabPane || ctl is DevExpress.XtraBars.Navigation.TabNavigationPage)   // Recursive call if it is a Groupbox (which has more controls inside it).
                    ScaleControls(ctl.Controls);
            }
        }

        private void Scale(Control ctl)
        {
            ctl.Font = new Font(ctl.Font.Name, ResponsiveObj.GetMetrics((int)ctl.Font.Size), ctl.Font.Style);
            if (ctl is LookUpEdit)
            {
                (ctl as LookUpEdit).Properties.Appearance.Font = ctl.Font;
                (ctl as LookUpEdit).Properties.AppearanceDisabled.Font = ctl.Font;
                (ctl as LookUpEdit).Properties.AppearanceDropDown.Font = ctl.Font;
                (ctl as LookUpEdit).Properties.AppearanceDropDownHeader.Font = ctl.Font;
                (ctl as LookUpEdit).Properties.AppearanceFocused.Font = ctl.Font;
                (ctl as LookUpEdit).Properties.AppearanceReadOnly.Font = ctl.Font;
            }
            ctl.Width = ResponsiveObj.GetMetrics(ctl.Width, "Width");
            ctl.Height = ResponsiveObj.GetMetrics(ctl.Height, "Height");
            ctl.Top = ResponsiveObj.GetMetrics(ctl.Top, "Top");
            ctl.Left = ResponsiveObj.GetMetrics(ctl.Left, "Left");
        }

        #endregion

В конструкторе

ResponsiveObj = new Responsive(Screen.PrimaryScreen.Bounds);
ResponsiveObj.SetMultiplicationFactor();

В событии загрузки формы

Width = ResponsiveObj.GetMetrics(Width, "Width");    // Form width and height set up.
Height = ResponsiveObj.GetMetrics(Height, "Height");
Left = Screen.GetBounds(this).Width / 2 - Width / 2;  // Form centering.
Top = Screen.GetBounds(this).Height / 2 - Height / 2 - 30;  // 30 is a calibration factor.

ScaleControls(Controls);

Я подумал, что, возможно, процедура ScaleControls не обращалась ко всемэлементы управления, поэтому я изменил его, но все равно получил тот же результат

private void ScaleControls(Control.ControlCollection controls)
{
            foreach (Control ctl in controls)
            {
                Scale(ctl);
                if (ctl.HasChildren)   // Recursive call if it is a Groupbox (which has more controls inside it).
                    ScaleControls(ctl.Controls);
            }
}

The Image shows a resized TextEdit at the bottom and on top of it are two similar TextEdit controls that were not resized

Я понимаю, что некоторые из моих элементов управления не могут быть включены в элементы управленияколлекция, например, элемент управления TextEdit - я пытаюсь найти способ создать список всех элементов управления, включая элемент управления TextEdit вместе с другими элементами управления DevExpress, чтобы они могли бытьresized

Я только что загрузил пример проекта на Microsoft Onedrive здесь . Проект был разработан на мониторе 1920 * 1080, но мы хотим, чтобы формы корректировались и хорошо отображались даже на других меньших мониторах, например, 1600 * 900. Первая форма In Big хорошо реагирует на другие меньшие мониторы, размеры шрифтов правильно масштабируются, а элементы управления размещаются на мониторах 1600 * 900. Но вторая форма Outbound изменена не правильно. TextEdit Full Weight и Empty Weight не изменен, и шрифт неправильный - и все же эта форма является копией формы In Big с некоторыми изменениями. Мне бы хотелось, чтобы размеры элементов управления и шрифтов корректно изменялись даже в исходящей форме. как это делает в большой форме

1 Ответ

0 голосов
/ 07 ноября 2019

Начиная с .NET Framework 4.7, Windows Forms включает улучшения для общих сценариев с высоким и динамическим DPI. К ним относятся:

Улучшения в масштабировании и компоновке ряда элементов управления Windows Forms, таких как элемент управления MonthCalendar и элемент управления CheckedListBox.

Масштабирование за один проход. В .NET Framework 4.6 и более ранних версиях масштабирование выполнялось за несколько проходов, в результате чего некоторые элементы управления масштабировались больше, чем необходимо.

Поддержка динамических сценариев DPI, в которых пользователь изменяет DPI или масштабный коэффициентпосле запуска приложения Windows Forms.

В версиях .NET Framework, начиная с .NET Framework 4.7, расширенная поддержка с высоким разрешением является дополнительной функцией. Вы должны сконфигурировать свое приложение, чтобы использовать его преимущества.

Настройка приложения Windows Forms для поддержки высокого разрешения

Доступны новые функции Windows Forms, поддерживающие высокую осведомленность о DPIтолько в приложениях, предназначенных для .NET Framework 4.7 и работающих в операционных системах Windows, начиная с обновления для создателей Windows 10.

Кроме того, чтобы настроить поддержку высокого разрешения в приложении Windows Forms, необходимо выполнить следующие действия. :

Объявить совместимость с Windows 10.

Для этого добавьте в файл манифеста следующее:

<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
  <application>
    <!-- Windows 10 compatibility -->
    <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
  </application>
</compatibility>

Включите поддержку DPI для каждого монитора в приложении. файл конфигурации.

В Windows Forms появился новый элемент для поддержки новых функций и настроек, добавленных начиная с .NET Framework 4.7. Чтобы воспользоваться новыми функциями, поддерживающими высокий DPI, добавьте в файл конфигурации приложения следующее:

<System.Windows.Forms.ApplicationConfigurationSection>
  <add key="DpiAwareness" value="PerMonitorV2" />
</System.Windows.Forms.ApplicationConfigurationSection>

Вызов статического метода EnableVisualStyles.

Это должен быть первый вызов метода вточка входа вашего приложения. Например:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form2());
}

Отказ от отдельных функций с высоким DPI Установка значения DpiAwareness для PerMonitorV2 включает все функции с высоким уровнем DPI, поддерживаемые версиями .NET Framework, начиная с .NET Framework 4.7,Как правило, этого достаточно для большинства приложений Windows Forms. Однако вы можете отказаться от одной или нескольких отдельных функций. Наиболее важной причиной для этого является то, что существующий код приложения уже обрабатывает эту функцию. Например, если ваше приложение обрабатывает автоматическое масштабирование, вы можете отключить функцию автоматического изменения размера следующим образом:

<System.Windows.Forms.ApplicationConfigurationSection>
  <add key="DpiAwareness" value="PerMonitorV2" />
  <add key="EnableWindowsFormsHighDpiAutoResizing" value="false" />
</System.Windows.Forms.ApplicationConfigurationSection>

Для получения дополнительной справки, связанной с настройкой :: Read :: https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/winforms/windows-forms-add-configuration-element

Надеюсь, это сделает ваше приложение хорошо выглядящим !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...