110 likes | 270 Views
Классы Windows Presentation Foundation - 1.
E N D
Классы Windows Presentation Foundation - 1 System.Object System.Windows.Threading.DispatcherObjectSystem.Windows.DependencyObjectSystem.Windows.Media.VisualSystem.Windows.UIElement System.Windows.FrameworkElement System.Windows.Controls.Control System.Windows.Controls.ItemsControlSystem.Windows.Controls.Primitives.Selector System.Windows.Controls.ComboBox System.Windows.Controls.ListBox System.Windows.Controls.TabControl
Маршрутизация событий • Механизм обработки событий WPF базируется на событиях .NET. • Новая концепция - маршрутизация событий ( event routing) – события могут подниматься или спускаться по дереву элементов и вызывать обработчики нескольких слушателей (listeners). • Три вида событий: • С точки зрения реализации маршрутизируемое событие - это событие, которое связано с экземпляром класса RoutedEvent, и обрабатывается системой управления событиями WPF (WPF event system).
Класс RoutedEvent • В классе определены четыре свойства и один метод. • Все свойства доступны только для чтения, свои значения они получают при регистрации события с помощью метода RegisterRoutedEvent класса EventManager.Свойства не могут иметь значение null.
Класс EventManager • Статический класс EventManagerрегистрирует маршрутизируемые события (routed event) и добавляет обработчики класса ( class handlers) – обработчик, который вызывается до вызова обработчиков, связанных с отдельными экземплярами(объектами) класса. • В классе всего 4 статических метода.
Метод RegisterRoutedEventкласса EventManager public static RoutedEvent RegisterRoutedEvent ( string name, RoutingStrategy routingStrategy, Type handlerType, Type ownerType ); • Метод RegisterRoutedEvent регистрирует новое маршрутизируемое событие в системе управления событиями WPF.
Пример регистрации маршрутизируемого события • Маршрутизируемое событие (routed event) • определяется как статическое поле, доступное только для чтения; • регистрируется в статическом конструкторе; • упаковывается как обычное событие .NET. • Событие инициируется при вызове метода RaiseEvent из любого класса, производного от FrameworkUIElement. public class MyButtonSimple: Button {public static readonly RoutedEventTapEvent = EventManager.RegisterRoutedEvent( "Tap", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyButtonSimple)); public event RoutedEventHandler Tap { add { AddHandler(TapEvent, value); } remove { RemoveHandler(TapEvent, value); } void RaiseTapEvent() { RoutedEventArgs newEventArgs = new RoutedEventArgs(MyButtonSimple.TapEvent); RaiseEvent(newEventArgs); } protected override void OnClick() { RaiseTapEvent(); } }
Класс RoutedEventArgs • Конструкторы класса RoutedEventArgs:
Свойства класса RoutedEventArgs • Свойства класса RoutedEventArgsдоступны в обработчиках маршрутизируемых событий.
Обработчик классадля маршрутизируемых событий • Для маршрутизируемых событий можно определить обработчик класса – статический обработчик, общий для всех экземпляров класса. • Обработчики класса вызываются до экземплярныхобработчиков. • Обработчик класса может установить для события состояние обработанного – присвоить значение true свойству Handled. В этом случае экземплярные объекты вызываться не будут, за исключением тех, которые были зарегистрированы со значением true параметра handledEventsToo. • Многие базовые элементы WPF имеют виртуальные обработчики класса. Это дает возможность определить свои версии обработчиков класса без использования вызова метода RegisterClassHandler из статического конструктора класса. В WPF API эти методы определены для событий ввода, их имена начинаются с "On" и включают имя события, например, .
События времени существования объекта • Все объекты классов, производных от FrameworkElementили FrameworkContentElement,имеют три события времени жизни.
Элементы-контейнеры • Класс Window в WPF является производным от классаContentControl, разрешающего разместить в окне только один дочерний элемент. • Чтобы разместить в окне несколько дочерних элементов управления, их необходимо поместить в один из контейнеров, которые могут быть вложены друг в друга. • Классы-контейнеры элементов управления являются производными от класса Panel. public abstract class Panel : FrameworkElement, IAddChild {…} public interface IAddChild { void AddChild( Object value ); void AddText( string text ); } public UIElementCollection Children { get; }