Ana içeriğe atla

WPF - ContextMenu Kontrolü

Windows Presentation Foundation ile uygulama geliştirirken kullanabileceğimiz kontrol paleti işlerimizi rahatlıkla yürütebileceğimiz kadar geniştir. Araç kutusu içerisinde yer alan kontroller Framework sürümünü arttırdıkça ve codeplex, code.msdn gibi sitelerde yer alan projeler yardımı ile daha da artmaya devam etmektedir. WPF 'in grafiksel ve görsel gücüne günlük yaşantı da kullanılan kontrollerin de kullanılabilir olması sayesinde en basit uygulamalardan en karmaşık uygulamalara kadar geliştirilebilme olanağı tanınıyor.

Bu yazımızda WPF kontrollerinden ContextMenu kontrolünü nasıl kullanabileceğimizi açılmaya çalışıyoruz.

WPF - ContextMenu Control

Context Menu kontrolü yardımı ile kontrollerin üzerinde sağ tıklama yaptığımızda karşımıza çıkacak olan menüyü sağlamaktadır. Peki bu işlemi yaparken neler yapabiliriz. İlk olarak aklımıza kopyala, yapıştır ve kes işlemlerini yapabilmek gelmektedir. Onun dışında seçilen parametreye göre internet penceresinde arama yapmak gibi işlemleri belirtebilmemiz mümkündür. Ayrıca ContextMenu kontrolünü eklemiş olduğumuz herhangi bir kontrole özellik olarak eklenebilinmeside mümkündür. Zaten en sık olarak kullanılan yöntemde bu şekildedir.

Kullanım şekline değinmek gerekirse, kontrollerin alt özellikleri olarak ContextMenu oluşturuluyor. Sonrasında ise, MenuItem ile menü içerisinde gözükecek olan ikonları ve içerikleri belirlememiz yeterli olacaktır. Örnek üzerinde kullanmak gerekirse, yapmamız gereken aşağıdaki gibi olacaktır.

ContextMenu.xaml
<RichTextBox>
    <RichTextBox.ContextMenu>
        <ContextMenu>
            <MenuItem Command="Cut" Header="Kes">
                <MenuItem.Icon>
                   <Image Source="Images/cut.png" />
                </MenuItem.Icon>
            </MenuItem>
            <MenuItem Command="Copy" Header="Kopyala">
                <MenuItem.Icon>
                    <Image Source="Images/copy.png" />
                </MenuItem.Icon>
             </MenuItem>
             <MenuItem Command="Paste" Header="Yapıştır">
                <MenuItem.Icon>
                    <Image Source="Images/paste.png" />
                </MenuItem.Icon>
             </MenuItem>
         </ContextMenu>
     </RichTextBox.ContextMenu>
</RichTextBox>

RichTextBox kontrolüne ContextMenu 'yu ekledik ve sonrasında projeyi çalıştırdığımızda aşağıdaki gibi bir görüntüye sahip olacaktır.


Gayet hoş bir görüntü ile karşı karşıyayız. :) Kullanmış olduğumuz RichTextBox kontrolünün özelliklerini incelersek ContextMenu özelliğini aktifleştiği ve elemanların eklendiği gözlemlenmektedir.


Özellikler ekranında da ContextMenu nun kullanıldığını gördük. Şimdi ise kullanım esnasında karşılaşılabilecek durumlardan birine değinelim. Form üzerinde veri girişi yapabildiğimiz bir kontrol var ve biz de o kontrole özel bir menü konrolü oluşturduk. Ancak bu kontrol form üzerinde eklemiş olduğumuz bir olasılık sebebi ile pasif duruma geçti. Ancak bizim amacımız pasif durumda bile olan kontrollerde de ContextMenu ile belirttiğimiz işlemlerin yapılmasını istiyoruz. Eğer bu tür bir durumla karşılaşıyorsak ContextMenuService.ShowOnDisabled özelliğine değer atayarak karşılaştığımız istisnai durumu ortadan kaldırabiliriz.

ContextMenu.xaml
<RichTextBox IsEnabled="False" ContextMenuService.ShowOnDisabled="True">
    <RichTextBox.ContextMenu>
        <ContextMenu>
            ...
         </ContextMenu>
      </RichTextBox.ContextMenu>
</RichTextBox>

Bir diğer karşılaşabileceğimiz durum ise, bir ContextMenu kontrolünün diğer bir ContextMenu kontrolü içerisinde kullanmak isteyebiliriz. Bu durumda yapılması gereken diğer ContextMenu içeriğini kullanılabilmesi mümkündür. Yapılması gereken ise, CompositeCollection özelliğini kullanmak yeterli olacaktır.

ContextMenu2.xaml
<Window x:Class="WPFControls.ContextMenu2"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    Title="ContextMenu2" Height="300" Width="300">
    <Grid Background="Transparent">
        <Grid.Resources>
             <x:Array Type="{x:Type sys:Object}" x:Key="extensions">
                  <Separator />
                  <MenuItem Header="Ek MenuItem 1" />
                   <MenuItem Header="Ek MenuItem 2" />
                   <MenuItem Header="Ek MenuItem 3" />
             </x:Array>
        </Grid.Resources>
     <Grid.ContextMenu>
         <ContextMenu>
             <ContextMenu.ItemsSource>
                   <CompositeCollection>
                       <MenuItem Header="Standart MenuItem 1" />
                       <MenuItem Header="Standart MenuItem 2" />
                       <MenuItem Header="Standart MenuItem 3" />
                         <CollectionContainer Collection="{StaticResource extensions}" />
                   </CompositeCollection>
                </ContextMenu.ItemsSource>
            </ContextMenu>
        </Grid.ContextMenu>
     </Grid>
</Window>

XAML dosya üzerinde yapmış olduğumuz işlemler sonrasında karşımıza aşağıdaki gibi bir ekran görüntüsü oluşacaktır.



ContextMenu özelliklerini incelemeye devam ediyoruz. Eklemiş olduğumuz menü elemanlarının ToolTip ve GestureText özelliklerine de değer atanabilmesi mümkündür. Bu işlem için yapılması gereken aşağıdaki gibidir.

ContextMenu.xaml
<MenuItem Command="Kopyala" Header="Kopyala" InputGestureText="CTRL + C" ToolTip="Daha sonra kullanmak üzere yazıları kopyalayabilirsiniz." />

ContextMenu kontrolüne eklemiş olduğumuz değerlerin herhangi birine tıklanması sonucunda da işlem yapılabilmesi mümkündür. Click olayını kullanmak yeterlidir.

ContextMenu.xaml
<MenuItem Header="Temizle" Click="MenuItemClear_Click"/>

ContextMenu.xaml.cs
private void MenuItemClear_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("MenuItem 'a tıklandı");
    txtControl.Text = "";
}

ContextMenu kontrolü için değineceğimiz son konu ise kod üzerinden oluşturmak olacaktır. XAML kod dosyasının yani formun boyutunun artmaması için ya da belirli bir işlemden sonra menü kontrollerini kullanmak istediğimiz durumlarda kod içerisinden de Contextmenü kontrolünü kullanabilmemiz mümkündür. Bu işlemi gerçekleştirebilmek için ContextMenu ve MenuItem sınıflarını kullanmak yeterli olacaktır.

ContextMenu.xaml.cs
ContextMenu mainMenu = new ContextMenu();
mainMenu.Background = Brushes.LightGreen;
mainMenu.Height = 300;
mainMenu.Width = 200;

MenuItem item1 = new MenuItem();
item1.Width = 50;
item1.Header = "Yapıştır";
mainMenu.Items.Add(item1);

MenuItem item2 = new MenuItem();
item2.Width = 50;
item2.Header = "Temizle";
item1.Items.Add(item2);

MenuItem item3 = new MenuItem();
item3.Width = 50;
item3.Header = "Kopyala";
item1.Items.Add(item3);

Basit olarak belirtmiş olduğumuz kod ile ContextMenu oluşturma işlemini daha gelişmiş bir şekilde, ikonları da kullanarak tamamen bir menü konrolü olarak kullanabileceğimiz bir metot şekline dönüştürelim.

ContextMenu.xaml.cs
private void OrnekCalisirMenu()
{
    ContextMenu mainMenu = new ContextMenu();
    txtControl.ContextMenu = mainMenu;

    MenuItem item1 = new MenuItem();
    item1.Header = "Paste";
    item1.Foreground = Brushes.Black;
    item1.Background = Brushes.Transparent;
    mainMenu.Items.Add(item1);

    MenuItem item2 = new MenuItem();
    item2.Header = "Clear";
    mainMenu.Items.Add(item2);

    //çalışma anında menü içerisinde kullanılacak olan resim ekleniyor.

    BitmapImage copyimage = new BitmapImage();
    copyimage.BeginInit();
    Uri myUri = new Uri("Images/Copy.png", UriKind.RelativeOrAbsolute);
    copyimage.UriSource = myUri;
    copyimage.EndInit();

    Image iconImage = new Image();
    iconImage.Source = copyimage;

    MenuItem item3 = new MenuItem();
    item3.Header = "Copy";
    item3.Icon = iconImage;
    mainMenu.Items.Add(item3);

}

Sonuç olarak belirli bir koşul altında ya da sayfanın yüklenmesi anında kullanılabilecek olan ContextMenu kontrolünü sağlayacak metodu oluşturduktan sonra istediğimiz heryerde kullanabilme imkanımız vardır.

Sonuç olarak hazırlanan windows tabanlı uygulamalarda en sık kullanılan özelliklerden biri olan ContextMenu kontrolünü detaylı bir şekilde açıklamaya çalıştık. Hem XAML kod üzerinden hemde kod yardımı ile nasıl kullanabileceğimizi inceledik.

Umarım yararlı olabilmiştir.

Yorumlar

Bu blogdaki popüler yayınlar

Olasılıksız - Kitap Yorum

Olasılıksız hayatımda okuduğum en iyi kitaptı. Tek çırpıda hiç sıkılmadan, eğlenerek okudum bu kitabı, tavsiyem sizinde okumanız.Kitabın kapağı ve içeriği ile ilgili kısa bilgi aşağıdadır.Olasılık, tahmin, düşünceler, nöbetler, karışıklıklar, ileriyi görebilme zannı, dejavu ve tabii ki olasılıksız şeyler. Bu kelimelerle içli dışlı olabileceğiniz, bütün bu kelimelerin yaşamdaki yerini kavrayabileceğiniz müthiş bir uyarlama.Adam Fawer' ın ortaya çıkardığı bu uyarlama romanın müthiş bir çalışmanın ve araştırmanın sonucu ortaya çıktığının kitabın başından sonuna kadar farkındasınız. Bu uyarlamasını, derin araştırmalarıyla birleştirip romanı tekdüzelikten çıkarıp müthiş bir yere koyduğu için de Fawer' a müteşekkir oluveriyorsunuz. Sıkıcı diye nitelendirebileceğiniz teorik bilgileri bile bir çırpıda okuyuveriyorsunuz. Teorik bilgiler dahi olaylarla sonuna kadar bağlantılı aktarılmış. Tekdüzelikten çıkmış bir roman; olasılıksız. Her an olayın kurgusunun değişmesi olasılık dahilinde. …

.Net 3.5 SP1 – Full Install Packages (Tam Kurulum)

.Net Framework 3.5 SP1 ‘i bilgisayarınıza kurmak istediğinizde normal şartlar altında Microsoft ‘un sitesinde 2.7 mb ‘lik bir dosya indirir ve kurulum işlemlerinizi bu dosya üzerinden yaparsınız. Ancak bu indirmiş oluğunuz dosya yaklaşık 220 mb ‘lik veriyi internetten indirerek kurulum yapmaktadır. İnternet çıkışına izin verilmeyen kurumlar ve kuruluşlar için bu durum bir sıkıntı oluşturmaktadır. Bu sebepten ötürü aşağıdaki link yardımı ile tam yükleme paketini indirdikten sonra hiç internet ihtiyacınız olmadan .Net 3.5 SP1 ‘i kurabilmeniz mümkün olacaktır.Link

Çoklu Dil Desteği – Veri Tabanı Tasarım Örnekleri ile

Zaman içerisinde karşımıza çok farklı projeler gelebilmektedir. Ancak bu projeler içerisinde özellikle de global ölçekli ya da bu ölçekte uygulama geliştiren firmalarda bazı temel gereksinimler sürekli olarak karşımıza çıkabilmektedir. Bu gereksinimlerden biri ve belki de en önemlisi olan çoklu dil desteğinin veri tabanı (DB) katmanında nasıl yapıldığını kısa ve hızlıca inceliyor olacağız.Öncelikle çoklu dil desteği dediğimizde aklımıza gelen ilk çözüm yolu *.resx dosyalarını kullanmak gelmektedir. Ancak bu uzaktan yönetilen ya da anlık olarak metin değişikliği gereksinimi bulunan uygulamalarda bazı ufak problemler çıkartabilmektedir.Ne gibi problemler derseniz; iki grupta inceleyebiliriz. Web projeleri ve windows üzerinde çalışan projeler.Web projelerinde IIS üzerinde yer alan bir *.resx dosyasını değiştirdiğinizde son kullanıcı tarafında etkisi hemen görülmeyebilir. Cache mekanizmaları sebebiyle ortalama 15-30 dakika arasında bir görüntüleme süre farkı ile karşılaşabiliriz. Faha köt…