Le applicazioni che si sviluppano sono spesso simili tra loro nelle funzionalità base e presentano un menu, una toolbar, degli shortcut e ciò che accumuna questi elementi è di esporre la medesima logica, ma con modalità diversa.
Per esempio, la funzionalità di "apri" che permette di copiare il testo o l'oggetto corrente, è solitamente eseguibile attraverso la combinazione Ctrl-O, o un menu contestuale, il menu "File" ed eventualmente con un'icona nella toolbar. Per facilitare le implementazioni di queste logiche comuni, in WPF sono presenti alcune classi per l'implementazione di quello è comunemente identificato come Command pattern.
In pratica si ha un'istanza dell'interfaccia ICommand la quale rappresenta una funzionalità. Ad essa sono associati i metodi Execute e CanExecute e ogni qual volta che si vuole fare riferimento ad una certa funzionalità, si utilizza il medesimo comando. Dall'altra parte invece, ogni elemento che implementa ICommandSource (MenuItem, Button, CheckBox, RadioButton, InputBinding) accetta questo comando da eseguire per l'azione predefinita. Questo permette sia di implementare una sola volta la logica esecutiva per ogni elemento che usa il comando, sia la valutazione della possibilità di eseguire di un comando e di ottenere l'automatica gestione dello stato IsEnabled degli elementi.
L'esempio seguente mostra come creare una voce di menu per l'operazione di apertura:
<Menu DockPanel.Dock="Top"> <MenuItem Header="_File"> <MenuItem Header="_Open" Command="ApplicationCommands.Open" /> </MenuItem> </Menu>
L'oggetto ApplicationCommands, come MediaCommands, NavigationCommands, ComponentCommands e EditingCommands, contiene dei comandi preconfezionati per identificare certe funzionalità comuni è possibile creare dei comandi personalizzati implementando l'interfaccia ICommand.
A questo punto occore nell'elemento stesso o padre (in fase alla visibilità che si vuole dare), sfruttare la proprietà CommandBindings per indicare ad ogni rispettivo comando, quale funzione eseguire e quale chiamare per conoscere se è possibile eseguirla.
<Window.CommandBindings> <CommandBinding Command=ApplicationCommands.Open" CanExecute="Open_CanExecute" Executed="Open_Executed "/> </Window.CommandBindings>
I metodi OnOpenCanExecue e OpenExecute si trovano nel code-behind della finestra:
void Open_Executed(object sender, ExecutedRoutedEventArgs e) { // Apri file } void Open_CanExecute(object sender, CanExecuteRoutedEventArgs e) { // Il comando può essere sempre eseguito e.CanExecute = true; }
I comandi si possono inoltre associare a input quali la tastiera e il mouse, utilizzando la collezione InputBindings:
<Window.InputBindings> <KeyBinding Command="ApplicationCommands.Open" Key="O" Modifiers="Control" /> </Window.InputBindings>
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.