При нажатии на Сумма в примере ArbitraryMethod из Лекция 7, VS 2013 выдается ошибка: Необработанное исключение типа "System.InvalidOperationException" в System.Windows.Forms.dll Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "lblResult" не из того потока, в котором он был создан. Затем: Необработанное исключение типа "System.InvalidOperationException" в mscorlib.dll Дополнительные сведения: Для каждой асинхронной операции метод EndInvoke может вызываться только один раз. |
Работа с элементами управления
Label, LinkLabel и PictureBox
Программы, как правило, содержат пункт главного меню "О программе", где в отдельном окне помещается логотип компании, лицензионное соглашение, гиперссылки на сайт разработчика и другая информация. Создадим подобную форму, используя новые элементы управления — Label, LinkLabel и PictureBox.
Итак, добавим в наш проект новую форму и назовем ее About.cs. Установим следующие свойства формы:
About, форма, свойство | Значение |
---|---|
Name | About |
FormBorderStyle | FixedSingle |
MaximizeBox | False |
MinimizeBox | False |
Size | 318; 214 |
Text | About Notepad C# |
Добавим на форму элемент управления PictureBox — он представляет собой подложку, размещаемую на форме, которая может содержать в себе рисунки для отображения. В поле свойства Image щелкаем на кнопку (…) и выбираем рисунок по адресу Code\Glava2\NotepadCSharp\Icon\logo.gif. Поскольку logo.gif является анимированным рисунком, элемент PictureBox начинает воспроизводить анимацию сразу же, даже в режиме дизайна.
Из окна ToolBox перетащим на форму кнопку, Label и LinkLabel. В поле свойства Text кнопки введем &OK. Элемент Label предназначен для размещения на форме надписей, которые в готовом приложении будут доступны только для чтения. В поле свойства Text введем Notepad C# 2006 All rights reserved. Элемент LinkLabel отображает текст на форме в стиле web-ссылок и обычно используется для создания навигации между формами или ссылки на сайт. В поле Text этого элемента вводим адрес гипотетического сайта — www.notepadcsharp.com. Пользователь будет переходить на сайт, нажимая на эту ссылку, поэтому реализуем переход по гиперссылке для события Click. В окне Properties щелкаем дважды на событии Click и добавляем обработчик:
private void linkLabel1_Click(object sender, System.EventArgs e) { //Добавляем блок для обработки исключений — по разным причинам //пользователь может не получить доступа к ресурсу. try { //Вызываем метод VisitLink, определенный ниже VisitLink(); } catch (Exception ex ) { MessageBox.Show(ex +"Unable to open link that was clicked."); } } //Создаем метод VisitLink private void VisitLink() { // Изменяем цвет посещенной ссылки, программно //обращаясь к свойству LinkVisited элемента LinkLabel linkLabel1.LinkVisited = true; //Вызываем метод Process.Start method для запуска браузера, //установленного по умолчанию, и открытия ссылки System.Diagnostics.Process.Start("http://www.notepadcsharp.com"); }Листинг 2.12.
Кнопка OK просто будет закрывать форму:
private void button1_Click(object sender, System.EventArgs e) { this.Close(); }
В пункте главного меню About Programm… формы frmmain добавляем процедуру вызова формы About:
private void mnuAbout_Click(object sender, System.EventArgs e) { //Создаем новый экземпляр формы About About frm = new About(); frm.Show(); }
Запускаем приложение (рис. 2.26):
Режимы запуска окон
В приложении Notepad C# с открытой формой About без труда можно вернуться к другим пунктам меню программы или документу, т. е. форма About позволяет переключать фокус. Такое поведение дочерних форм характерно для панелей инструментов в программах и называется немодальным. Наоборот, форма, запущенная в модальном режиме, не позволит работать с приложением до тех пор, пока мы не закроем эту форму. Для открытия формы в модальном режиме используется метод ShowDialog:
private void mnuAbout_Click(object sender, System.EventArgs e) { //Создаем новый экземпляр формы About About frm = new About(); frm.ShowDialog(); }
Модификаторы доступа и наследование форм
С модификаторами доступа вы сталкивались, когда изучали синтаксис языка C#. Используя их, можно определить область видимости, иначе говоря, уровень доступности типов и членов классов, — под этим понимается участок кода, из любой точки которого будет доступен запрашиваемый тип или член класса. Технология Common Type System (CTS, система общих типов) — одна из технологий, обеспечивающих функционирование среды .NET, определяет правила для видимости типов и доступа к их членам. Различные типы модификаторов и их описание приводятся в таблице 2.3.
Модификатор | Определение |
---|---|
public (общественный, открытый) | Объект доступен любому коду из любой сборки |
private (частный, закрытый) | Объект может быть вызван другими методами только из того же типа |
internal (внутренний, сборочный) | Объект может быть вызван любым кодом из той же сборки |
protected (защищенный, родовой) | Объект может быть вызван производными типами независимо от их сборки |
protected internal (родовой сборочный) | Объект может быть вызван производными типами, определенными в той же самой сборке |
В качестве объекта могут выступать методы, свойства, классы и, как мы далее увидим, — формы. Под сборкой здесь понимается функциональная единица кода (строгое определение сборок см. в "Создание пакетов установки" ).
Наследование классов — достаточно простое и чрезвычайно удобное понятие синтаксиса С#. Формы, которые содержат большую часть методов и свойств, определенных как public, тоже можно наследовать — для получения доступа к свойствам, определенным как protected, и для ускорения работы. В самом деле, если у нас имеется уже готовая форма (например, About Notepad C#), которую мы собираемся использовать в нескольких приложениях, удобно просто создать наследуемую форму.
Запускаем приложение Notepad C# и в окне Solution Explorer щелкаем правой кнопкой на названии проекта. В появившемся контекстном меню выбираем Add\Add Inherited Form… . В окне Add New Item задаем название формы — IAbout.cs. Далее появляется окно Inheritance Picker, в котором отображаются все формы текущего проекта (рис. 2.27).
В этом окне мы выбираем форму About. Обратите внимание на кнопку Browse, позволяющую искать формы для наследования в библиотеках dll. Нажимаем кнопку OK — в проекте появилась новая форма, содержащая все элементы управления формы About (рис. 2.28). Для завершения связей необходимо скомпилировать проект cнова — выбрав пункт главного меню Build/Rebuild Solution.
При редактировании родительской формы изменения также касаются дочерней — добавьте, например, кнопку на форму About, и она появится на форме IAbout. Изменения же, производимые с дочерней формой, не затрагивают родительскую форму.
ToolBar и ImageList
Панели инструментов ToolBar содержат наборы кнопок, как правило, дублирующих пункты главного меню. В графических программах панели инструментов — основное средство работы. Откроем снова приложение Notepad C# и перетащим из окна ToolBox элемент управления ToolBar. На кнопках панели обычно располагаются иконки, поэтому, прежде чем мы начнем заниматься ими, нам следует подумать о рисунках. Добавим на форму элемент управления ImageList, применяемый для хранения рисунков, которые могут быть использованы для оформления приложения. Щелкнем в поле Images элемента ImageList (рис. 2.29).
Добавим файлы иконок, последовательно нажимая кнопку Add и выбирая директорию — Code\Glava2\NotepadCSharp\Icon. Мы создадим кнопки панели инструментов, дублирующие действия пунктов меню New, Open, Save, Cut, Copy и Paste, поэтому вы можете выбрать подходящие изображения на своем компьютере1Для создания иконки подходит даже редактор Paint. Для иконки панели инструментов размер рисунка должен быть 16х16 пикселей, сохраненный как 256-цветный рисунок. Для преобразования сохраненного рисунка, например, 1.bmp, просто смените его расширение на 1.ico.. В любом случае, подобрав иконки, завершаем работу с редактором ImageCollectionEditor, нажимая OK. Займемся теперь элементом ToolBar. Свойству Name установим значение toolBarMain, а в поле свойства ImageList выберем imageList1. Запустим редактор ToolBarButton Collection Editor для создания кнопок, щелкнув кнопку (…) в поле свойства Buttons (рис. 2.30).
Для добавления кнопок в этом редакторе тоже следует нажимать клавишу Add. Создадим шесть кнопок, установив для них следующие свойства:
Name | Image Index | ToolTipText |
---|---|---|
tbNew | Create New | |
tbOpen | Open | |
tbSave | Save | |
tbCut | Cut | |
tbCopy | Copy | |
tbPaste | Paste |
Свойство Name устанавливает название кнопки для обращения к ней в коде. Свойство Image Index определяет изображение на кнопке, а в поле ToolTipText вводим текст всплывающей подсказки, которая будет появляться при наведении курсора на кнопку. Завершив работу с редактором кнопок в режиме дизайна формы frmmain, дважды щелкаем на ToolBar и переходим в код. Для создания функциональности кнопок связываем событие Click заданной кнопки c соответствующим обработчиком пунктов меню:
private void toolBarMain_ButtonClick(object sender, System.Windows.Forms.ToolBarButtonClickEventArgs e) { //New if (e.Button.Equals(tbNew)) { mnuNew_Click(this, new EventArgs()); } //Open if (e.Button.Equals(tbOpen)) { mnuOpen_Click(this, new EventArgs()); } //Save if (e.Button.Equals(tbSave)) { mnuSave_Click(this, new EventArgs()); } //Cut if (e.Button.Equals(tbCut)) { mnuCut_Click(this, new EventArgs()); } //Copy if (e.Button.Equals(tbCopy)) { mnuCopy_Click(this, new EventArgs()); } //Paste if (e.Button.Equals(tbPaste)) { mnuPaste_Click(this, new EventArgs()); } }Листинг 2.13.
Запускаем приложение. Кнопки панели инструментов дублируют пункты меню, а при наведении на них появляются подсказки (рис. 2.31).
На диске, прилагаемом к книге, вы найдете приложение NotepadCSharp (Code\Glava2\NotepadCSharp). В конце этой лекции приводится листинг форм frmamin и blank.