- Масштабируемость приложений Windows Forms
- 2 ответа 2
- Всё ещё ищете ответ? Посмотрите другие вопросы с метками c# visual-studio или задайте свой вопрос.
- Похожие
- Подписаться на ленту
- Практическое руководство. Изменение размера формы в Windows Forms How to: Resize Windows Forms
- Программное изменение размера формы Resize a form programmatically
- Программное изменение ширины и высоты формы Change form width and height programmatically
- Изменение размера формы с помощью приращений программными средствами Change form size by increments programmatically
- Как написать код WinForms, который автоматически масштабируется до параметров системного шрифта и dpi?
- Вопросы:
- Руководство по проектированию мы определили до сих пор:
- Элементы управления, которые не поддерживают правильное масштабирование:
- Руководство по проектированию:
- Отключение поддержки DPI в Visual Studio Disable DPI-awareness in Visual Studio
- Конструктор Windows Forms на HDPI-мониторах Windows Forms Designer on HDPI monitors
- Устранение проблемы с отображением To resolve the display problem
- Перезапуск Visual Studio без поддержки DPI Restart Visual Studio as a DPI-unaware process
- Добавление записи реестра Add a registry entry
- Установка параметра масштаба дисплея равным 100 % Set your display scaling setting to 100%
- Отключение уведомлений Disable notifications
Масштабируемость приложений Windows Forms
Как можно обеспечить пропорциональное масштабирование оконных приложений, написанных VS C#? Чтобы элементы окна, при его развертывании оставались на расстоянии, пропорциональном измененному размеру формы.
2 ответа 2
Используйте контролы из категории контейнеры; cкорей всего, вам понадобится TableLayoutPanel. С его помощью нужно будет разметить основной каркас формы, а размеры всех строк и столбцов задать в процентах. Далее, добавляем нужный контрол в ячейку таблицы и, если вы хотите масштабирования за счёт расстояния между контролами — устанавливаем свойство Anchor равным None . Если нужна масштабируемость по размеру — Dock равным Full .
И, конечно, одной табличкой вы не ограничитесь. Скорей всего придётся использовать вложенные.
Вряд ли есть простой способ. Можно сделать так:
- создать массив координат контролов (например, по левому верхнему краю) на форме,
- переопределить обработчик WM_SIZING для формы,
- в обработчике пересчитать массив координат с помощью Graphics.TransformPoints и передвинуть контролы.
Всё ещё ищете ответ? Посмотрите другие вопросы с метками c# visual-studio или задайте свой вопрос.
Похожие
Подписаться на ленту
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.4.16.39093
Практическое руководство. Изменение размера формы в Windows Forms How to: Resize Windows Forms
Размер формы Windows Forms можно указать несколькими способами. You can specify the size of your Windows Form in several ways. Вы можете изменить высоту и ширину формы программными средствами, задав новое значение для свойства Size или изменив свойства Height или Width по отдельности. You can change both the height and the width of the form programmatically by setting a new value for the Size property, or adjust the Height or Width properties individually. Если вы используете Visual Studio, можно изменить размер с помощью конструктор Windows Forms. If you’re using Visual Studio, you can change the size using the Windows Forms Designer. См. также руководство. изменение размера Windows Forms с помощью конструктора. Also see How to: Resize Windows Forms Using the Designer.
Программное изменение размера формы Resize a form programmatically
Чтобы определить размер формы во время выполнения, задайте свойство Size формы. Define the size of a form at run time by setting the Size property of the form.
В примере кода ниже размер формы устанавливается равным 100 × 100 пикселей. The following code example shows the form size set to 100 × 100 pixels.
Программное изменение ширины и высоты формы Change form width and height programmatically
Определив свойство Size, измените высоту или ширину формы с помощью свойств Width или Height. After the Size is defined, change either the form height or width by using the Width or Height properties.
В примере кода ниже для ширины формы устанавливается значение 300 пикселей, отсчитываемое от левого края формы. Высота остается неизменной. The following code example shows the width of the form set to 300 pixels from the left edge of the form, whereas the height stays constant.
Измените Width или Height, задав свойство Size. Change Width or Height by setting the Size property.
Однако в примере ниже показано, что этот подход является более громоздким, чем просто задание свойств Width или Height. However, as the following code example shows, this approach is more cumbersome than just setting Width or Height properties.
Изменение размера формы с помощью приращений программными средствами Change form size by increments programmatically
Для увеличения размера формы задайте свойства Width или Height. To increment the size of the form, set the Width and Height properties.
В примере ниже ширина формы увеличивается на 200 пикселей по сравнению с первоначальным значением. The following code example shows the width of the form set to 200 pixels wider than the current setting.
Всегда используйте свойство Height или Width для изменения размеров формы, если вы не устанавливаете значения высоты и ширины одновременно, присваивая свойству Size новую структуру Size. Always use the Height or Width property to change a dimension of a form, unless you are setting both height and width dimensions at the same time by setting the Size property to a new Size structure. Свойство Size возвращает структуру Size, которая является типом значения. The Size property returns a Size structure, which is a value type. Присвоить новое значение свойству типа значения нельзя. You cannot assign a new value to the property of a value type. Поэтому приведенный ниже пример кода компилироваться не будет. Therefore, the following code example will not compile.
Как написать код WinForms, который автоматически масштабируется до параметров системного шрифта и dpi?
Введение: есть много комментариев, в которых говорится, что «WinForms плохо масштабируется до настроек DPI / шрифта; переключитесь на WPF». Тем не менее, я думаю, что это основано на .NET 1.1; кажется, что они действительно проделали довольно хорошую работу по внедрению автоматического масштабирования в .NET 2.0. По крайней мере, на основании наших исследований и испытаний. Однако, если кто-то из вас знает об этом лучше, мы будем рады услышать от вас. (Пожалуйста, не беспокойтесь о том, что мы должны перейти на WPF . сейчас это не вариант.)
Вопросы:
Что в WinForms НЕ выполняет автоматическое масштабирование, и поэтому его следует избегать?
Каким правилам разработки следует руководствоваться при написании кода WinForms, чтобы он хорошо масштабировался?
Руководство по проектированию мы определили до сих пор:
Являются ли какие-либо из них неправильными или неадекватными? Любые другие руководящие принципы, которые мы должны принять? Есть ли какие-то другие шаблоны, которых следует избегать? Любое другое руководство по этому вопросу будет очень признателен.
Элементы управления, которые не поддерживают правильное масштабирование:
- Label с AutoSize = False и Font унаследовал. Явно задайте Font этот элемент управления, чтобы он отображался жирным шрифтом в окне «Свойства».
- ListView ширина столбцов не масштабируется. Замените форму, ScaleControl чтобы сделать это вместо этого. Смотрите этот ответ
- SplitContainer «ы Panel1MinSize , Panel2MinSize и SplitterDistance свойства
- TextBox с MultiLine = True и Font унаследовал. Явно задайте Font этот элемент управления, чтобы он отображался жирным шрифтом в окне «Свойства».
ToolStripButton изображение. В конструкторе формы:
- Устанавливать ToolStrip.AutoSize = False
- Установить ToolStrip.ImageScalingSize согласно CreateGraphics.DpiX и .DpiY
- Установите ToolStrip.AutoSize = True при необходимости.
Иногда AutoSize можно оставить в, True но иногда он не может изменить размер без этих шагов. Работает без изменений в .NET Framework 4.5.2 и EnableWindowsFormsHighDpiAutoResizing .
Руководство по проектированию:
Все ContainerControls должны быть одинаковыми AutoScaleMode = Font . (Шрифт будет обрабатывать как изменения DPI, так и изменения настройки размера шрифта системы; DPI будет обрабатывать только изменения DPI, а не изменения настройки размера шрифта системы.)
Все Контейнерные AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); Контроллеры также должны быть установлены с одинаковым значением , принимая 96dpi (см. Следующий пункт) и шрифт по умолчанию MS Sans Serif (см. Раздел 2 ниже). Это автоматически добавляется дизайнером на основе DPI, в котором вы открываете дизайнер, но отсутствует во многих наших старых файлах дизайнеров. Возможно, Visual Studio .NET (версия до VS 2005) не добавляла это должным образом.
Все ваши дизайнерские работы в 96dpi (мы могли бы переключиться на 120dpi; но мудрость в Интернете говорит, что придерживаться 96dpi; экспериментирование здесь в порядке; дизайн не должен иметь значения, поскольку он просто меняет AutoScaleDimensions линию, которая дизайнерские вставки). Чтобы настроить Visual Studio для работы с виртуальным разрешением 96 точек на дюйм на дисплее высокого разрешения, найдите его файл .exe, щелкните правой кнопкой мыши, чтобы изменить свойства, и в разделе «Совместимость» выберите «Переопределить поведение масштабирования с высоким DPI. Масштабирование выполняется: Система».
Убедитесь, что вы никогда не устанавливаете шрифт на уровне контейнера . только на листовых элементах управления ИЛИ в конструкторе вашей самой базовой формы, если вы хотите использовать шрифт по умолчанию для всего приложения, кроме MS Sans Serif. (Установка шрифта на контейнере, по-видимому, отключает автоматическое масштабирование этого контейнера, потому что оно происходит в алфавитном порядке после настройки параметров AutoScaleMode и AutoScaleDimensions.) ПРИМЕЧАНИЕ: если вы действительно измените шрифт в конструкторе самой базовой формы, это приведет к ваши AutoScaleDimensions для вычисления не так, как 6×13; в частности, если вы переключитесь на пользовательский интерфейс Segoe (шрифт Win 10 по умолчанию), то он будет 7×15 . вам нужно будет дотронуться до каждой формы в Designer, чтобы она могла пересчитать все измерения в этом файле .designer, включая AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); .
НЕ используйте Anchor Right или Bottom привязанный к UserControl . его расположение не будет автоматически масштабироваться; вместо этого поместите Panel или другой контейнер в свой UserControl и привяжите другие элементы управления к этой Panel; есть использование панели Dock Right , Bottom или Fill в вашем UserControl.
Только элементы управления в списках элементов управления при вызове ResumeLayout в конце InitializeComponent будут автоматически масштабироваться . если вы динамически добавляете элементы управления, то вам нужно SuspendLayout(); AutoScaleDimensions = new SizeF(6F, 13F); AutoScaleMode = AutoScaleMode.Font; ResumeLayout(); включить этот элемент управления перед его добавлением. И ваше позиционирование также необходимо будет отрегулировать если вы не используете режимы док-станции или менеджер раскладок, например FlowLayoutPanel или TableLayoutPanel .
Базовые классы, полученные из, ContainerControl должны оставаться AutoScaleMode установленными Inherit (значение по умолчанию, установленное в классе ContainerControl ; но НЕ по умолчанию, установленное дизайнером). Если вы установите его на что-то другое, а затем ваш производный класс попытается установить его на Font (как и должно быть), то сам акт установки этого параметра Font очистит настройки дизайнера AutoScaleDimensions , что приведет к отключению автоматического масштабирования! (Это руководство в сочетании с предыдущим означает, что вы никогда не можете создавать экземпляры базовых классов в конструкторе . все классы должны быть разработаны как базовые классы или как листовые классы!)
Избегайте использования Form.MaxSize статически / в конструкторе. MinSize и MaxSize на форме не масштабировать столько, сколько все остальное. Таким образом, если вы выполняете всю свою работу с разрешением 96 точек на дюйм, то при более высоком значении DPI MinSize это не вызовет проблем, но может быть не таким ограничительным, как вы ожидали, но вы MaxSize можете ограничить масштабирование размера, что может вызвать проблемы. Если вы хотите MinSize == Size == MaxSize , не делайте этого в Designer . делайте это в конструкторе или OnLoad переопределении . установите оба параметра MinSize и MaxSize ваш правильно масштабированный размер.
Все элементы управления для конкретного Panel или Container должны использовать привязку или стыковку. Если вы смешаете их, то автоматическое масштабирование, которое выполняется этим, Panel часто будет вести себя нечетко странным образом.
Когда он выполняет автоматическое масштабирование, он будет пытаться масштабировать всю форму . однако, если в этом процессе он достигает верхнего предела размера экрана, это жесткое ограничение, которое затем может испортить (обрезать) масштабирование Поэтому следует убедиться, что все формы в Designer с разрешением 100% / 96 точек на дюйм имеют размер не более 1024×720 (что соответствует 150% на экране 1080p или 300%, что является рекомендуемым значением Windows на экране 4K). Но вам нужно вычесть для гигантской строки заголовка / заголовка Win10 . так что больше похоже на максимальный размер 1000×680 . которое в конструкторе будет похоже на 994×642 ClientSize. (Таким образом, вы можете найти FindAll References на ClientSize, чтобы найти нарушителей.)
Отключение поддержки DPI в Visual Studio Disable DPI-awareness in Visual Studio
Visual Studio — это приложение с поддержкой DPI, что означает автоматическое масштабирование монитора. Visual Studio is a dots per inch (DPI) aware application, which means the display scales automatically. Если в приложении указано, что оно не поддерживает DPI, операционная система масштабирует приложение в виде точечного рисунка. If an application states that it’s not DPI-aware, the operating system scales the application as a bitmap. Такое поведение также называется виртуализацией DPI. This behavior is also called DPI virtualization. Приложение по-прежнему считает, что работает в полном масштабе (100 % соответствует 96 точкам на дюйм). The application still thinks that it’s running at 100% scaling, or 96 dpi.
В этой статье рассматриваются ограничения конструктора Windows Forms на HDPI-мониторах и приводятся сведения о запуске Visual Studio без поддержки DPI. This article discusses the limitations of Windows Forms Designer on HDPI monitors and how to run Visual Studio as a DPI-unaware process.
Конструктор Windows Forms на HDPI-мониторах Windows Forms Designer on HDPI monitors
Конструктор Windows Forms в Visual Studio не поддерживает масштабирование. The Windows Forms Designer in Visual Studio doesn’t have scaling support. Поэтому при открытии некоторых форм в конструкторе Windows Forms возникают проблемы с отображением на HDPI-мониторах. This causes display issues when you open some forms in the Windows Forms Designer on high dots per inch (HDPI) monitors. Например, элементы управления могут перекрываться, как показано на следующем рисунке: For examples, controls can appear to overlap as shown in the following image:
Когда вы открываете форму в конструкторе Windows Forms в Visual Studio на HDPI-мониторе, в верхней части конструктора отображается желтая информационная панель. When you open a form in the Windows Forms Designer in Visual Studio on an HDPI monitor, Visual Studio displays a yellow informational bar at the top of the designer:
На панели выводится сообщение: Масштаб основного дисплея равен 200 % (192 DPI). Это может вызвать проблемы c отображением в окне конструктора. The message reads Scaling on your main display is set to 200% (192 dpi). This might cause rendering problems in the designer window.
Эта информационная панель появилась в Visual Studio 2017 версии 15.8. This informational bar was introduced in Visual Studio 2017 version 15.8.
Если вы не работаете в конструкторе и вам не нужно настраивать макет формы, игнорируйте информационную панель и продолжайте использовать редактор кода или конструкторы других типов. If you aren’t working in the designer and don’t need to adjust the layout of your form, you can ignore the informational bar and continue working in the code editor or in other types of designers. (Можно также отключить уведомления, чтобы информационная панель больше не появлялась.) Затрагивается только конструктор Windows Forms. (You can also disable notifications so that the informational bar doesn’t continue to appear.) Only the Windows Forms Designer is affected. Чтобы продолжить работу в конструкторе Windows Forms, выполните приведенные в следующем разделе действия по устранению этой проблемы. If you do need to work in the Windows Forms Designer, the next section helps you resolve the problem.
Устранение проблемы с отображением To resolve the display problem
Существует три варианта устранения проблемы с отображением. There are three options to resolve the display problem:
Если вы предпочитаете управлять параметрами из командной строки, devenv.exe принимает /noscale в качестве параметра командной строки для выполнения в режиме с масштабом 100 %. If you prefer to manage settings from the command line, devenv.exe takes /noscale as a command-line parameter to run in 100% scaling mode.
Перезапуск Visual Studio без поддержки DPI Restart Visual Studio as a DPI-unaware process
Чтобы перезапустить Visual Studio без поддержки DPI, выберите соответствующий параметр на желтой информационной панели. You can restart Visual Studio as a DPI-unaware process by selecting the option on the yellow informational bar. Это предпочтительный способ решения проблемы. This is the preferred way of resolving the problem.
После запуска Visual Studio без поддержки DPI проблемы с макетом конструктора будут устранены, но шрифты могут выглядеть размытыми. When Visual Studio runs as a DPI-unaware process, the designer layout issues are resolved, but fonts may appear blurry. Если Visual Studio работает без поддержки DPI, выводится другое желтое информационное сообщение: Visual Studio выполняется без поддержки DPI. Конструкторы WPF и XAML могут отображаться некорректно. Visual Studio displays a different yellow informational message when it runs as a DPI-unaware process that says Visual Studio is running as a DPI-unaware process. WPF and XAML designers might not display correctly. На информационной панели также доступен параметр Перезапустить Visual Studio с поддержкой DPI. The informational bar also provides an option to Restart Visual Studio as a DPI-aware process.
- Если при выборе параметра перезапуска без поддержки DPI в Visual Studio были незакрепленные окна инструментов, положение этих окон инструментов может измениться. If you had undocked tool windows in Visual Studio when you selected the option to restart as a DPI-unaware process, the position of those tool windows may change.
- Если используется профиль Visual Basic по умолчанию или в меню Сервис >Параметры >Проекты и решения не выбран параметр Сохранять новые проекты в момент создания, Visual Studio не сможет повторно открыть проект, перезапускаемый без поддержки DPI. If you use the default Visual Basic profile, or if you have the Save new projects when created option deselected in Tools >Options >Projects and Solutions, Visual Studio cannot reopen your project when it restarts as a DPI-unaware process. Однако проект можно открыть, выбрав его в разделе Файл >Последние проекты и решения. However, you can open the project by selecting it under File >Recent Projects and Solutions.
По завершении работы в конструкторе Windows Forms необходимо обязательно перезапустить Visual Studio с поддержкой DPI. It’s important to restart Visual Studio as a DPI-aware process when you’re finished working in the Windows Forms Designer. При запуске без поддержки DPI шрифты могут выглядеть размытыми, а в других конструкторах, таких как конструктор XAML, могут возникать проблемы. When it’s running as a DPI-unaware process, fonts can look blurry and you may see issues in other designers such as the XAML Designer. Если закрыть и повторно открыть среду Visual Studio, запущенную без поддержки DPI, она снова будет поддерживать DPI. If you close and reopen Visual Studio when it’s running in DPI-unaware mode, it becomes DPI-aware again. Можно также выбрать параметр Перезапустить Visual Studio как процесс с поддержкой DPI на информационной панели. You can also select the Restart Visual Studio as a DPI-aware process option in the informational bar.
Добавление записи реестра Add a registry entry
Вы можете пометить Visual Studio без поддержки DPI, изменив реестр. You can mark Visual Studio as DPI-unaware by modifying the registry. Откройте редактор реестра и добавьте запись в подраздел HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers: Open Registry Editor and add an entry to the HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers subkey:
Запись: В зависимости от версии Visual Studio — 2017 или 2019 — используйте одно из следующих значений: Entry: Depending on whether you’re using Visual Studio 2017 or 2019, use one of these values:
- C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\devenv.exe C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\devenv.exe
- C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\devenv.exe C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\devenv.exe
Если вы используете выпуск Professional или Enterprise, в записи замените Community на Professional или Enterprise. If you’re using the Professional or Enterprise edition of Visual Studio, replace Community with Professional or Enterprise in the entry. При необходимости замените букву диска. Also replace the drive letter as necessary.
Тип: REG_SZ Type: REG_SZ
Значение. DPIUNAWARE Value: DPIUNAWARE
Visual Studio останется в режиме без поддержки DPI до удаления записи реестра. Visual Studio remains in DPI-unaware mode until you remove the registry entry.
Установка параметра масштаба дисплея равным 100 % Set your display scaling setting to 100%
Чтобы в Windows 10 задать параметр масштаба дисплея равным 100 %, в поле поиска на панели задач введите параметры дисплея, а затем выберите Изменить параметры дисплея. To set your display scaling setting to 100% in Windows 10, type display settings in the task bar search box, and then select Change display settings. В окне Параметры задайте параметру Изменить размер текста, приложений и других элементов значение 100 % . In the Settings window, set Change the size of text, apps, and other items to 100%.
Масштаб дисплея, равный 100 %, может быть нежелателен, так как пользовательский интерфейс может отображаться слишком мелко. Setting your display scaling to 100% may be undesirable, because it can make the user interface too small to be usable.
Отключение уведомлений Disable notifications
Вы можете отказаться от вывода уведомлений о проблемах масштабирования DPI в Visual Studio. You can choose not to be notified of DPI scaling issues in Visual Studio. Если вы не работаете в конструкторе, уведомления можно отключить. You might want to disable notifications if you aren’t working in the designer, for example.
Для этого выберите Сервис > Параметры. Откроется диалоговое окно Параметры. To disable notifications, choose Tools > Options to open the Options dialog. Затем выберите Конструктор Windows Forms > Общие и задайте параметру Уведомления о масштабировании DPI значение False. Then, choose Windows Forms Designer > General, and set DPI Scaling Notifications to False.
Чтобы позднее повторно включить уведомления об масштабировании, задайте свойству значение True. If you want to later reenable scaling notifications, set the property to True.