|
Программирование >> Программирование с использованием ajax
При реализации обработчика для маршрутизируемого события можно, при желании, устанавливать для свойства Handled объекта RoutedEventArgs значение true. В таком случае не будет происходить никакой дальнейшей обработки, т.е. для этого события больше не будут вызываться какие-либо обработчики событий. Еще RoutedEventArgs предоставляет свойство Source, которое позволяет узнавать, какой элемент управления изначально сгенерировал данное событие. Им будет тот элемент управления, в котором WPF впервые обнаружила это событие, т.е. в сценарии, показанном на рис. 34.9, им будет Rectangle. Это свойство может быть очень полезным, поскольку элементы управления способны определять, на каком из их дочерних элементов был выполнен щелчок (если он был выполнен). Обратите внимание на то, что данный процесс проверки попадания является довольно сложным. WPF, например, умеет игнорировать щелчки на прозрачных областях элементов управления без выполнения разработчиком каких-либо действий для включения такой функции. В качестве альтернативного варианта, разработчик может, наоборот, создавать такие прозрачные элементы управления, которые будут реагировать на щелчки кнопкой мыши, т.е. у разработчика имеется довольно приличная степень гибкости. Еще следует отметить, что маршрутизируемые события подходят не только для щелчков кнопкой мыши: они могут применяться для множества различных целей, например, для взаимодействия посредством клавиатуры, привязки данных, таймеров и т.д. Подключаемые события, о которых будет рассказываться позже в этой главе, делают маршрутизируемые события даже более полезными. В следующем практическом занятии реализуется описанная выше ситуация, а также демонстрируются некоторые дополнительные детали, касающиеся маршрутизируемых событий. Практическое занятив маршрутизируемыми СОбытИЯМИ 1. Создайте новое WPF-пpL7Ioжeниe по имени Ch34Ex02 и сохраните его в каталоге С:\BegVCSharp\Chapter34. 2. Измените код в его файле Windowl. xaml следующим образом: <Window xmlns= http: schemas.microsoft.com/winfx/2006/xaml/presentation xmlns:x= http: schemas.microsoft.com/winfx/2006/xaml x:Class= Ch34Ex02.Windowl Title= Routed Events Height= 400 Width= 800 MouseDown= Generic MouseDown PreviewMouseDown= Generic MouseDown MbuseUp= Window MouseUp > <Grid Name= contentGrid MouseDown= Generic MouseDown PreviewMouseDown= Generic MouseDown Bac]cground= Azure > <Rectangle Name= clickMeRectangle Margin= 10,10,0,0 Height= 23 HorizontalAlignment= Left VerticalAlignment= Top Width= 70 Strolce= Black MouseDown= Generic MouseDown PreviewMouseDown= Generic MouseDown Fill= CadetBlue /> <Button Name= clickMeButton Margin= 0,10,10,0 Height= 23 HorizontalAlignment= Right VerticalAlignment= Top Width= 70 MouseDown= Generic MouseDown PreviewMouseDown= Generic MouseDown Cliclc= clickMeButton Cliclc X:iiclc Me</Button> <TextBloclc Name= outputText Margin= 10,40,10,10 Baclcground= Cornsilk /> </Grid> </Window> 3. Измените код в файле Windowi. xaml. cs следующим образом (обратите внимание, что в зависимости о того, какая IDE-среда используется и как вводмся код XAML, пустые методы обработчиков событий могут быть добавлены автоматически): public partial class Windowi : Window { private void Generic MouseDown(object sender, MouseButtonEventArgs e) { outputText.Text = string.Format( {0}Event {1} raised by control {2}. e.Source={3}\n , outputText.Text, e.RoutedEvent.Name, sender.ToString(), ((FrameworkElement)e.Source).Name); private void Window MouseUp( obj ect sender, MouseButtonEventArgs e) { outputText.Text = string.Format( {0} \n\n , outputText.Text); private void clickMeButton Cliclc(object sender, RoutedEventArgs e) { outputText.Text = string.Format( {0}Button clicked!\n :==\n\n , outputText.Text); 4. Запустите приложение. Затем щелкните один раз на прямоугольнике в верхнем левом углу окна, один раз на светло-голубой области между прямоугольником и кнопкой и один раз на кнопке. На рис. 34.10 показан результат, который должен получиться. f RoiittdEvwm Event PrtvtMvMouMUotMn raiMd by coniiol Ch34&x03 Wmdowl t Sourc -ciickM R cUngl tv#fH PT v * vMouMOown шл9а b contro) $yi m Window! Con&oto Gnd t.Sourc*-c}KkM*RMn ngM Ev n< Pr vMwMouMDo vn гамм! by control Sytt*ni.W)n<}ow .sr) MS.Rtctanal t Sourc c)ickM RM:t iol Event MouMDown by conuoi Syi WT).Wlntowt.Sh p i.R*cl№gto. .Sourc -clicliMeR ctM)gt F nt MouMDown rMMd by control Syt4Mii.VVm<}owt.Conlrol .GrV]. .Soorc*-cl cliM Rectene*a Event MouteDown ralMd by control Ch34EK02.W1n<low1. Source-clKkMeRtcUngto Event PrwwwMoueeOown reiMO by control ChMExOa Windowi Sourc -com ntGnd Event Pr vi wMouirt>own rattwl by control Syitem Windowi Control* Grid t $ourc -cont itGrtd Ev*ni MouMDown ratMd by control Syattfn Windows Contioli Gnd a So4jrc*-contentGrKl Event MouMDown rMted by control ClLMExa2 Windowi a Source-conttnlGfid d by control СГ)34Ех02 Windowi SourcelirkMeButton d by control System Windowt Сonuoli Grid Source-cllcliMeBunon Bunon clKktd! leOown raiMd by control Syeltni.Wndow .Con(roi 3utton: CUck Ma. a.Source-cMcJiMieMnon Puc. 34.10. Приложение Ch34Ex02 в действии Описание полученных результатов Это приложение позволило продемонстрировать обработку маршрутизируемых событий на примере событий MouseDown и PreviewMouseDown, которые предоставляются всеми элементами управления WPF, а еще показать, что происходит при включении кнопки в цепочку событий. XAML-код, который мы использовали, уже выглядел очень просто, но чтобы проанализировать существенные части (в контексте данного примера), давайте рассмотрим следующий фрагмент кода: <Window x:Class= Ch34Ex02.Windowl MouseDown= Generic MouseDown PreviewMouseDown= Generic MouseDown MouseUp= Window MouseUp > <Grid Name= contentGrid MouseDown= Generic MouseDown PreviewMouseDown= Generic MouseDown > <Rectangle Name= clickMeRectangle MouseDown= Generic MouseDown PreviewMouseDown= Generic MouseDown /> <Button Name= clickMeButton MouseDown= Generic MouseDown PreviewMouseDown= Generic MouseDown Click= clickMeButton Click /> <TextBlock Name= outputText /> </Grid> </Window> Здесь все свойства, которые не отражаются на функциональных возможностях, были удалены, чтобы сфокусировать внимание лишь на том коде, который имеет отношение к обработке маршрутизируемых событий. Как видно, для событий было сконфигурировано три обработчика, описанные в табл. 34.1. Таблица 34.1. Используемые обработчики событий
Методы всех этих обработчиков событий просто выводят информацию в элементе управления TextBlock и тем самым позволяют видеть, что происходит. В выводимый текст входит имя события, имя элемента управления, который его сгенерировал, и имя исходного элемента управления, которым данное событие было сгенерировано впервые, в том виде, в каком оно было получено из RoutedEventArgs . Source. При запуске приложения первый щелчок на элементе управления Rectangle привел к выполнению такой последовательности событий, которая была описана перед практическим занятием. Во время ее выполнения обработчик событий GenericMouseDown () был вызван шесть раз: три раза для туннельных событий PreviewMouseDown и еще три раза для пузырьковых событий MouseDown. В роли источника событий во всех случаях выступил, как и следовало ожидать, тот элемент управления, который прошел проверку попадания, а таковым оказался Rectangle. clickMeRectangle . Обработчик событий Window MouseUp () тоже был вызван (после всех остальных обработчиков событий) и добавил текст для отделения данной проверки от следующей. Следующий щелчок был выполнен между элементами управления, т.е. фактически это был щелчок на фоновой области элемента управления Grid. На этот раз обработчик событий GenericMouseDown () был вызван четыре раза: два раза для туннельных событий PreviewMouseDown и два раза для пузырьковых событий MouseDown. Источником событий здесь во всех случаях выступил элемент управления Grid.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |