Опубликован: 13.07.2010 | Доступ: свободный | Студентов: 889 / 20 | Оценка: 4.40 / 4.20 | Длительность: 77:34:00
Самостоятельная работа 26:

Пользовательские элементы управления

Тестирование пользовательских элементов BeepButton и MyDialogBox

  • Добавьте к решению MySolution новый проект с именем Test типа Windows Application. Для этого выполните команду меню оболочки File/Add/New Project и заполните окно мастера примерно так

  • В панели Solution Explorer выделите узел проекта Test и назначьте его стартовым командой Project/Set as StartUp Project меню оболочки или аналогичной командой контекстного меню
  • Выделите форму Form1 и настройте ее свойства как показано в таблице
Таблица свойств формы тестового приложения
Свойство Значение Пояснения
Text Кнопка со звуком Заголовок тестового окна
StartPosition CenterScreen Открывать в центре экрана
  • Поместите из панели Toolbox на верхнюю часть формы экземпляр textBox1 текстового поля TextBox
  • Поместите из панели Toolbox на середину формы разработанную нами кнопку BeepButton и настройте ее в соответствии с таблицей
Таблица свойств кнопки BeepButton
Свойство Значение Пояснения
AutoSize true Подстраиваться под содержимое
Text Звукнуть Надпись
Location 100; 100 Позиционировали
  • Для выделенного экземпляра кнопки BeepButton переведите панель Properties оболочки в режим Events и в поле события Click задайте имя обработчика ButtonOnClick
  • Заполните обработчик кодом вызова нашего диалогового окна MyDialogBox так
private void ButtonOnClick(object sender, EventArgs e)
        {
            string msg;
    
            if (textBox1.Text.Trim().Length == 0)
                msg = "Щелкнули на кнопке";
            else
                msg = textBox1.Text.Trim();
    
            // Запускаем наше диалоговое окно статическим методом
            MyDialogBox.Show(msg, this.Text);
        }
Листинг 19.5. Обработчик события Click звуковой кнопки BeepButton
  • Добавьте в начало файла Form1.cs строку кода подключения пространства имен нашей библиотеки элементов

using MyCompany.UserControls;

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

  • Выполните приложение и получите примерно такой результат


В производном от кнопки классе BeepButton мы только переопределили виртуальный метод OnClick(), в который встроили вызов звукового сигнала. В вызывающем коде тестового приложения, использующем экземпляр класса расширения кнопки, мы подписались на событие Click, чтобы щелчок на кнопке запускал самодельное диалоговое окно.

Но мы этот метод перехватили в нашем расширении, и если не предусмотреть передачу вызова base.OnClick(e) дальше по цепочке наследования в класс Control, то событие Click инициировано не будет и наш зарегистрированный обработчик ButtonOnClick() никогда не сработает. А значит и наше диалоговое окно вызываться не будет (попробуйте закоментировать вызов base.OnClick(e) в файле BeepButton.cs ).

Таким образом, в переопределенном методе OnClick(), который срабатывает автоматически при щелчке на кнопке, вызывается звуковой сигнал. А при вызове этого метода в базовом классе генерируется событие Click, которое заставляет выполниться все зарегистрированные для него обработчики. В нашем случае это один обработчик, косвенно запускающий самодельное диалоговое окно. Метод OnClick() для кнопок вызывается и в тех случаях, когда кнопка имеет текущий фокус ввода и нажимается клавиша Enter или Space (пробел).

Если в переопределенном методе OnClick() класса BeepButton поменять местами строки вызова звука и события Click, то звук появится только после закрытия диалогового окна (попробуйте).

Обратите внимание, что при формировании интерфейса диалогового окна мы не расставляли по форме кнопку и текстовую метку. Но за счет применения библиотечного компонента FlowLayoutPanel эти элементы на этапе выполнения позиционируются автоматически.