Ahmet Çığşar | WPF Triggers (Tetikleyiciler)
554
post-template-default,single,single-post,postid-554,single-format-standard,qode-quick-links-1.0,ajax_fade,page_not_loaded,,qode-theme-ver-11.0,qode-theme-bridge

WPF Triggers (Tetikleyiciler)

WPF Triggers (Tetikleyiciler)

SQL ile veritabanı uygulamaları geliştirdiyseniz triggers kavramına yabancı değilsinizdir. Trigger’ın Türkçe karşılığı tetikleyicidir. WPF’de triggers’lar (tetikleyiciler) bir event gerçekleştiğinde devreye girecek olan event’ler (olaylar) veya bizim belirlediğimiz kod bloklarını çalıştıran yapılardır.

WPF’de Triggers’lara ne gerek var ki?

Biz zaten Windows Forms’da olduğu gibi WPF’de de codebehind tarafında karar mekanizmalarını (if, else, switch) kullanarak event’ler üzerinde istediğimiz sonuçları yakalayabiliyor ve kendi mekanizmamızı  oluşturabiliyorduk ve halen oluşturabiliyoruzda. Ne gerek var triggers’lara?

WPF’de Triggers’lar ile eventleri XAML tarafında kullanabiliriz yani triggerslar sayesinde WPF element ya da kontrollerimizin eventlerini codebehind tarafında yazılıma ek yük ve kod kalabalığı getirmeden arayüz kısmında  kullanabilme lüksüne sahibiz. Ayrıca animasyon, video, ses ve efektleri codebehind tarafında değil arayüz kısmında XAML ile gerçekleştirebiliyoruz ki bu büyük bir avantajdır.

WPF Triggers  Çeşitleri

Tetikleyiciler TriggerBase sınıfından türemişlerdir ve beş farklı tetikleyici (trigger) vardır. Bunlar Trigger, MultiTrigger, DataTrigger, MultiDataTrigger, EventTrigger’dır.

Trigger

İstediğimiz event (olay) gerçekleştiğinde belirlediğimiz kontrollerin veya elementlerin property’lerini değiştirmemizi sağlar.

Basit bir örnekle açıklamaya çalışalım.

App.xaml dosyası içerisinde bulunan <Application.Resources> etiketleri arasına aşağıdaki kodları yazalım.

        <Style TargetType="{x:Type Button}">
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True" />
                    <Setter Property="Background" Value="Red" />
                </Trigger>
            </Style.Triggers>
        </Style>

Artık Window’a buton eklediğinizde fare ile buton üzerine geldiğinizde arkaplanı kırmızı olacaktır. Eeee nasıl oldu şimdi?

<Style TargetType=”{x:Type Button}”>
Burada TargetType ve x:Type Button tanımlarıyla stili tüm buton kontrollerine uygulayacağımızı belirttik.

<Style.Triggers>
Stil dosyasını etkileyecek olan bir trigger olacağını belirttik.

<Trigger Property=”IsMouseOver” Value=”True” />
Trigger eventleri property attribute ile yakalar bizde IsMouseOver yazarak trigger’ımıza fare üzerine gelince tetiklenmesini istedik.

<Setter Property=”Background” Value=”Red” />
Setter ile daha önce tanışmıştık. Stilimizin arkaplanı özelliğine “Background” ile ulaştık ve “Red” ile kırmızı değerini verdik.
MultiTrigger

Yukarıdaki örnekte tek bir koşulumuz vardı. Birden fazla koşul söz konusu olduğunda ise MultiTrigger’ları kullanırız. MultiTrigger’lar da her koşulu <Condition> etiketi ile açarız.

Aşağıda MultiTrigger’lar için verilen klişe örneklerden birini anlatmaya çalışacağım.

1- Aşağıda dört adet RadioButton oluşturuyoruz. Content özelliklerine dikkat lütfen.

<RadioButton Content="Beni seçme" HorizontalAlignment="Left" Margin="149,75,0,0" VerticalAlignment="Top" Width="171"/>
<RadioButton Content="Beni de seçme" HorizontalAlignment="Left" Margin="149,96,0,0" VerticalAlignment="Top" Width="171"/>
<RadioButton Content="Beni seç lütfen" HorizontalAlignment="Left" Margin="149,116,0,0" VerticalAlignment="Top" Width="171"/>
<RadioButton Content="Aklından bile geçirme" HorizontalAlignment="Left" Margin="149,137,0,0" VerticalAlignment="Top" Width="171"/>

2- Ardından App.xaml dosyasının içerisine <Application.Resources> etiketleri arasına  MultiTirgger’ımızı yazıyoruz.

        <Style TargetType="{x:Type RadioButton}" >
            <Style.Triggers>
                <MultiTrigger>
                    <MultiTrigger.Conditions>
                        <Condition Property="IsChecked" Value="True"></Condition>
                        <Condition Property="Content" Value="Beni seç lütfen" ></Condition>
                    </MultiTrigger.Conditions>
                    <Setter Property="Foreground" Value="Green" />
                    <Setter Property="BorderBrush" Value="Red" />
                </MultiTrigger>
            </Style.Triggers>
        </Style>
    </Application.Resources>
wpf-multitrigger1

Seçimden önce

wpf-multitrigger2

Seçimden sonra

 

Gördüğünüz gibi “Beni seç lütfen” yazan RadioButton seçildikten sonra yazı rengi yeşile ve düğme halkası kırmızıya dönüştü. Şimdi kodlarımızı inceleyelim.

<MultiTrigger>
Bir multi trigger uygulayacağımızı belirttik ve yer açtık.

<MultiTrigger.Conditions>
Burada multi triggerların koşullarını belirleyeceğimizi belirttik ve koşullar için tekrar yer açtık.

<Condition Property=”IsChecked” Value=”True”></Condition>
<Condition> ile multi trigger’ımızın şartını belirliyoruz. Property=”IsChecked” ile IsChecked event’ini baz alıyoruz yani buton seçilimi değil mi ve ardından Value=”True” ile IsChecked eventinin True olması gerektiğini yani seçilmesi gerektiğini ilk şart olarak belirliyoruz.

<Condition Property=”Content” Value=”Beni seç lütfen” ></Condition>
İkinci şartımızda ise Property=”Content” ile kontrolumuzun Content özelliğini baz alıyoruz ve Value=”Beni seç lütfen” yani Beni seç lütfen yazan butonun seçili olmasını ikinci şart koyuyoruz.

Şartlarımız bitti ve </MultiTrigger.Conditions> etiketi ile multi trigger alanını kapatıyoruz. Sıra geldi koşullar sağlanırsa nelerin yapılacağına.

<Setter Property=”Foreground” Value=”Green” />
<Setter Property=”BorderBrush” Value=”Red” />
Bu kodları daha önceki örneklerimizde anlattığım için fazla üzerinde durmaya gerek yok sanırım. Şartlar yerine gelirse yazı rengini yeşil ve buton halkasını kırmızı yapıyoruz.

2 Yorum Var
  • Koray
    18:15h, 08 Mart Cevapla

    Yazınız için teşekkürler, geçte olsa böyle güzel bir kaynak bulduğum için mutluyum. Bir şey sormak istedim, başka bir trigger daha tanımlamak mümkün mü aynı .xaml ‘ e. Mesela seçilen radiobutton’ın text’i yeşil oluyorken seçilmeyenlerin ki kırmızı olsun gibi ? Teşekkür ederim.

    • Ahmet Çığşar
      23:37h, 08 Mart Cevapla

      Koray merhaba, rica ederim. Evet yapabilirsin farklı farklı yöntemleri var anlatılsa yazı olur o nedenle yorumda bahsetmem imkansız. İngilizce seviyen orta veya üzeriyse bu konuda yapılmış harika başlangıç seviyesi örnekler ve dökümanlar var.

Yorum Yapın