This article has been localized into Polish by the community.
Kontrolka WPF Menu
Jedną z najbardziej podstawowych części aplikacji systemu Windows jest menu, czasami określane jako menu główne, ponieważ zwykle w aplikacji jest one tylko jedno. Menu jest praktyczne, ponieważ oferuje wiele opcji, zajmując bardzo mało miejsca, i chociaż Microsoft naciska na używanie Wstążki jako zamiennika dobrego, starego menu i pasków narzędzi, z pewnością nadal mają one swoje miejsce w zestawie narzędzi każdego dobrego programisty.
WPF zapewnia dobrą kontrolę tworzenia menu o nazwie... Menu. Dodawanie elementów do menu jest bardzo proste - wystarczy dodać element MenuItem, a każdy MenuItem może posiadać szereg pod-elementów, umożliwiając w ten sposób tworzenie hierarchicznego menu znanego z wielu aplikacji systemu Windows. Przejdźmy od razu do przykładu, w którym skorzystamy z 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>
Podobnie jak w większości aplikacji systemu Windows, moje menu umieszczone jest w górnej części okna, ale dzięki ogromnej elastyczności WPF, możesz umieścić kontrolkę Menu gdziekolwiek chcesz, i o dowolnej szerokości czy wysokości.
Zdefiniowałem jeden element najwyższego poziomu z 4 elementami potomnymi i separatorem. Korzystam z właściwości Header, aby zdefiniować etykietę elementu, i powinieneś zauważyć podkreślenie przed pierwszym znakiem każdej z etykiet. Mówi to WPF aby użyć tego znaku jako akceleratora, co znaczy że użytkownik może nacisnąć klawisz Alt, a następnie dany znak, aby aktywować pozycję menu. Działa to od elementu najwyższego poziomu w dół hierarchii, co oznacza w tym konkretnym przykładzie, że mógłbym nacisnąć Alt, następnie F, a następnie N, aby aktywować element New.
Ikony i pola wyboru
Dwie typowe właściwości elementu menu to ikona, używana do znacznie łatwiejszej identyfikacji elementu menu i jego funkcjonalności, a także możliwość posiadania wybieralnych elementów menu, które mogą włączyć lub wyłączyć określoną właściwość. WPF MenuItem obsługuje je obie i w bardzo prosty sposób umożliwia ich użycie:
<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>
W tym przykładzie utworzyłem drugi element najwyższego poziomu, do którego dodałem dwa elementy: jeden ze zdefiniowaną ikoną, używając właściwości Icon ze standardową kontrolką Image wewnątrz niego, a drugi, w którym używamy właściwości IsCheckable aby zezwolić użytkownikowi na zaznaczenie i odznaczenie elementu. Użyłem nawet właściwości IsChecked, aby był domyślnie zaznaczony. Od strony code-behind jest to ta sama właściwość, którą możesz sprawdzić, aby dowiedzieć się, czy dany element menu jest zaznaczony, czy nie.
Obsługa kliknięć
Gdy użytkownik kliknie element menu, zwykle chcesz, aby coś się wydarzyło. Najłatwiej jest po prostu dodać do MenuItem obsługę zdarzenia jakim jest kliknięcie, w następujący sposób:
<MenuItem Header="_New" Click="mnuNew_Click" />
W warstwie kodu będziesz musiał zaimplementować metodę mnuNew_Click, w następujący sposób:
private void mnuNew_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("New");
}
Takie podejście jest wystarczające do prostszych aplikacji lub do prototypownia czegoś, natomiast sposób oczekiwany w WPF polega na użyciu Polecenia.
Skróty klawiszowe oraz Polecenia
Możesz łatwo obsłużyć zdarzenie Click elementu menu, tak jak to zrobiliśmy powyżej, ale bardziej powszechnym podejściem jest użycie poleceń WPF. Istnieje wiele teorii na temat używania i tworzenia poleceń, więc mają tutaj na stronie własną kategorię artykułów, ale na razie mogę powiedzieć, że mają kilka zalet, gdy są używane w WPF, szczególnie w połączeniu z menu lub paskiem narzędzi.
Przede wszystkim zapewniają, że możesz mieć tę samą akcję na pasku narzędzi, menu, a nawet w menu kontekstowym, bez konieczności implementowania tego samego kodu w wielu miejscach. Ułatwiają one także obsługę skrótów klawiszowych, ponieważ w przeciwieństwie do WinForm, WPF nie nasłuchuje automatycznie skrótów klawiszowych, jeśli przypiszesz je np. do element menu - musisz zrobić to ręcznie.
Jednakże podczas korzystania z poleceń, WPF automatycznie zareaguje na skróty klawiszowe. Tekst (Header) elementu menu jest również ustawiany automatycznie (chociaż można go nadpisać w razie potrzeby), podobnie jak InputGestureText, który pokazuje użytkownikowi, którego skrótu klawiszowego można użyć do wywołania określonego elementu menu. Przejdźmy od razu do przykładu łączenia Menu z poleceniami 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że to nie być całkowicie oczywiste, ale za pomocą poleceń otrzymaliśmy całą masę rzeczy za darmo: skróty klawiaturowe, tekst i InputGestureText na elementach, a WPF automatycznie włącza/wyłącza zezwolenie na użycie elementów w zależności od aktywnej kontrolki i jej stanu. W takim przypadku nie ma zezwolenia na użycie Wytnij i Kopiuj, ponieważ nie zaznaczono żadnego tekstu, ale opcji Wklej można skorzystać, ponieważ mój schowek nie jest pusty!
A ponieważ WPF wie, jak obsługiwać niektóre polecenia w połączeniu z niektórymi kontrolkami, w tym przypadku polecenia Wytnij/Kopiuj/Wklej w połączeniu z kontrolką wprowadzania tekstu, nie musimy nawet obsługiwać ich zdarzeń Execute - od razu są gotowe do użycia! Musimy sobie natomiast z tym poradzić w przypadku polecenia New, ponieważ WPF nie ma możliwości odgadnięcia, co chcemy zrobić, gdy użytkownik go aktywuje. Odbywa się to przy pomocy poleceń w oknie aplikacji CommandBindings, szczegółowo wyjaśnionych w rozdziale dotyczącym Poleceń WPF.
Podsumowanie
Praca z kontrolką WPF Menu jest zarówno łatwa, jak i szybka, dzięki czemu można prosto tworzyć nawet złożone, hierarchiczne menu, a łącząc ją z Poleceniami WPF, zyskujesz masę funkcjonalności za darmo.