Программирование >>  Программирование с использованием ajax 

1 ... 353 354 355 [ 356 ] 357 358 359 ... 396


В каждом из этих элементов задается имя, позиция и размеры объекта Button с помощью тех же самых свойств, что и в описанных выше элементах <Ellipse>. Еще в них используется свойство Content, отвечающее за то, что должно отображаться в виде содержимого кнопки, и в данном случае - строка текста. На кнопках, однако, можно отображать не только простой текст, при желании на них можно отображать и вложенные фигуры или другое графическое содержимое. Более подробно об этом будет рассказываться позже в этой главе, в разделе Стилизация элементов управления .

В атрибуте Click кнопки toggleButton определяется метод обработчика событий Click. Этот метод выглядит как toggleButtonClick () и фактически представляет собой обработчик маршрутизируемых событий (routed events). Маршрутизируемые события более подробно рассматриваются чуть позже в этой главе, в разделе Маршрутизируемые события . Пока достаточно знать только то, что такие события срабатывают при выполнении щелчка на кнопке и затем приводят к вызову соответствующего обработчика событий.

В коде обработчика событий первым делом получается ссылка на объект Storyboard, содержащий необходимый анимационный эффект. Ранее уже показывалось, что этот объект содержится в свойстве Resources объекта-контейнера Window и использует ключ Spin. Поэтому код, применяемый для его извлечения, не должен вызывать никаких вопросов:

private void toggleButton Click(object sender, RoutedEventArgs e) {

Storyboard spinStoryboard = Resources[ Spin ] as Storyboard;

После получения объекта Storyboard, если только предыдущий код не возвращает значение null, используется метод Storyboard. GetIsPaused () для определения того, находится анимационный эффект в текущий момент в приостановленном состоянии или нет. Если да, тогда вызывается метод Resume (), а если нет - метод Pause (). Эти методы, соответственно, либо возобновляют, либо приостанавливают воспроизведение анимационного эффекта:

if (spinStoryboard != null) {

f (spinStoryboard.GetlsPaused(this)) spinStoryboard.Resume(this); Ise

spinStoryboard.Pause(this);

Обратите внимание на то, что всем этим методам требуется ссылка на объект, в котором содержится объект Storyboard. Объясняется это тем, что объекты Storyboard сами за временем не следят. Вместо этого они используют часы того окна, в котором содержатся. Передача ссылки на это окно (с помощью this) как раз и позволяет им получать доступ к этим часам.

Две остальных кнопки - goButton и stopButton - ни с какими методами обработчика событий в файле отделенного кода не связаны. Вместо этого за их функционирование отвечают триггеры. В данном примере этих триггеров определяется целых три, как показано ниже:



<Window.Triggers> <EventTrigger RoutedEvent= FrameworkElement.Loaded > <BeginStoryboard Storyboard= {StaticResource Spin}

X:Name= Spin BeginStoryboard /> </EventTrigger>

<EventTrigger RoutedEvent= ButtonBase.Click SourceName= goButton > <ResumeStoryboard BeginstoryboardName= Spin BeginStoryboard /> </EventTrigger>

<EventTrigger RoutedEvent= ButtonBase.Click SourceName= stopButton > <PauseStoryboard BeginstoryboardName= Spin BeginStoryboard /> </EventTrigger> </Window.Triggers>

Первым идет триггер, который связывает событие FrameworkElement. Loaded (срабатывающее при загрузке приложения) с действием BeginStoryboard. Это действие запускает воспроизведение анимационного эффекта Spin. Обратите внимание, что для ссылки на анимационный эффект Spin используется синтаксис расширения разметки с кодом {StaticResource Spin}. Такой синтаксис очень часто применяется в WPF-приложениях для ссылки на ресурсы, содержащиеся внутри окна-контейнера. Действию BeginStoryboard присваивается имя Spin BeginStoryboard, которое применяется далее в виде ссылки на него в двух других триггерах. Эти триггеры связывают события Click кнопок goButton и stopButton, соответственно, с действиями ResumeStoryboard и PauseStoryboard, выполняющими именно те операции, на которые указывают их названия.

Этот код прекрасно работает в настольном приложении, но при преобразовании его в Web-приложение требует внесения нескольких изменений. На самом деле в примере некоторые из этих деталей были скрыты в результате создания нового WPF-приложения типа Browser (Браузер). Например, из-за существования ряда связанных с безопасностью ограничений при выполнении кода в браузере WPF-пpL7Ioжeниe типа Browser оснащается временным ключом, который можно использовать для подписания приложения. Подобное требуется при желании разрешить приложению выполнять такие действия, выполнение которых в браузерных приложениях в противном случае запрещено, как, например, получение доступа к локальной файловой системе.

Также не трудно было заметить, что корневой элемент настольного приложения <Window> в Web-приложении заменяется элементом <Раде>. Это связано с тем, что возможности, предоставляемые браузером, немного отличаются от возможностей, предоставляемых приложением-хостом, которое используется для запуска настольных приложений. Поэтому в WPF для представления этих разных хостов и применяются разные классы. Однако, как было видно в коде примера, для многих вещей в этих разных средах все равно допускается использовать идентичный код. Более подробно об этом будет рассказываться позже в этой главе.

На этом анализ данного примера приложения завершен. Здесь было охвачено много основных моментов и вкратце рассмотрено очень много новых концепций, поэтому, пожалуй, не помешает перед продолжением немного перевести дух . В остальной части настоящей главы будут более детально описаны показанные здесь приемы, требуемый синтаксис и некоторые другие вещи.

Основные понятия WPF

Надеемся, что примером, приведенным в первой части этой главы, нам удалось вызвать у вас интерес к программированию WPF-приложений. Несмотря на необходимость изучения множества новых понятий, этот пример показал, как создавать динамические приложения очень быстро, комбинируя код XAML и .NET, а также как при



желании оставлять разработку многих компонентов, вроде пользовательского интерфейса приложений, дизайнерам, которым не требуется обладать навыками программирования на С#. Еще пример проиллюстрировал то, как можно создавать настольные и Web-приложения с помощью (более или менее) одинакового кода.

Однако прежде чем начинать создавать WPF-приложения самостоятельно, необходимо потратить еще немного времени на изучение основ. В этом разделе освещено несколько тем, которые являются фундаментальными для WPF-приложений, и описан синтаксис, который необходим для их реализации. По ходу здесь также охватывается много дополнительных возможностей, изучить которые более детально можно будет в своих собственных приложениях.

В частности, в настоящем разделе рассматриваются следующие вопросы.

□ Синтаксис XAML.

□ Настольные и Web-приложения.

□ Объект Application.

□ Основные понятия, связанные с элементами управления - свойства зависимостей, подключаемые свойства, маршрутизируемые события и подключаемые события.

□ Компоновка и стилизации элементов управления.

□ Триггеры.

□ Анимация.

□ Статические и динамические ресурсы.

Синтаксис XAML

в примере в первой части этой главы было представлено много XAML-синтаксиса без всяких формальных объяснений. Описание многих правил и возможностей было опущено для того, чтобы сфокусировать внимание на структуре и функциональных возможностях в общем. В настоящем разделе синтаксис XAML будет рассмотрен немного более подробно, чтобы прояснить, каким образом собираются XAML-файлы.

Синтаксис объектных элементов

в базовой структуре XAML-файла используется синтаксис объектных элементов для описания иерархии объектов с одним корневым объектом, содержащим все остальные. С помощью такого синтаксиса, как становится понятно из его названия, описывается представляемый XML-элементом объект (или структура). Например, в предыдущем примере вы видели, как для представления объекта System. Windows. Controls. Button использовался элемент <Button>.

В корневом элементе XAML-файла всегда применяется синтаксис объектных элементов, хотя, как было видно в предыдущем примере, класс, используемый для корневого объекта, задается не с помощью имени элемента (<Window> или <Раде>), а с помощью атрибута х: Class. Такой синтаксис применяется только в корневом элементе. В случае настольных прможений, корневой элемент должен обязательно наследоваться от System.Windows .Window, а в случае Web-приложений - от System.Windows . Controls.Page.

Многие из объектов, которые определяются с помощью синтаксиса объектных элементов, на самом деле являются элементами управления, вроде Button, который использовался в предыдущем примере.



1 ... 353 354 355 [ 356 ] 357 358 359 ... 396

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика