|
Программирование >> Программирование с использованием ajax
Для определения того, должно ли текстовое поле размещаться под надписью или справа от нее, мы проверяем значение mPosition в операторе switch. Если пользователь выбирает значение Below, верхний край текстового поля перемещается в позицию, расположенную под надписью. Затем левый край текстового поля перемещается к левому краю элемента управления, а его ширина устанавливается равной ширине элемента управления. Если пользователь выбирает опцию Right, существуют две возможности. Если значение TextboxMargin равно нулю, вначале нужно определить ширину незанятой области элемента управления, которую можно предоставить текстовому полю. Затем левый край текстового поля прижимается к правому краю текста, а его ширина устанавливается такой, чтобы заполнить свободную область элемента управления. Если же пользователь указывает ширину границы, левый край текстового поля помещается в указанную позицию, а его ширина определяется соответствующим образом. Теперь можно протестировать элемент управления. Но прежде чем двигаться дальше, постройте проект. Отладка пользовательских элементов управления Отладка пользовательского элемента управления значительно отличается от отладки приложения для Windows. Обычно достаточно добавить точку останова где-либо, нажать клавишу <F5> и посмотреть, что происходит. Если вы еще не знакомы с процессом отладки, обратитесь к главе 7. Чтобы он мог себя отображать, элемент управления нуждается в контейнере, и нам нужно предоставить такой контейнер. Мы выполним это в следующем практическом занятии, создав проект приложения для Windows. Практическое заняти !!] управления 1. Из меню File выберите пункт AddiNew Project (Добавить=>Новый проект). В диалоговом окне Add New Project создайте новое Windows-приложение LabelTextboxTest. Поскольку это приложение предназначено только для тестирования пользовательского элемента управления, имеет смысл создать проект внутри проекта LabelTextBox. Теперь в проводнике решений Solution Explorer вы должны видеть два открытых проекта. Первый созданный проект, LabelTextbox, вьщелен полужирным. Это означает, что при попытке запуска решения отладчик будет пытаться использовать проект элемента управления в качестве стартового. Эта попытка окажется безуспешной, поскольку проект элемента управления не является самостоятельным. Чтобы исправить эту ситуацию, щелкните правой кнопкой мыши на имени нового проекта - LabelTextboxTest - и из контекстного меню выберите команду Set as Startup Project (Установить в качестве стартового проекта). Если теперь запустить решение, проект Windows-приложения будет запущен без каких-либо ошибок. 2. Теперь верхняя часть панели инструментов Toolbox должна содержать вкладку LabelTextBox Components (Компоненты LabelTextBox). Visual Studio распознает, что решение содержит компоненты библиотеки Windows Control Library, и что, вполне вероятно, элементы управления, предоставляемые этой библиотекой, желательно использовать в других проектах. Дважды щелкните на элементе управления ctlLabelTextbox, чтобы добавить его в форму. Обратите внимание. что узел References (Ссылки) в окне Solution Explorer развернут. Это обусловлено тем, что Visual Studio только что автоматически добавила ссылку на проект LabelTextBox. 3. В коде поищите компонент ctlLabel. Поиск нужно выполнять во всем проекте. В результате вы натолкнетесь на фоновый файл Form. Designer. cs, в котором Visual Studio скрывает большую часть генерируемого ею кода. Помните, что этот файл никогда не следует редактировать непосредственно. 4. Поместите точку останова на следующую строку: this.ctlLabelTextboxl = new LabelTextbox.CtlLabelTextbox() ; 5. Запустите код. Как и следовало ожидать, выполнение кода останавливается в установленной точке останова. Теперь выполните вход в код (при использовании раскладок клавиатуры, заданных по умолчанию, нажмите для этого клавишу <F11>). При входе в код будет выполнен переход к конструктору нового элемента управления, что и требуется для отладки компонента. Здесь же можно помещать дополнительные точки останова. Чтобы запустить приложение, нажмите клавишу <F5>. Расширение элемента управления LabelTextbox Теперь, наконец, можно протестировать свойства элемента управления. На рис. 16.18 показана надпись с именем элемента управления и текстовое поле, которое занимает остальную часть элемента управления. Обратите внимание, что элементы управления внутри элемента управления LabelTextbox перемещаются в Рис. 16.18. Расширенный элемент соответствующие позиции при добавлении элемента управления Label Textbox управления в форму. Добавление дополнительных свойств в данный момент элемент управления позволяет выполнить не слишком многое, поскольку, к сожалению, он лишен возможности изменения текста в надписи и текстовом поле. Для устранения этого недостатка добавим два свойства: Label Text и TextboxText. Их добавление выполняется точно так же, как и двух предыдущих - откройте проект и добавьте следующий код: get { return mLabelText; set { mLabelText = value; IblTextBox.Text = mLabelText; MoveControls(); public string TextboxText { get { return txtLabelText.Text;
Нужно также объявить переменную-член mLabelText для хранения текста: private string mLabelText = ; public CtlLabelTextboxО { Чтобы вставить текст, достаточно присвоить текст свойству Text элементов управления Label и TextBox и возвратить значения свойств Text. При изменении текста надписи необходимо вызывать метод MoveControls (), поскольку текст надписи может влиять на позицию текстового поля. И напротив, текст, вставленный в текстовое поле, не вызывает перемещение элементов управления; если длина текста превышает длину текстового поля, он исчезает из виду. Добавление дополнительных обработчиков событий Теперь пора подумать о том, какие события должен предоставлять элемент управления. Поскольку он является производным от класса UserControl, он наследует множество функциональных возможностей, не требующих специальной обработки. Однако существует ряд событий, обработку которых нежелательно выполнять стандартным образом. Примерами могут служить события KeyDown, KeyPress и KeyUp. Эти события необходимо изменить, поскольку пользователи будут ожидать их отправки при нажатии клавиши в текстовом поле. В существующем состоянии события отправляются, только если сам элемент управления находится в фокусе и пользователь нажимает клавишу. Чтобы изменить это поведение, необходимо выполнить обработку событий, отправленных текстовым полем, и передать их пользователю. Добавьте события KeyDown, KeyUp и KeyPress для текстового поля и введите следующий код: private void txtLabelText KeyDown(object sender, KeyEventArgs e) OnKeyDown(e); private void txtLabelText KeyUp(object sender, KeyEventArgs e) OnKeyUp(e); rivate void txtLabelText KeyPress (object sender, KeyPressEventArgs e) OnKeyPress(e); Вызов метода ОпКеуХХХ влечет за собой вызов любых методов, подписанных на событие. Добавление нестандартного обработчика события При необходимости создания события, которое не существует ни в одном из базовых классов, придется проделать несколько больший объем работы. Создайте событие PositionChanged, которое будет происходить при изменении свойства Position. set { txtLabelText.Text = value;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |