This article has been localized into Turkish by the community.
WPF Menu Kontrol
Bir Windows uygulamasının en genel elemanı menüdür, bazen uygulamadaki yegane olduğu için ana menü de denir. Menü bir çok seçeneği size çok küçük bir alanda sunduğu için kullanışlıdır, ve hatta Microsoft yeni uygulamalarda Ribbon denilen bir değişik uygulamasını da eski menü ve toolbar'lara alternatif olarak sunuyor.
WPF menüleri oluşturmak için Menu adı verilen güzel bir kontrolle geliyor. Ona elemanları eklemek oldukça kolay - basitçe menüye MenuItem elemanları eklersiniz ve altına çeşitli alt elemanlar koyarak bir çok Windows uygulamasından tanıdığınız hiyerarşik menüleri yapabilirsiniz. Hadi direk olarak bir Menu kullandığımız uygulama örneğine dalalım :
<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>
Bir çok Windows uygulamasında olduğu gibi benim menüm de pencerenin üst kenarında yerleştirilmiş, ama WPF'in muazzam esnekliği ile Menu kontrolünü nereye isterseniz ve arzu ettiğiniz genişlik ve yükseklikle yerleştirebilirsiniz.
İçinde 4 tane alt eleman ve bir ayırıcı bulunan tek bir üst eleman tanımladım. Menü etiket yazıları için Header özelliğini kullandım, ve dikkat ederseniz her etiketin başında alt çizgi karakteri var. Bu çizgi WPF'e erişim tuşunu belirtir, yani kullanıcı Alt tuşu ile beraber belirtilen karaktere basınca menü eylemi gerçekleşir. Bu yukarıdan aşağıya her menü elemanı için geçerli , yani örneğin kullanıcı Alt, ve sonra F ve sonra N basarak New elemanını aktif eder.
İkonlar ve CheckBox'lar
Bir menü elemanının çok kullanılan iki özelliği menünün ne iş yaptığını daha iyi anlatmak için bir ikon resmi ve kullanıcının seçenek belirtebileceği aktif-pasif edilebilen menü elemanıdır. WPF MenuItem her ikisini de destekler ve kullanması çok kolaydır :
<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>
Bu örnek için ikinci bir üst seviye menü elemanı ekledim, altına da iki eleman ekledim : Birnde tanımlanmış bir ikon resmi var, Icon bağlı özelliği ve içinde standart bir Image kontrolü ile tanımladım. İkincide kullanıcının seçim yapabilmesine IsCheckable özelliği ile imkan verdim, böylece kullanıcı bir özelliği açıp kapatabilir. Ayrıca IsChecked özelliğini de kullanarak seçeneğin uygulama başladığında seçili olmasını sağladım. Arkaplan kodunda yine bu özelliği kullanarak kullanıcının tercihini görebilirsiniz.
Menü tıklamalarını işlemek
Kullanıcı bir menüye tıkladığında doğaldır ki bir şeyler olmasını istersiniz. Bunun en kolay yolu MenuItem kontrolüne aşağıdaki gibi bir Click olayı eklemektir :
<MenuItem Header="_New" Click="mnuNew_Click" />
Sonrasında arkaplan kodunda mnuNew_Click metodunu şöyle tanımlarsınız :
private void mnuNew_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("New");
}
Bu yöntem küçük uygulamalarda ya da bir prototip yazarken kullanışıl olur ama bu işin WPF yolu bu işe bir Command kullanmaktır.
Tuş takımı kısayolları ve WPF komutları
Bir menü elemanının tıklanmasını yukarıdaki yaptığımız gibi kolayca yapabilirsiniz, fakat genel eğilim burada WPF komutları kullanmaktır. WPF komutlarının tanımlanması ve kullanması üzerine bir çok teori var, bu yüzden bu öğreticide ayrıca bir başlığı bile yazıldı. Ama burada size şunu söyleyebilirim WPF komutlarını özellikle Menüler ve Toolbarlar ile kullanmanın bir çift avantajını anlatabilirim.
Her şeyden önce bir menü vaya bir içerik menüsünde olan aynı işlemin bir toolbar menü elemanında da çalışmasını her birine aynı kodu farklı yerlerde tanımlamadan yapmak isteyebilirsiniz. Ayrıca bir kısayol tuşunun da aynı işi yapmasını isteyebilirsiniz çünkü WPF WinForms'da olduğu gibi menüye bir özellik değeri vererek tuşları takip etmez - bunu ayrıca belirtmek zorundasınız.
Bununla beraber komutları kullanarak WPF kısayol tuşlarını otomatik olarak dinler ve cevap verir. Menü elemanının yazısı (Header) da otomatik oluşturulur (isterseniz tabi ki üzerine başka değer yazabilrsiniz), ve InputGestureText özelliği kullanıcıya o menü elemanının hangi kısayol tuşu ile çalışacağını gösterir. Hadi direk WPF komutları kullanan bir Menu uygulamasına dalalım :
<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 = "";
}
}
}
Çok açık görünmüyor ama WPF komutları kullandığımız için bir kısım avantajları bedava kazanıyoruz : Tuş takımı kısayolları, etiket yazısı ve elemanlarda InputGestureText özelliği ve ayrıca WPF duruma bağlı olarak menü elemanının otomatik olarak aktif/pasif eder. Bu resimde görünen Cut ve Copy pasifler çünkü seçili bir metin yok ama Paste aktif çünkü clipboard'ımda kopyalanmış bir şeyler var!
Ve WPF belli kontroller üzerinde belli komutları nasıl işleyeceğini çok iyi bildiği için TextBox kontrolü içinde Cut/Copy/Paste komutlarını nasıl işleyeceğini bilir ve biz bu olayları işleme kodları yazmak zorunda değiliz - bunlar tamamen hazır pakette geldiği gibi çalışır! Tabi ki New komutunda WPF onu aktif ettiğimizde ne yapacağını bilmediği için ayrıca metodları tanımladık. Bunu Window kontrolü bağlı özelliği CommandBindings ile belirtiyoruz, tüm detay WPF Komutları başlığı altında anlatılmıştır.
Sonuç
WPF Menu kontrolü il çalışmak hem kolay hem çabuk, karmaşık menü hiyerarşileri oluşturmak, ve çok sayıda avantajı bedavaya kazandıran WPF komutları ile çalışarak.