This article has been localized into Czech by the community.
Ovládací prvek WPF Menu
Jednou z nejběžnějších částí aplikace systému Windows je nabídka, někdy označovaná jako hlavní nabídka, protože v aplikaci obvykle existuje pouze jedna. Nabídka je praktická, protože nabízí mnoho možností, a zabere jen velmi málo místa, a to i přesto, že Microsoft prosazuje pás karet - ribbon jako náhradu za staré menu. Staré menu a panely nástrojů, mají určitě své stále místo v každé dobré vývojářské sadě nástrojů.
WPF přichází s pěkným ovládáním prvkem pro vytváření nabídek s názvem ... Menu. Přidávání položek do Menu je velmi jednoduché - stačí použít add MenuItem element. Každé MenuItem může obsahovat řadu dílčích položek, což vám umožní vytvářet hierarchické nabídky, jak je znáte z mnoha aplikací systému Windows. Vrhněme se přímo na příklad, kde používáme menu:
<Window x:Class="WpfTutorialSamples.Common_interface_controls.MenuSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MenuSample" Height="200" Width="200">
<DockPanel>
<Menu DockPanel.Dock="Top">
<MenuItem Header="_File">
<MenuItem Header="_New" />
<MenuItem Header="_Open" />
<MenuItem Header="_Save" />
<Separator />
<MenuItem Header="_Exit" />
</MenuItem>
</Menu>
<TextBox AcceptsReturn="True" />
</DockPanel>
</Window>
Stejně jako ve většině aplikací systému Windows, moje nabídka je umístěna v horní části okna, ale v souladu s obrovskou flexibilitou WPF, můžete ovládací prvek menu umístit kdekoli chcete, a podle libosti v libovolné šířce nebo výšce.
Definoval jsem jednu položku nejvyšší úrovně se 4 podřízenými položkami a oddělovačem. Použil jsem vlastnost Header pro definici popisku položky a měli byste si všimnout podtržítka před prvním znakem každého popisku. Říká to WPF aby použilo tento znak jako klávesu akcelerátoru, což znamená, že uživateli stačí stisknout klávesu Alt následovanou daným znakem, a aktivovat tak danou položku nabídky. Takto to funguje v celé hierarchii nabídky od položky nejvyšší úrovně až dolů. To znamená, že v tomto příkladu bych mohl stisknout Alt, pak F a pak N, pro aktivaci volby New .
Ikony a zaškrtávací pole
Dvěma běžnými funkcemi položky nabídky jsou ikona, která slouží ke snadnější identifikaci položky nabídky a to, co dělá, a schopnost zatrhnout přepínatelnou položky menu, jejichž funkci tak mohu zapínat a vypínat. WPF MenuItem podporuje obojí a je to velmi snadné použití:
<Window x:Class="WpfTutorialSamples.Common_interface_controls.MenuIconCheckableSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MenuIconCheckableSample" Height="150" Width="300">
<DockPanel>
<Menu DockPanel.Dock="Top">
<MenuItem Header="_File">
<MenuItem Header="_Exit" />
</MenuItem>
<MenuItem Header="_Tools">
<MenuItem Header="_Manage users">
<MenuItem.Icon>
<Image Source="/WpfTutorialSamples;component/Images/user.png" />
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="_Show groups" IsCheckable="True" IsChecked="True" />
</MenuItem>
</Menu>
<TextBox AcceptsReturn="True" />
</DockPanel>
</Window>
V tomto příkladu jsem vytvořil sekundární položku nejvyšší úrovně, kde jsem přidal dvě položky: Jednu s definovanou ikonou, pomocí vlastnosti Icon se standardním ovládacím prvkem Image uvnitř a jednu, kde používáme vlastnost IsCheckable, abychom uživateli umožnili aktivovat a zrušit zaškrtnutí položky. Navíc jsem použil vlastnost IsChecked , abych si tím zajistil její výchozí nastavení. V Code-behind, si mohu přečíst u stejné vlastnosti, zda je položka nabídky zaškrtnuta nebo ne.
Zpracování kliknutí
Když uživatel klikne na položku nabídky, obvykle bude chtít, aby se něco stalo. Nejjednodušší způsob je jednoduše přidat obslužnou rutinu události kliknutí do položky MenuItem, je tento:
<MenuItem Header="_New" Click="mnuNew_Click" />
V Code-behind pak budete muset implementovat mnuNew_Click metodu, jako je tato:
private void mnuNew_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("New");
}
Takto to bude stačit pro jednodušší aplikace, nebo při nějakém prototypování něčeho, ale jinak ve WPF použijeme příkaz - Command.
Klávesové zkratky a příkazy
Událost položky nabídky Click můžete zpracovat snadno tak, jak jsme to udělali výše, ale běžnější přístup je použití WPF příkazu. Existuje zde spousta teorie o používání a vytváření příkazů, takže mají svou vlastní kategorii článků o tomto problému, ale už teď, vám mohu říci, že mají při použití v WPF několik výhod, a to zejména v kombinaci s Menu nebo panelem nástrojů - Toolbar.
Za prvé, zajišťují, že můžete vyvolat stejnou akci na panelu nástrojů, v nabídce a dokonce i v kontextové nabídce, aniž byste museli implementovat stejný kód na více místech. Možnost reakce na klávesové zkratky je mnohem jednodušší, protože na rozdíl od WinForms, WPF neposlouchá klávesové zkratky automaticky, pokud je přiřadíte například do položky menu, ale budete to muset udělat ručně.
Avšak při použití příkazů Commands je pak WPF všechny poslouchá a reaguje na klávesové zkratky automaticky. Text (Záhlaví) položky nabídky je také nastaven automaticky (i když jej můžete v případě potřeby přepsat), a tak je tady InputGestureText, který uživateli řekne, která klávesová zkratka může být použita k vyvolání konkrétní položky nabídky. Přejděme rovnou na příklad kombinace Menu s příkazy WPF:
<Window x:Class="WpfTutorialSamples.Common_interface_controls.MenuWithCommandsSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MenuWithCommandsSample" Height="200" Width="300">
<Window.CommandBindings>
<CommandBinding Command="New" CanExecute="NewCommand_CanExecute" Executed="NewCommand_Executed" />
</Window.CommandBindings>
<DockPanel>
<Menu DockPanel.Dock="Top">
<MenuItem Header="_File">
<MenuItem Command="New" />
<Separator />
<MenuItem Header="_Exit" />
</MenuItem>
<MenuItem Header="_Edit">
<MenuItem Command="Cut" />
<MenuItem Command="Copy" />
<MenuItem Command="Paste" />
</MenuItem>
</Menu>
<TextBox AcceptsReturn="True" Name="txtEditor" />
</DockPanel>
</Window>
using System;
using System.Windows;
using System.Windows.Input;
namespace WpfTutorialSamples.Common_interface_controls
{
public partial class MenuWithCommandsSample : Window
{
public MenuWithCommandsSample()
{
InitializeComponent();
}
private void NewCommand_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
}
private void NewCommand_Executed(object sender, ExecutedRoutedEventArgs e)
{
txtEditor.Text = "";
}
}
}
Možná to na první pohled nevypadá úplně jasně, ale díky používání příkazů dostáváme spoustu věcí zdarma: Klávesové zkratky, text a na věci InputGestureText a WPF automaticky aktivuje/vypne věci, které záleží na aktivním ovládání a situaci. V tomto případě, kopírovat a vložit je vypnuto, protože není vybraný žádný text. Ale vložit je aktivované, protože moje mezipaměť není prázdná!
A protože WPF ví, jak zacházet s určitými příkazy v kombinaci s určitými ovládacími prvky, v tomto případě příkazy Cut/Copy/Paste a v kombinaci s ovládacím prvkem zadávání textu nemusíme ani zpracovávat jejich události Execute - pracují hned po vybalení z krabice! Pouze to musíme udělat pro příkaz New, protože WPF nemá žádný způsob, jak uhodnout, co chceme, aby dělal, když ho uživatel aktivuje. To se provádí pomocí CommandBindings Window, což je podrobně vysvětleno v kapitole o příkazech.
Shrnutí
Pracování s ovládáním WPF menu je jednoduché i rychlé, jednoduše vytvářet i komplexní hierarchie menu. A v kombinaci s WPF příkazy dostanete spoustu funkcí zdarma.