Команды

advertisement
Классы 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 );
Download