Každá aplikace obsahuje menu ať už to menu většinou úplně nahoře, nebo kontextové menu, které je svázáno s konkrétním prvkem. Nejdříve se podíváme na základní menu. To obsahuje položy typu MenuItem, které nabízí následující vlastnosti
V následující ukázce si ukážeme, jak lze použít menu. U nastavení ikony se setkáme se zápisem pack://application… , ale toho si zatím nevšímejme, budeme se tomu věnovat později.
XAML
<Window x:Class="ItemsControlsEnd.MenuWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MenuWindow" Height="300" Width="300">
<DockPanel>
<Menu DockPanel.Dock="Top">
<MenuItem Header="_File">
<MenuItem Header="_New..." IsEnabled="False"/>
<MenuItem Header="_Open..." IsCheckable="True"/>
</MenuItem>
<MenuItem Header="_Edit">
<MenuItem Command="ApplicationCommands.Copy">
<MenuItem.Icon>
<Image Source="pack://application:,,,/Images/copy.ico"/>
</MenuItem.Icon>
</MenuItem>
<MenuItem Command="ApplicationCommands.Cut"/>
<MenuItem Command="ApplicationCommands.Paste"/>
</MenuItem>
</Menu>
</DockPanel>
</Window>
Poznámka: Pokud nastavíme Command u objektu MenuItem, automaticky se do vlastnosti Header nastaví název commandu např. při použití ApplicationCommands.Copy bude vlastnost Header nastavená na Copy
Kromě klasického menu budeme hojně využívat i kontextové menu. Kontextové menu se vytváří velice jednoduše.Nejdříve do hlavního elementu např.RichTextBox přidáme element ContextMenu do kterého pak vložíme jednotlivé elementy MenuItem stejně jako do klasického Menu:
XAML
<RichTextBox x:Name="ui_txt">
<RichTextBox.ContextMenu>
<ContextMenu>
<MenuItem Command="ApplicationCommands.Copy">
<MenuItem.Icon>
<Image Source="pack://application:,,,/Images/copy.ico"/>
</MenuItem.Icon>
</MenuItem>
<MenuItem Command="ApplicationCommands.Cut"/>
<MenuItem Command="ApplicationCommands.Paste"/>
</ContextMenu>
</RichTextBox.ContextMenu>
</RichTextBox>
Jedná se o kontejner, který umí hostovat objekty typu button, checkbox, radiobutton, atd. a může nám být velice nápomocný při tvorbě standardního menu. Toolbar můžeme vložit kdekoliv, ale nejčastěji se vkládá do objektu typou ToolbarTray. Než si ukážeme ukázku použití Toolbaru podíváme se na jednu zajímavou vlastnost:
OverflowMode
XAML
<Window x:Class="ItemsControlsEnd.ToolBarWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="ToolBarWindow" Height="300" Width="300">
<DockPanel>
<ToolBar DockPanel.Dock="Top">
<TextBox Width="100"/>
<Button ToolBar.OverflowMode="Always">
<Image Source="pack://application:,,,/Images/copy.ico" Width="16" Height="16"/>
</Button>
<Separator/>
<ToggleButton>
<Image Source="pack://application:,,,/Images/left.png" Width="16" Height="16"/>
</ToggleButton>
<ToggleButton>
<Image Source="pack://application:,,,/Images/center.png" Width="16" Height="16"/>
</ToggleButton>
<ToggleButton ToolBar.OverflowMode="Never">
<Image Source="pack://application:,,,/Images/right.png" Width="16" Height="16"/>
</ToggleButton>
</ToolBar>
<RichTextBox x:Name="txt"/>
</DockPanel>
</Window>
Jakmile spustíme aplikaci, tak při zmenšení šířky okna uvidíme, že pravá ikonka right.png zůstane pořád vidět (OverflowMenu.Never), ale ostatní se vloží do „overflow menu“ pokud bude velikost okna menší než velikost toolbaru. Dále můžeme vidět jak funguje vlastnost OverflowMode.Always, protože hned po startu aplikace je ikonka pro kopírování zobrazena v „overflow menu“.
Jedná se o kontejner do kterého lze vkládat objekty typu Toolbar. Pojďme se podívat na některé vlastnosti:
Ukázka pomocí kódu
public class ToolbarTrayWindow : Window
{
public ToolbarTrayWindow()
{
StackPanel stackPanel = new StackPanel();
Content = stackPanel;
// vytvorim objekt toolbartray
ToolBarTray toolBarTray = new ToolBarTray();
// nastavim orientaci
toolBarTray.Orientation = Orientation.Horizontal;
// pokud je IsLocked true, nelze premistovat jedntlive toolbary
toolBarTray.IsLocked = false;
// vytvorim si toolbar a vlozim ho do kolekce Toolbars
toolBarTray.ToolBars.Add(CreateToolbar());
toolBarTray.ToolBars.Add(CreateToolbar());
// nakonec vlozim ToolbarTray do stack panelu
stackPanel.Children.Add(toolBarTray);
}
public static ToolBar CreateToolbar()
{
ToolBar toolBar = new ToolBar();
// vlozim textbox
TextBox txt = new TextBox();
txt.Width = 100;
toolBar.Items.Add(txt);
// vlozim tlacitko
Button btnCopy = new Button();
Image img = new Image();
img.Source = new BitmapImage(new Uri("pack://application:,,,/Images/copy.ico"));
img.Width = 16;
img.Height = 16;
btnCopy.Content = img;
btnCopy.SetValue(ToolBar.OverflowModeProperty, OverflowMode.Always);
toolBar.Items.Add(btnCopy);
// oddelovac
Separator spr = new Separator();
toolBar.Items.Add(spr);
// a dalsi 3 tlacitka
string[] str = { "left", "center", "right" };
for ( int i = 0; i < 3; i++ )
{
ToggleButton btn = new ToggleButton();
// jako obsah tlacitka nastavim konkretni ikonku
Image image = new Image();
image.Source = new BitmapImage(new Uri(string.Format("pack://application:,,,/Images/{0}.png", str[i])));
image.Width = 16;
image.Height = 16;
btn.Content = image;
if ( i == 2 )
btn.SetValue(ToolBar.OverflowModeProperty, OverflowMode.Never);
// vlozim do toolbaru
toolBar.Items.Add(btn);
}
return toolBar;
}
}
StatusBar je velice podobný ToolBaru, akorát se většinou používá spíše pro zobrazování nějakých informací, např. u wordu se jedná o spodní řádek, na kterém jsou informace typu, stránka 1 z 1, slova: 433, čeština, atd.
XAML
<Window x:Class="ItemsControlsEnd.StatusBarWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="StatusBarWindow" Height="300" Width="300">
<DockPanel>
<StatusBar DockPanel.Dock="Bottom">
<Label>Stranka 1 z 1</Label>
<Separator/>
<Label>Slova: 400</Label>
</StatusBar>
<RichTextBox x:Name="txt"/>
</DockPanel>
</Window>
Dnešní díl byl posledním z oblasti Items Controls. Postupně jsme se seznámili s následujícími elementy:
Věřím, že už máte jasno kdy a jak který element využít
Působí jako Microsoft Student Partner na VŠB-TU Ostrava a zároveň pracuje jako software developer.
Mezi jeho portfolio patří platforma Microsoft .NET především WPF, WCF, Silverlight, ASP.NET MVC, ale i oblast týmového vývoje a Design Patterns.
Rovněž publikuje na MSTV.cz a je držitelem ocenění Microsoft Most Valuable Professional (MVP)
Máte-li zájem o školení, konzultaci či zakázkový vývoj pak mě neváhejte kontaktovat!
email: me(at)lukaskubis.net
web: http://web.lukaskubis.net
blog: http://lukaskubis.net