Пользовательские элементы управления (Windows Forms .NET)
С помощью Windows Forms можно разрабатывать и реализовывать новые элементы управления. Вы можете создать новый пользовательский элемент управления, изменить существующие элементы управления с помощью наследования или написать пользовательский элемент управления, который выполняет собственную картину. В этой статье описываются различия между типами элементов управления, которые можно использовать для наследования, и рассказывается, как выбрать тип элемента управления для конкретного проекта.
Документация по рабочему столу для .NET 7 и .NET 6 находится в стадии разработки.
Базовый класс управления
Класс Control является базовым классом для элементов управления Windows Forms. Он обеспечивает инфраструктуру, необходимую для визуального отображения элементов управления в приложениях Windows Forms и предоставляет следующие возможности.
- Обеспечивает обработку окон.
- Управляет маршрутизацией сообщений.
- Предоставляет события мыши и клавиатуры, а также многие другие события пользовательского интерфейса.
- Предоставляет расширенные функции размещения.
- Содержит множество свойств, характерных для визуального отображения, таких как ForeColor, BackColor, Height и Width.
Поскольку существенная часть инфраструктуры предоставляется базовым классом, разрабатывать собственные элементы управления Windows Forms довольно просто.
Создание собственного элемента управления
Существует три типа настраиваемых элементов управления, которые можно создать: пользовательские элементы управления, расширенные элементы управления и пользовательские элементы управления. В следующей таблице показано, какой тип элемента управления следует создать:
- — если нужно объединить функциональные возможности нескольких элементов управления Windows Forms в один блок для повторного использования.
- — если большинство необходимых функций аналогичны функциям уже существующего элемента управления Windows Forms;
- — если нестандартный графический интерфейс не требуется или необходимо разработать новый интерфейс для существующего элемента управления.
- — если требуется создать пользовательское графическое представление элемента управления;
- — если требуется реализовать пользовательские функциональные возможности, которые недоступны в стандартных элементах управления.
Пользовательские элементы управления
Пользовательский элемент управления — это коллекция элементов управления Windows Forms, представленных как единый элемент управления потребителю. Этот вид элемента управления называется составным элементом управления. Элементы, входящие в составной элемент управления, называются составляющими.
Пользовательский элемент управления содержит все встроенные функции, связанные с каждым из содержащихся элементов управления Windows Forms, и позволяет выборочно предоставлять и привязывать их свойства. Кроме того, пользовательский элемент управления предоставляет большую часть функций обработки клавиатуры по умолчанию без дополнительных усилий по разработке.
Например, пользовательский элемент управления можно создать для отображения данных адреса клиента из базы данных. Этот элемент управления включает элемент управления DataGridView для отображения полей базы данных, BindingSource для управления привязкой к источнику данных, а также BindingNavigator для перемещения по записям. Вы можете выборочно предоставлять свойства привязки данных, а также упаковать и повторно использовать весь элемент управления из приложения в приложение.
Дополнительные сведения см. в обзоре пользовательского элемента управления.
Расширенные элементы управления
Элемент управления можно унаследовать от любого существующего элемента управления Windows Forms. Такой подход позволяет сохранить все функциональные возможности, унаследованные от элемента управления Windows Forms, и расширить их путем добавления пользовательских свойств, методов или других функций. С помощью этого параметра можно переопределить логику отрисовки базового элемента управления, а затем расширить его пользовательский интерфейс, изменив его внешний вид.
Например, можно создать элемент управления, производный от элемента управления Button, который будет отслеживать, сколько раз пользователь на него нажал.
В некоторых элементах управления к графическому пользовательскому интерфейсу можно добавить пользовательское оформление путем переопределения метода OnPaint базового класса. Для расширенной кнопки, отслеживающей щелчки, можно переопределить метод OnPaint, чтобы вызвать базовую реализацию OnPaint, а затем отобразить число щелчков в одном углу клиентской области элемента управления Button.
Пользовательские элементы управления
Другим способом разработки элемента управления является создание его практически с нуля путем наследования от класса Control. Класс Control обеспечивает всю основную функциональность, необходимую элементам управления (включая обработку событий мыши и клавиатуры), однако не имеет функциональных возможностей для отдельных элементов управления и лишен графического интерфейса.
Для создания элемента управления, наследуемого от Control класса, требуется больше мысли и усилий, чем наследование от UserControl существующего элемента управления Windows Forms. Поскольку значительную часть реализации вы выполняете сами, ваш элемент управления может быть более гибким, чем составной или расширенный, и вы можете его адаптировать к конкретным задачам.
Чтобы реализовать пользовательский элемент управления, необходимо написать код для OnPaint события элемента управления, который управляет визуальным изображением элемента управления. Для элемента управления также необходимо написать любое поведение, зависят от конкретных функций. Можно также переопределить метод WndProc и обрабатывать сообщения Windows напрямую. Это самый эффективный способ создания элементов управления, однако для того, чтобы использовать его эффективно, необходимо знание API Microsoft Win32®.
Примером нестандартного элемента управления служит элемент управления «Часы», который выглядит и действует как часы со стрелками. Вы можете применить пользовательское оформление, чтобы заставить стрелки часов двигаться при наступлении событий Tick внутреннего компонента Timer.
Пользовательский интерфейс проектирования
Если вам требуется пользовательская среда разработки, вы можете создать свой собственный конструктор. Для составных элементов управления следует наследовать класс пользовательского конструктора от классов ParentControlDesigner или DocumentDesigner. Для расширенных и настраиваемых элементов управления создайте класс пользовательского конструктора из класса ControlDesigner.
Используйте DesignerAttribute, чтобы связать элемент управления с конструктором.
Следующие сведения устарели, но могут помочь вам.
- (Visual Studio 2013) Расширение поддержки времени разработки.
- (Visual Studio 2013) Практическое руководство. Создание элемента управления Windows Forms, использующее преимущества функций времени разработки.
Руководство по классическим приложениям (Windows Forms .NET)
Добро пожаловать в руководство по классическим приложениям для Windows Forms, платформы пользовательского интерфейса для создания разнообразных клиентских приложений рабочего стола в Windows. Платформа разработки Windows Forms поддерживает широкий набор функций для разработки приложений, включая элементы управления, графику, привязку данных и ввод пользователя. Характерной чертой Windows Forms является использование визуального конструктора с функцией перетаскивания в Visual Studio для упрощения создания приложений Windows Forms.
Документация по рабочему столу для .NET 7 и .NET 6 находится в стадии разработки.
Существует две реализации Windows Forms.
- Реализация с открытым исходным кодом, размещенная на GitHub. Эта версия работает в .NET 6+. Для использования визуального конструктора Windows Forms требуется версия Visual Studio 2019 не ниже 16.8. Последняя версия — Windows Forms для .NET 7 с помощью Visual Studio 2022 версии 17.4.
- Реализация .NET Framework 4, поддерживаемая в Visual Studio 2022, Visual Studio 2019 и Visual Studio 2017. .NET Framework 4 — это версия .NET только для Windows, которая считается компонентом операционной системы Windows. Эта версия Windows Forms распространяется с .NET Framework.
Данное руководство по рабочему столу создано для Windows Forms в .NET 5 и более поздних версиях. Дополнительные сведения о версии Windows Forms для .NET Framework см. в разделе Windows Forms для .NET Framework.
Введение
Windows Forms — это платформа пользовательского интерфейса для создания классических приложений Windows. Она обеспечивает один из самых эффективных способов создания классических приложений с помощью визуального конструктора в Visual Studio. Такие функции, как размещение визуальных элементов управления путем перетаскивания, упрощают создание классических приложений.
В Windows Forms можно разрабатывать графически сложные приложения, которые просто развертывать, обновлять, и с которыми удобно работать как в автономном режиме, так и в сети. Приложения Windows Forms могут получать доступ к локальному оборудованию и файловой системе компьютера, на котором работает приложение.
О том, как создать приложение Windows Forms, см. в руководстве по созданию приложения WinForms.
Зачем нужна миграция с .NET Framework
Windows Forms для .NET предоставляет новые функции и улучшения по сравнению с платформа .NET Framework. Дополнительные сведения см. в статье «Новые возможности Windows Forms для .NET 7». Сведения об обновлении приложения см. в статье «Как обновить классическое приложение Windows Forms до .NET 7»
Создание многофункциональных интерактивных пользовательских интерфейсов
Windows Forms — это технология пользовательского интерфейса для .NET, представляющая собой набор управляемых библиотек, которые упрощают выполнение стандартных задач, таких как чтение из файловой системы и запись в нее. С помощью среды разработки, такой как Visual Studio, можно создавать интеллектуальные клиентские приложения Windows Forms, которые отображают информацию, запрашивают ввод пользователя и взаимодействуют с удаленными компьютерами по сети.
В Windows Forms форма — это визуальная поверхность, на которой выводится информация для пользователя. Обычно приложение Windows Forms строится путем добавления элементов управления в формы и создания кода для реагирования на действия пользователя, такие как щелчки мыши или нажатия клавиш. Элемент управления — это отдельный элемент пользовательского интерфейса, предназначенный для отображения или ввода данных.
При выполнении пользователем какого-либо действия с формой или одним из ее элементов управления создается событие. Приложение реагирует на эти события с кодом и обрабатывает события при их возникновении.
В Windows Forms предусмотрено множество элементов управления, которые можно добавлять в формы. Например, элементы управления могут отображать текстовые поля, кнопки, раскрывающиеся списки, переключатели и даже веб-страницы. Если предусмотренные элементы управления не подходят для ваших целей, в Windows Forms можно создавать собственные пользовательские элементы управления с помощью класса UserControl.
В Windows Forms имеются многофункциональные элементы управления пользовательского интерфейса, позволяющие эмулировать функции таких сложных приложений, как Microsoft Office. С помощью элементов управления ToolStrip и MenuStrip вы можете создавать панели инструментов и меню, которые содержат текст и изображения, отображают подменю и размещают другие элементы управления, такие как текстовые поля и поля со списками.
Используя функцию перетаскивания конструктора Windows Forms в Visual Studio, можно легко создавать приложения Windows Forms. Просто выделите элемент управления с помощью курсора и поместите его на нужное место в форме. Для преодоления трудностей, связанных с выравниванием элементов управления, конструктор предоставляет такие средства, как линии сетки и линии привязки. С помощью элементов управления FlowLayoutPanel, TableLayoutPanel и SplitContainer можно гораздо быстрее создавать сложные макеты форм.
Наконец, если нужно создать свои собственные элементы пользовательского интерфейса, пространство имен System.Drawing содержит широкий набор классов, необходимых для отрисовки линий, кругов и других фигур непосредственно на форме.
Создание форм и элементов управления
Пошаговые инструкции по использованию этих возможностей можно найти в приведенных ниже разделах справки.
- Добавление формы в проект
- Добавление элементов управления в форму
Отображение и обработка данных
Во многих приложениях требуется отображать данные из базы данных, файла XML или JSON, веб-службы или другого источника данных. Windows Forms предоставляет гибкий элемент управления с именем DataGridView для отображения таких табличных данных в традиционном формате строк и столбцов так, что каждый фрагмент данных занимает свою собственную ячейку. С помощью DataGridView можно, помимо прочего, настроить внешний вид отдельных ячеек, зафиксировать строки и столбцы на своем месте, а также обеспечить отображение сложных элементов управления внутри ячеек.
В Windows Forms можно с легкостью подключаться к источникам данных по сети. Компонент BindingSource представляет подключение к источнику данных и содержит методы для привязки данных к элементам управления, перехода к предыдущей или следующей записи, редактирования записей и сохранения изменений в исходном источнике. Элемент управления BindingNavigator предоставляет простой интерфейс на основе компонента BindingSource для перехода между записями.
Вы можете легко создавать элементы управления с привязкой к данным с помощью окна «Источники данных» в Visual Studio. В этом окне отображаются существующие в вашем проекте источники данных, такие как базы данных, веб-службы и объекты. Создавать элементы управления с привязкой к данным можно путем перетаскивания объектов из этого окна в формы проекта. Также можно связывать существующие элементы управления с данными, перетаскивая объекты из окна «Источники данных» в существующие элементы управления.
Другой тип привязки к данным в формах Windows Forms — это параметры. В большинстве приложений требуется сохранять некоторые сведения о состоянии приложения во время выполнения, например, последний известный размер форм, а также данные пользовательских предпочтений, например, место сохранения файлов по умолчанию. Параметры приложения отвечает этим требованиям, предоставляя простой способ хранения обоих типов сведений на клиентском компьютере. После того как вы определите эти параметры с помощью Visual Studio или редактора кода, они сохраняются в XML-файле и автоматически считываются обратно в память во время выполнения.
component | [How to: Bind Windows Forms Controls with the BindingSource Component Using the Designer](./controls/bind-wf-controls-with-the-bindingsource.md) | | Working with ADO.NET data sources | [How to: Sort and Filter ADO.NET Data with the Windows Forms BindingSource Component](./controls/sort-and-filter-ado-net-data-with-wf-bindingsource-component.md) | | Using the Data Sources window | [Bind Windows Forms controls to data in Visual Studio](/visualstudio/data-tools/bind-windows-forms-controls-to-data-in-visual-studio) | | Using app settings | [How to: Create Application Settings](./advanced/how-to-create-application-settings.md) | —>
Развертывание приложений на клиентских компьютерах
После создания приложения необходимо отправить его пользователям, чтобы они могли установить и запустить его на своих клиентских компьютерах. С помощью технологии ClickOnce можно развертывать приложения из Visual Studio всего в несколько щелчков, а затем предоставлять пользователям URL-адрес приложения в Интернете. ClickOnce управляет всеми элементами и зависимостями в приложении и обеспечивает его правильную установку на клиентском компьютере.
Приложения ClickOnce можно настроить для работы только при подключении к сети или для работы как в сетевом, так и в автономном режиме. Если вы указываете, что приложение должно поддерживать работу в автономном режиме, то технология ClickOnce добавляет ссылку на приложение в меню Пуск пользователя. Затем пользователь может открывать приложение без использования URL-адреса.
При обновлении приложения вы публикуете на веб-сервере новый манифест развертывания и новую копию приложения. ClickOnce обнаруживает, что доступно обновление, и обновляет установку пользователя. Таким образом, для обновления старых приложений не требуется писать специальный код.
См. также
- Руководство по созданию приложения WinForms
- Добавление формы в проект
- Добавление элемента управления
Windows Forms: Современная модель программирования для создания GUI приложений
Чтобы создать GUI приложения в Microsoft .NET нужно использовать Windows Forms. Windows Forms — новый стиль построения приложения на базе классов .NET Framework class library. Они имеют собственную модель программирования, которая более совершеннее, чем модели, основанные на Win32 API или MFC, и они выполняются в управляемой среде .NET Common Language Runtime (CLR). Эта статья дает представление о том, что такое Windows Forms, рассматривая ее от модели программирования до Microsoft Intermediate Language и JIT-транслятора.
Вы уже много слышали, что Microsoft .NET — новая платформа, которая основана на Windows. Это целая новая парадигма программирования, которая изменит путь, которым вы сейчас думаете о написании программ для Windows. Она реализована на библиотеке классов .NET Framework class library и содержит более единую модель программирования, улучшенную защиту и более богатые возможности для написания полнофункциональных веб-приложений. И это только начало.
Windows Forms — одна из наиболее интересных возможностей Microsoft .NET. Если вы знакомы с MFC (или Windows API), то Windows Forms хорошее начало для работы с .NET Framework class library, потому что она позволяет писать традиционные GUI приложения с окнами, формами и т.п. вещами. Однажды, начав работать с Windows Forms вы сможете быстро понять .NET Framework.
Главная выгода от написания Windows-приложений с использованием Windows Forms — это то, что Windows Forms гомогенизируют (создают более однородную (гомогенную) структуру) программную модель и устраняют многие ошибки и противоречия от использования Windows API. Например, каждый опытный программист под Windows знает, что некоторые стили окна могут применяться только к окну, когда оно уже создано. Windows Forms в значительной степени устраняют такое противоречие. Если вы хотите существующему окну задать стиль, который может быть присвоен только в момент создания окна, то Windows Forms спокойно уничтожит окно и вновь создаст его с указанным стилем. Кроме того, .NET Framework class library намного более богаче, чем Windows API, и когда вы будете писать приложения, используя Windows Forms, вы получите в распоряжение больше возможностей. Написание приложения с использованием Windows Forms потребует меньшего количества кода, чем приложения, которые используют Windows API или MFC.
Другая выгода от Windows Forms — вы используете тот же самый API, независимо от языка программирования, который вы выбрали. В прошлом, выбор языка программирования управлял выбором API. Если вы программировали в Visual Basic, вы использовали один API (реализованный на языке Visual Basic), в то время как программисты C использовали Win32 API, а программисты C++, вообще говоря, использовали MFC. MFC-программисту было трудно переключиться на Visual Basic и наоборот. Но теперь такого больше нет. Все приложения, которые используют Windows Forms, используют один API из .NET Framework class library. Знание одного API достаточно позволит программисту писать приложения фактически на любом языке, который он выберет.
Windows Forms ни как не меньше, чем современная модель программирования для GUI приложений. В отличие от модели программирования Win32, в которой многое идет еще от Windows 1.0, новая модель была разработана с учетом всех современных требований. Цель этой статьи состоит в том, чтобы познакомить читателя с моделью программирования Windows Forms. Чтобы компилировать и выполнять примеры кода, приведенного далее, на вашем компьютере должнен быть установлен пакет Microsoft .NET Framework SDK (.NET Framework SDK Beta 1 доступен на сайте Microsoft).
Модель программирования Windows Forms
В Windows Forms термин «форма» — синоним окна верхнего уровня. Главное окно приложения — форма. Любые другие окна верхнего уровня, которые имеет приложение — также формы. Окна диалога также считаются формами. Несмотря на название, приложения, использующие Windows Forms, не выглядят как формы. Подобно традиционным Windows-приложениям приложения осуществляют полный контроль над событиями в собственных окнах.
Программисты видят Microsoft .NET через линзу .NET Framework class library. Представьте MFC на порядок больше и вы получите точную картину о ширине и глубине .NET Framework class library. Чтобы облегчить противоречия в обозначениях и придать организацию многим сотням классов, .NET Framework class library разбита на иерархические разделы по именам. Корневой раздел, System, определяет фундаментальные типы данных, используемые всеми приложениями .NET.
Приложения, использующие Windows Forms используют классы System.WinForms. Этот раздел включает такие классы, как Form, который моделирует поведение окон или форм; Menu, который представляет меню; Clipboard, который дает возможность приложениям Windows Forms использовать буфер обмена. Он также содержит многочисленные классы, предоставляющие средства управления, например: Button, TextBox, ListView, MonthCalendar и т.д. Эти классы могут быть включены в приложение либо с использованием только имени класса, либо с использованием полного имени, например: System.WinForms.Button.
В основе почти каждого приложения, написанного с применением Windows Forms, — производный класс от System.WinForms.Form. Образец этого класса представляет главное окно приложения. System.WinForms.Form имеет множество свойств и методов, которые имеют богатый программный интерфейс к формам. Хотите знать размеры клиентской области формы? В Windows вы вызвали бы функцию API GetClientRect. В Windows Forms нужно использовать свойства ClientRectangle или ClientSize.
Приложения, основанные на Windows Forms, которые используют кнопки, списки и другие типы компонентов Windows, используют классы управления System.WinForms, значительно упрощающие программирование управления. Хотите создать стилизованную кнопку с изображением в виде фона? Нет проблем. Включите требуемое изображение в объект System.Drawing.Bitmap и назначьте его свойству кнопки BackgroundImage. Как насчет управления цветом? Вы когда-либо пробовали настраивать цвет фона текстового поля? В Windows Forms это просто: нужно просто присвоить цвет свойству BackColor, все отстальное система сделает сама.
Другой важный «строительный» блок приложения, который использует Windows Forms — класс System.WinForms по имени Application. Этот класс содержит статический метод Run, который загружает приложение и отображает окно.
Вы скажете: если приложения, которые являются Windows Forms, не обрабатывают сообщения, как они отвечают на пользовательский ввод или знают когда рисовать? Много классов имеют виртуальные методы, которые можно переопределить. Например, System.WinForms.Form содержит виртуальный метод OnPaint, который вызывается когда клиентская область формы нуждается в обновлении. OnPaint — один из многих виртуальных методов, который можно переопределить в производном классе для формирования интерактивных форм.
Другая важная грань модели программирования Windows Forms — механизм, который формы используют для ответа на ввод в меню, средств управления и других элементов GUI приложения. Традиционные Windows-приложения обрабатывают сообщения WM_COMMAND и WM_NOTIFY используя события процесса Windows Forms. В C# и на других языках, которые поддерживают .NET Common Language Runtime (CLR), события — члены типа первого класса наравне с методами, полями и свойствами. Фактически все управляющие классы (control classes) Windows Forms (а также и многие неуправляющие классы) создают события. Например, кнопка (экземпляр System.WinForms.Button) после нажатия создает событие Click. Форма, которая должна ответить на нажатие кнопки может использовать следующий код, чтобы соединить кнопку на обработчиком события Click:
MyButton.Click += new EventHandler (OnButtonClicked); . private void OnButtonClicked (object sender, EventArgs e)
EventHandler — специальный обработчик событий, который выполняет метод OnButtonClicked когда MyButton создает событие Click. Первый параметр OnButtonClicked идентифицирует объект, который вызвал событие. Второй параметр в основном бессмысленен для события Click, но используется некоторым другие типами событий, чтобы передать дополнительную информацию.
Приложение «Hello World» с Windows Forms
Самый простой способ начать изучение новой платформы — создание приложения «Hello World». В Листинге 1 показана версия, созданная при помощи Windows Forms. Все примеры в этой статье написаны на C#, но вы можете писать приложения Windows Forms на любом языке, для которого есть компилятор .NET. Сегодня это: C#, Visual Basic, JScript и C++.
using System; using System.WinForms; using System.Drawing; public class MyForm : Form < public MyForm () < Text = "Windows Forms Demo"; >protected override void OnPaint (PaintEventArgs e) < e.Graphics.DrawString ("Hello, world", Font, new SolidBrush (Color.Black), ClientRectangle); >public static void Main (string[] args) < Application.Run (new MyForm ()); >>
Начнем сначала. Слово «using» вверху файла позволяют сослаться на классы в пакетах System, System.WinForms и System.Drawing. Например,
using System.WinForms;
public class MyForm : System.WinForms.Form
public class MyForm : Form
В приложении, использующем Windows Forms, каждое окно — или форма — представлено экземпляром класса, производного от System.WinForms.Form (Листинг 1 — класс MyForm). Конструктор MyForm устанавливает текст заголовка формы «Windows Forms Demo» используя свойство Text. Text — одно из более чем 100 свойств, которые форма наследует от System.WinForms.Form, но пока единственное, в котором вы нуждаетесь.
Как вы знаете, окна получают сообщения WM_PAINT и большинство перерисовок экрана выполнено в ответ на эти сообщения. В Windows Forms эквивалент сообщения WM_PAINT — виртуальный метод по имени OnPaint. Производный класс формы может переопределить этот метод в случае надобности выполнять собственную перерисовку в ответ на сообщения WM_PAINT.
Обратите внимание на ключевое слово в Листинге 1, которое компилятор C# интерпретирует как подтверждение, что вы хотите переопределить виртуальный метод, унаследованный от базового класса. Перопределенный OnPaint записывает «Hello, world» в клиентской области формы. OnPaint вызывает объект PaintEventArgs (System.WinForms.PaintEventArgs), который содержит свойства Graphics и ClipRectangle. Свойство Graphics ссылается к объекту Graphics (System.Drawing.Graphics), который является эквивалентом контекста устройства (device context) в Windows Forms. ClipRectangle производное объекта Rectangle (System.Drawing.Rectangle), который описывает какая часть формы является недопустимой.
Метод OnPaint из MyForm использует Graphics.DrawString, чтобы выполнить вывод на экран. Первый параметр DrawString — непосредственно само сообщение (строка) «Hello, world». Второй — объект Font (System.Drawing.Font), который описывает шрифт для вывода текста. MyForm.OnPaint использует шрифт формы (которой установлен в свойстве Font формы). Третий параметр — Brush (System.Drawing.Brush) — объектное определение цвета текста. Четвертый и заключительный параметр — прямоугольник области, куда требуется вписать текст.
Заключительная часть MyForm — статический метод Main. Main — точка входа в приложение. Каждое приложение .NET должно иметь этот метод. Main может быть объявлен любым из следующих способов:
public static void Main () public static int Main () public static void Main (string[] args) public static int Main (string[] args)
Параметр args метода Main — строковый массив параметров командной строки (задаваемых при вызове программы). Элемент args[0] хранит первый параметр командной строки, args[1] — второй и т.д. Как правило, в каждом приложении метод Main выполняется только однажды (компилятор Microsoft C# допускает использование ключа /main, указывающего в каком классе содержится метод Main, если приложение имеет несколько классов с методами Main). Main может находиться в любом классе, определенном в приложении.
Отображение нашей формы на экране — простой пример выполнения MyForm и передачи действия Application.Run. Application — другой класс, определенный в System.WinForms. Метод Run создает форму, отображает ее на экране и обрабатывает сообщения к ней. Следующая инструкция в Листинге 1
Application.Run (new MyForm ());
обрабатывает MyForm и показывает форму.
Сохраните текст программного кода (Листинг 1) в файле Hello.cs и откомпилируйте его. Чтобы это сделать, откройте окно командной строки, перейдите в каталог файла Hello.cs и введите:
csc /target:winexe /out:Hello.exe /reference:System.dll /reference:System.WinForms.dll /reference:System.Drawing.dll /reference:Microsoft.Win32.Interop.dll Hello.cs
Команда csc вызывает компилятор Microsoft C#. «Hello.cs» указывает на файл, который требуется откомпилировать. Ключ «/target:winexe» сообщает компилятору, что нужно создать GUI-приложение для Windows, а «/out:Hello.exe» задает имя файла программы (этот ключ можно опустить, т.к. в данном случае по умолчанию все равно будет создан Hello.exe, т.к. CS-файл назван Hello.cs). Ключи «/reference» указывают ссылки на внешние классы, например, для System.WinForms.Form и System.Drawing.Size. Для краткости допускается заменять «/target» и «/reference» на «/t» и «/r».
Hello.exe не обычный EXE-файл, это .NET-программа, содержащая следующие важные элементы:
- Microsoft Intermediate Language (MSIL), сгенерированный при помощи C#
- Метаданные, описывающие типы (классы), определенные в приложении, и типы (например, System.WinForms.Form), на которые ссылается приложение, находящиеся в другом месте (например, в MsCorLib.dll и System.WinForms.dll)
- Декларация, описывающая требуемые файлы для сборки приложения
В языке .NET, сборка — это коллекция из одного или более файлов, создающих модуль. Наша сборка содержит только один файл — Hello.exe — и этот факт отмечен в декларации внутри выполнимой программы. Декларация физически сохранена как часть метаданных. Каждая управляемая выполнимая программа — это есть любой PE-файл, который содержит MSIL — часть сборки и каждая управляемая выполнимая программа имеет метаданные внутри. Один из файлов в .NET-сборке содержит декларацию идентификации файлов, которые должны быть включены при сборке и общедоступные типы. Компилятор C# производит всю необходимую инфраструктуру.
Теперь когда вы откомпилировали Hello.exe, можете набрать в командной строке:
Hello
Посмотрите на рис.1, чтобы увидеть результат работы нашей программы.
Рис.1. Приложение «Hello, World»
Что нового в Windows Forms в .NET 6.0
Мы продолжаем поддерживать и внедрять инновации в среду выполнения Windows Forms. В этой статье обсудим, что мы сделали в рамках .NET 6.0.
Улучшения и исправления специальных возможностей
Сделать приложения Windows Forms более доступными для большего числа пользователей — одна из главных целей нашей команды. Опираясь на импульс, который мы получили в период разработки .NET 5.0, в этом релизе мы внесли дальнейшие улучшения, включая, помимо прочего, следующее:
- Улучшена поддержка вспомогательных технологий при использовании приложений Windows Forms. Провайдеры UIA (Microsoft UI Automation) позволяют таким инструментам, как Экранный диктор и другие, взаимодействовать с элементами приложения. UIA также часто используется для автоматизации тестирования приложений. Мы добавили поддержку UIA для следующих элементов управления: CheckedListBox; LinkLabel; Panel; ScrollBar; TabControl; TrackBar.
- Улучшены уведомления экранного диктора в элементах управления заголовками столбцов DataGridView, ErrorProvider и ListView.
- Всплывающие подсказки клавиатуры для элементов управления TabControl-TabPage и TreeView-TreeNode.
- ScrollItem Control Pattern поддержка для ComboBoxItemAccessibleObject.
- Исправлены типы элементов управления для лучшей поддержки Text Control Patterns.
- ExpandCollapse Control Pattern поддержка для DateTimePicker.
- Invoke Control Pattern поддержка для компонента UpDownButtons в DomainUpDown и NumericUpDown.
- Улучшен цветовой контраст в следующих элементах управления: CheckedListBox, DataGridView, Label, PropertyGridView, ToolStripButton.
Начальная загрузка приложения
В .NET Core 3.0 мы начали модернизировать и обновлять Windows Forms. В рамках этой инициативы мы изменили шрифт по умолчанию на Segoe UI, 9f (dotnet/winforms#656), и быстро узнали, что многие вещи зависят от метрик шрифта по умолчанию. Например, конструктор больше не был настоящим WYSIWYG, поскольку процесс Visual Studio выполняется под .NET Framework 4.7.2 и использует старый шрифт по умолчанию (Microsoft Sans Serif, 8.25f), а приложение .NET во время выполнения использует новый шрифт. Это изменение также усложнило для некоторых пользователей миграцию своих больших приложений с выверенными макетами. Несмотря на то, что мы предоставили стратегии миграции, применение их к сотням форм и элементам управления могло бы стать серьезной задачей.
Чтобы упростить миграцию этих приложений с идеально-выверенной точностью до пикселя, мы представили новый API (подробности см. в публикации о шрифтах по умолчанию для всего приложения):
void Application.SetDefaultFont(Font font)
Однако этого API было недостаточно для обеспечения возможности дизайнера отображать формы и элементы управления с использованием одного и того же нового шрифта. В то же время из-за того, что наши другие команды усиленно настаивали на небольших шаблонах приложений, наш Program.cs и его метод Main() стали выглядеть очень устаревшими, и мы решили следовать общей тенденции .NET и урезать шаблон. Встречайте новую загрузочную программу Windows Forms:
class Program < [STAThread] static void Main() < ApplicationConfiguration.Initialize(); Application.Run(new Form1()); >>
ApplicationConfiguration.Initialize() — это API, сгенерированный источником, который генерирует следующие вызовы:
Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.SetDefaultFont(new Font(. )); Application.SetHighDpiMode(HighDpiMode.SystemAware);
Параметры этих вызовов настраиваются с помощью свойств MSBuild в файлах csproj или props. Дизайнер Windows Forms в Visual Studio 2022 также знает об этих свойствах (пока он читает только шрифт по умолчанию) и может показать вам ваше приложение (C#, .NET 6.0 и выше) так, как оно будет выглядеть во время выполнения:
Обратите внимание, что Visual Basic по-разному обрабатывает эти значения по умолчанию для всего приложения. В .NET 6.0 Visual Basic представляет новое событие приложения ApplyApplicationDefaults, которое позволяет вам определять параметры всего приложения (например, HighDpiMode или шрифт по умолчанию) обычным способом Visual Basic. В ближайшем будущем также появится дизайнерская поддержка шрифта по умолчанию, настроенного через свойства MSBuild. Для получения дополнительных сведений перейдите в специальный пост в блоге о Visual Basic, в котором обсуждаются новые возможности Visual Basic.
Обновления шаблона
Как упоминалось выше, мы обновили наши шаблоны C# в соответствии с соответствующими изменениями в рабочих нагрузках .NET, шаблоны Windows Forms для C# были обновлены для поддержки директив global using, пространств имен с файловой областью и ссылочных типов, допускающих значение NULL. Поскольку для типичного приложения Windows Forms требуется атрибут STAThread, и оно состоит из нескольких типов, разделенных на несколько файлов (например, Form1.cs и Form1.Designer.cs), операторы верхнего уровня отсутствуют в шаблонах Windows Forms. Однако обновленные шаблоны включают код начальной загрузки приложения.
Больше конструкторов среды выполнения
Мы завершили перенос недостающих конструкторов и связанную с ними инфраструктуру, которая позволяет создавать универсального дизайнера (например, дизайнера отчетов). Для получения более подробной информации обратитесь к нашему более раннему анонсу.
Если вы считаете, что мы забыли о конструкторе, от которого зависит ваше приложение, сообщите нам об этом в нашем репозитории GitHub.
Высокий DPI и улучшения масштабирования
Мы работали над пространством с высоким DPI, чтобы заставить приложения Windows Forms правильно поддерживать режим PerMonitorV2 из коробки. Это сложная задача, и, к сожалению, мы не смогли добиться того, на что рассчитывали. Тем не менее в этом выпуске мы добились некоторого прогресса, и теперь можно:
- Создавайте элементы управления с той же поддержкой DPI, что и приложение.
- Правильно масштабируйте ContainerControls и дочерние окна MDI в режиме PerMonitorV2 в большинстве сценариев. По-прежнему существует несколько конкретных сценариев (например, привязка) и элементов управления (например, MonthCalendar), в которых взаимодействие остается некачественным.
Другие заметные изменения
- Новые перегрузки для методов Control.Invoke() и Control.BeginInvoke(), которые принимают Action и Func и позволяют писать более современный и лаконичный код.
- Новый API Control.IsAncestorSiteInDesignMode является дополнительным к Component.DesignMode и указывает, размещен ли один из прародителей элемента управления, а также находится ли этот сайт в режиме разработки. Специальная запись в блоге, посвященная этому API, появится позже, так что следите за обновлениями.
- Поведение всплывающей подсказки по умолчанию в стиле Windows 11 заставляет всплывающую подсказку оставаться открытой при наведении на нее мыши и не исчезать автоматически. Всплывающую подсказку можно закрыть клавишами CONTROL или ESCAPE.
- Блог компании Microsoft
- .NET
- Visual Studio
- Разработка под Windows
- Visual Basic for Applications