Behavior’larla birlikte çalışan Trigger’lar ve trigger tipleri

Merhaba arkadaşlar,
Bu yazım Blend’deki triggerlar ile ilgili olacak. Önce türkçe karşılığı tetikleme olan Trigger’ların ne olduğunu belirteyim. Trigger’lar behaviorlar ile birlikte çalışır ve kullanım amacı behavior’u tetiklemektir.

Bir behavior’u tetiklemek için birden çok alternatifimiz var.

  • Bir butona basıldığında
  • Sayfadaki herhangi bir kontrolün herhangi bir property’si değiştiğinde 
  • Kod arkasındaki herhangi bir property’nin değeri değiştiğinde
  • Herhangi bir tuşa basıldığında
  • Belirli zaman aralıklarında bir behavior’u tetikleyebiliriz.

Yukarıdaki verdiklerim behavior’u tetiklemek için kullanabileceğiniz yöntemlerin çok ama çok küçük bir kısmı.

Kısaca bahsettikten sonra trigger tiplerine bakalım;

  • EventTrigger: Bir kontrolün herhangi bir olayında(Click, TextChanged, LostFocus, Loaded…) bir behavior’u tetiklemek için kullandığımız trigger çeşididir.
  • PropertyChangedTrigger: Sayfamızdaki kontrollerden veya sayfamızın DataContext’indeki propertylerden herhangi birinin değeri değiştiğinde kullandığımız trigger.
  • DataTrigger: Sayfamızdaki kontrollerden veya sayfamızın DataContext’indeki propertylerden herhangi birinin değeri değiştiğinde belirli şartlarda behavior’u tetikler fakat PropertyChangedTrigger’dan çok farklıdır. PropertyChangedTrigger’da değişme olduğunda kayıtsız şartsız behavior tetiklenir. Fakat DataTrigger’da şu property şu değere gelince tetikle gibi bir şart koyabilirim.
  • DataSourceChangedTrigger: Sayfanın DataContext’i değiştiğinde behavior’u tetiklemek için kullanılır.
  • TimerTrigger: Belirli bir zaman periyodunda behavior’u tetiklemek için kullandığımız trigger. 10 saniyede bir gibi.
  • KeyTrigger: Herhangi bir tuşa basıldında behavior’u tetikler.
  • StoryBoardCompletedTrigger: Bir storyboard tamamlandığında behavior tetiklenir.

Sayfaya herhangi bir kontrol sürükleyin, bu kontrole bir behavior sürükleyin ve properties penceresinden hangi triggerın propertyleri neler incelemenizi tavsiye ederim.

Yukarıda yaptığım bir örneği görüyorsunuz. Kod arkasında degisken adında bir bool property var. Bir timer aracılığıyla 2 saniyede bir bu değişkenin değerini değiştiriyorum. Değişken her true olduğunda Behavior Tetiklendi yazısı görünür oluyor. Her false oluşunda görünmez yapmak için de tabii ki bir diğer behavior kullandım. Kullandığım behavior ChangePropertyAction idi, TextBlock’un Visibility’sine odaklı bir behaviordu, bunu tetiklemek için de DataTrigger kullandım. DataTrigger ise arka kısımdaki degisken adlı booleana odaklı idi.

MainPage.xaml:

	<Grid x:Name="LayoutRoot" Background="White">
<TextBlock HorizontalAlignment="Left" Text="Property: " Margin="10,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="149" FontSize="15"/>
<TextBlock HorizontalAlignment="Left" Margin="96,10,0,0" TextWrapping="Wrap" Text="{Binding degisken}" VerticalAlignment="Top" Height="22" Width="171" FontSize="15"/>
<TextBlock HorizontalAlignment="Left" Margin="10,55,0,0" TextWrapping="Wrap" Text="Behavior Tetiklendi" VerticalAlignment="Top" FontSize="20" Width="328" Foreground="#FFC34444" Visibility="Collapsed">
<i:Interaction.Triggers>
<ei:DataTrigger Value="True" Binding="{Binding degisken}">
<ei:ChangePropertyAction PropertyName="Visibility">
<ei:ChangePropertyAction.Value>
<Visibility>Visible</Visibility>
</ei:ChangePropertyAction.Value>
</ei:ChangePropertyAction>
</ei:DataTrigger>

<ei:DataTrigger Value="False" Binding="{Binding degisken}">
<ei:ChangePropertyAction PropertyName="Visibility">
<ei:ChangePropertyAction.Value>
<Visibility>Collapsed</Visibility>
</ei:ChangePropertyAction.Value>
</ei:ChangePropertyAction>
</ei:DataTrigger>
</i:Interaction.Triggers>
</TextBlock>
</Grid>

MainPage.xaml.cs

	public partial class MainPage : UserControl, INotifyPropertyChanged
{
public static bool degisken { get; set; }
DispatcherTimer timerDegistir;

public MainPage()
{
this.DataContext = this;
timerDegistir = new DispatcherTimer();
timerDegistir.Interval = new TimeSpan(0,0,2);
timerDegistir.Tick += callback;
InitializeComponent();
timerDegistir.Start();
}

private void callback(object sender, EventArgs e)
{
if (degisken)
{
degisken = false;
FirePropertyChanged("degisken");
}
else
{
degisken = true;
FirePropertyChanged("degisken");
}
}

public event PropertyChangedEventHandler PropertyChanged;

private void FirePropertyChanged(string pname)
{
PropertyChanged(this, new PropertyChangedEventArgs(pname));
}
}

Blend’deki behavior ve trigger’larla harika işler çıkarabilirsiniz. Naçizane tavsiyem inceleyip kurcalamanızdır.
Görüşmek üzere.

Fazlasını Oku