TOC

This article has been localized into Czech by the community.

Příkazy:

Úvod do WPF Příkazů

V minulé kapitole jsme probíraly, jak reagovat na události, například když uživatel stiskne tlačítko nebo položku v menu. V moderním uživatelském rozhraní se však často stává, že je nějaká funkcionalita dostupná z několika míst, vyvolatelná několika různými akcemi.

Na příklad, představme si typické rozhraní, kde je hlavní nabídka a několik nástrojových lišt. Akce jako Otevřít soubor nebo Vytvořit nový jsou umístěny v nabídce, jako tlačítka na liště, v kontextové nabídce (vyvolané stisknutím pravého tlačítka myši) a je možné je vyvolat klávesovými zkratkami, kupříkladu Ctrl + N či Ctrl + O.

Každá z těchto uživatelských akcí má typicky vykonat jeden a ten samý kód. Ve WinForms by bylo třeba pro každou akci vytvořit samostatnou událost, které by pak volaly společnou metodu s výkonným kódem. V situaci nastíněné výše by to znamenalo vytvořit nejméně tři události pro ovládací prvky a zajistit nějakou obsluhu klávesových zkratek. Nic moc.

Příkazy

U WPF se to Microsoft snaží řešit pomocí tzv. příkazů (commands). To umožňuje zadefinovat výkonný kód na jednom místě, a pak se na něj jednoduše odkázat z každé kontrolky, jako nabídky, tlačítka na lištách atd. WPF také naslouchá na klávesnici, a po stisku příslušné klávesové zkratky pak příkaz automaticky vyvolá. To je ideální způsob, jak uživatelům umožnit použití klávesových zkratek ve vaší aplikaci,

Příkazy vyřeší i další problém, který vzniká, když má jedna akce více vstupních kontrolek. Ve WinForms je pro každou z nich potřeba napsat obslužný kód, aby "zašedla" a nešla stisknout (tomu se říká zakázat), když daná akce nemá být dostupná. Například - máme-li v aplikaci dostupný příkaz "vyjmout", který má být dostupný jen, když uživatel označí nějaký text, bylo třeba zakazovat a povolovat zvlášť tlačítko v hlavní nabídce, v menu a v kontextové nabídce pokaždé, když uživatel změní výběr textu.

S WPF příkazy je toto centralizované. Máme jednu metodu pro zjištění, zdali je příkaz dostupný či nikoliv, a na základě ní pak WPF automaticky zakazuje a povoluje všechny potřebné kontrolky. Díky tomu je vytvoření dynamické a responzivní aplikace o mnoho snazší!

Příkazový binding

Příkazy samy od sebe nic nedělají. Jejich základem je rozhraní ICommand, které deklaruje jednu událost a dvě metody: Execute() a CanExecute(). První z nich obsahuje výkonný kód, který provádí akci příkazu (například zmiňované načtení souboru), zatímco druhá slouží k zjištění, zdali je akce dostupná, či ne. Aby některá kontrolka vyvolávala daný příkaz, je třeba je svázat (zbindovat), a na to slouží příkazový binding - vlastnost CommandBinding.

CommandBinding je obvykle definovaný v okně (Window) nebo ve vlastní kontrolce (UserControl), a je v něm zapsána reference na příkaz, který obsluhuje, spolu s referencí na obslužné metody Execute() a CanExecute().

Předdefinované příkazy

Je samozřejmě možné si naimplementovat vlastní příkazy, na což se i v jedné z následujících kapitol podíváme, ale WPF obsahuje více, než 100 předpřipravených příkazů, které je možné v aplikaci využít. Ty se dělí do pěti skupin - ApplicationCommands, NavigationCommands, MediaCommands, EditingCommands a ComponentCommands, tudíž příkazy Aplikační, Navigační, Médiové, příkazy pro Úpravu a Komponentové. Zejména ApplicationCommands jsou velmi užitečné, protože obsahují řadu velice běžných příkazů, jako Nový, Otevřít, Uložit, Vyjmout, Kopírovat a Vložit.

Shrnutí

Příkazy vám pomohou s vykonáváním běžných akcí, vyvolávaných z několika různých míst. Pro akci stačí napsat jedinou obslužnou metodu a případně metodu pro rozhodnutí, zdali je akce dostupná, na jejímž základě vyvolávací prvky automaticky zašednou či se vysvítí. Koncept jsme si vysvětlili teoreticky, ovšem v následujících kapitolách si jej projdeme prakticky, podíváme se, jak příkazy použít a jak si zadefinovat své vlastní.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!