Классы Windows Presentation Foundation -1 System.Object DispatcherOject Application DependencyObject Visual ContentElement UIElement FrameworkContentElement System.Object System.Windows.Threading.DispatcherObject System.Windows.DependencyObject System.Windows.Media.Visual System.Windows.UIElement System.Windows.FrameworkElement System.Windows.Controls.Control System.Windows.Controls.ItemsControl System.Windows.Controls.Primitives.Selector System.Windows.Controls.ComboBox System.Windows.Controls.ListBox System.Windows.Controls.TabControl FrameworkElement Control ItemsControl ContentControl Window ButtonBase Button CheckBox Selector ToggleButton RadioButton ListBox ListView ComboBox TreeView TabControl MenuBase Menu HeaderedItemsControl ContextMenu ToolBar Команды Одни и те же задания(tasks) могут инициироваться пользователем с помощью разных элементов пользовательского интерфейса - кнопкок, меню, контекстных меню, двойныx щелчков мыши и т.д. Чтобы избежать повторяющегося кода обработки событий, в WPF введено понятие команды (command) и имеются средства для • хранения и локализации текстовых заголовков команд; • cинхронизации состояния команды и элемента управления; • определения пользовательских команд. Модель маршрутизируемых команд(routed command ) WPF включает следующие основные компоненты: • Команда (command) – действие, которое должно быть выполнено. • Источник команды (command source ) – объект, вызывающий команду. • Целевые объекты команд (command target ) – объекты, на которых должна быть выполнена команда. • Привязка (command binding) команд. Команда представляет собой экземпляр класса RoutedCommand и не реализует логику команды. Логика команды присоединяется к команде с помощью объекта CommandBinding. Команды Библиотека WPF содержит более 100 предопределенных команд, которые находятся в 5 статических класcах: • ApplicationCommands • NavigationCommands • MediaCommands • EditingCommands • ComponentCommands. Все статические свойства классов имеют сигнатуру public static RoutedUICommand CommandName { get; } Cтатический класc ApplicationCommands содержит статические свойства: CancelPrint Delete Paste Save Close Find Print SaveAs ContextMenu Help PrintPreview SelectAll Copy New Properties Stop CorrectionList NotACommand Redo Undo Cut Open Replace Классы RoutedCommand и RoutedUICommand public RoutedCommand (); public RoutedCommand ( string name, Type ownerType ); public RoutedCommand ( string name, Type ownerType, InputGestureCollection inputGestures ); public bool CanExecute ( Object parameter, IInputElement target ); public void Execute ( Object parameter, IInputElement target ); public InputGestureCollection InputGestures { get; } public string Name { get; } System.Object public Type OwnerType { get; } public event EventHandler CanExecuteChanged; System.Windows.Input.RoutedCommand: ICommand System.Windows.Input.RoutedUICommand public RoutedUICommand (); public RoutedUICommand ( string text, string name, Type ownerType ); public RoutedUICommand ( string text, string name, Type ownerType, InputGestureCollection inputGestures ) ; public string Text { get; set; } Интерфейс ICommand public interface ICommand { bool CanExecute( Object parameter ); void Execute( Object parameter ); event EventHandler CanExecuteChanged; } Интерфейс IСommand реализуется классом RoutedCommand и наследуется классом RoutedUICommand. Это единственные классы WPF, реализующие интерфейс ICommand. Метод CanExecute() возвращает значение true, если команду можно выполнить для целевого объекта (command target). В методе Execute() выполняются действия, ассоциированные с командой. Через параметры методов CanExecute() и Execute() можно передать ссылку на данные (допускается значение null). Событие CanExecuteChanged происходит, когда менеджер команд диагностирует изменение в источнике команды, которое может привести к невозможности выполнения уже инициированной(raised) команды, но еще не выполненной. Обычно в ответ на это событие источник команды вызывает метод CanExecute(). Классы RoutedCommand и RoutedUICommand Методы Execute и CanExecute класса RoutedCommand не содержат логику приложения для команды. Методы только инициируют события для прохода по дереву элементов в поисках объектов CommandBinding. Логика команды находится в обработчиках событий, присоединенных к команде в объектах CommandBinding. Метод Execute инициирует события PreviewExecuted и Executed. Метод CanExecute инициирует события PreviewCanExecute и CanExecute. Класс CommandBinding Класс реализует привязку команды RoutedCommand к обработчикам, в которых реализована логика команды. Объект CommandBinding связывает команду с событиями PreviewExecuted/Executed и PreviewCanExecute/CanExecute. При вызове методов Execute() или CanExecute() из класса RoutedCommand в целевом объекте команды возникают события PreviewExecuted/Executed или PreviewCanExecute/CanExecute. Если целевой объект имеет CommandBinding для команды, вызываются подходящие обработчики, если в целевом объекте нет привязки для команды, событие передается по дереву элементов до тех пор, пока не будет найден элемент, который имеет подходящий CommandBinding. Конструкторы класса: public CommandBinding(); public CommandBinding( ICommand command ); public CommandBinding( ICommand command, ExecutedRoutedEventHandler executed ); public CommandBinding( ICommand command, ExecutedRoutedEventHandler executed, CanExecuteRoutedEventHandler canExecute ); public ICommand Command { get; set; } События класса CommandBinding Событие Тип события public event CanExecuteRoutedEventHandler CanExecute; Bubbling Возникает, когда команда, связанная с объектом commandBinding, инициирует проверку возможности выполнения команды на целевом объекте. public event ExecutedRoutedEventHandler Executed; Bubbling Возникает при выполнении команды, связанной с объектом commandBinding. public event CanExecuteRoutedEventHandler PreviewCanExecute; Tunneling Возникает, когда команда, связанная с объектом commandBinding, инициирует проверку возможности выполнения команды на целевом объекте. public event ExecutedRoutedEventHandler PreviewExecuted; Tunneling Возникает при выполнении команды, связанной с объектом commandBinding. ExecutedRoutedEventArgs и CanExecuteRoutedEventArgs System.Object System.EventArgs public RoutedEvent RoutedEvent { get; set; } public Object Source { get; set; } System.Windows.RoutedEventArgs public bool Handled { get; set; } public Object OriginalSource { get; } System.Windows.Input. System.Windows.Input. ExecutedRoutedEventArgs CanExecuteRoutedEventArgs public ICommand Command { get; } public bool CanExecute { get; set; } public Object Parameter { get; } public ICommand Command { get; } public bool ContinueRouting { get; set; } public Object Parameter { get; } Интерфейс ICommandSource public interface ICommandSource { ICommand Command { get; } Object CommandParameter { get; } IInputElement CommandTarget { get; } } Интерфейс ICommandSource реализуют наследники классов ButtonBase, MenuItem, ListBoxItem и HyperLink. Свойство CommandParameter возвращает ссылку на определенный пользователем объект с данными, который можно передать команде при ее выполнении. Свойство CommandTarget возвращает ссылку на объект, для которого выполняется команда. При использовании с RoutedCommand для целевого объекта возбуждаются события Executed и CanExecute. Если не установлено значение свойства CommandTarget как целевой трактуется элемент управления, имеющий фокус ввода с клавиатуры. Свойство CommandBinding класса UIElement Класс UIElement - базовый класс для элементов управления WPF – имеет свойство CommandBindings для доступа к коллекции объектов CommandBinding, описывающих команды. public CommandBindingCollection CommandBindings { get; } Класс CommandBindingCollection public sealed class CommandBindingCollection : IList, ICollection, IEnumerable содержит методы для работы с коллекцией команд для элемента управления, например, public int Add( CommandBinding commandBinding ); public void Remove( CommandBinding commandBinding ); Класс СommandManager Класс управляет моделью команд WPF и содержит методы для регистрации объектов CommandBinding, добавления и удаления обработчиков событий и сервисы для запроса состояния команды. Класс содержит метод для регистрации команды для класса (а не для экземпляра класса): public static void RegisterClassCommandBinding( Type type, CommandBinding commandBinding ); Класс содержит методы, которые можно использовать для добавления обработчиков, связанных с командой, к элементу управления: public static void AddExecutedHandler ( UIElement element, ExecutedRoutedEventHandler handler); public static void RemoveExecutedHandler ( UIElement element, ExecutedRoutedEventHandler handler ); public static void AddPreviewExecutedHandler ( UIElement element, ExecutedRoutedEventHandler handler ); public static void RemovePreviewExecutedHandler ( UIElement element, ExecutedRoutedEventHandler handler );