XAML etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
XAML etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

Pazar, Ekim 25, 2009

WPF - Slider 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 üzerinde kullanılan en temel kontrollerin Slider kontrolünün özelliklerini inceliyor ve nasıl kullanıldığını, özellikleri incelemeye çalışıyor olacağız.

WPF - Slider Control
Slider kontrolü kullanımı en basit olan kontrollerden biridir. Temel olarak yaptığı işlem belirli aralıkta değerleri değiştirmek ve bu değişen değerleri başka bir kontrol ya da işlem ile ilişkilendirmektedir. Slider kontrolünün en önemli iki özelliği vardır. Bunlar başlangıç ve bitiş değerlerini belirten Max. ve Min. değerledir. Temel olarak Slider kontrolü kullanımı aşağıdaki gibi olacaktır.

Slider.xaml
<Slider Height="23" HorizontalAlignment="Left" Margin="26,34,0,0" Name="slider1" VerticalAlignment="Top" Width="250" Minimum="0" Maximum="100" />

Slider kontrolünün temel kullanımı yukarıdaki kod parçasında belirttiğimiz gibidir. Bu kullanım şekli dışında değinilebilecek pek özelliği yoktur. Bu sebeple kullanılabilecek örnekleri sizlere aktararak yazımıza devam edeceğiz.

Şöyle bir örnek hayal edelim. ProgressBar kontrolü ile Slider kontrolünü birlikte kullanabilmemiz mümkündür. Bunun için ProgressBar kontrolünün value özelliğine Slider değerini eklemek yeterli olacaktır. Peki yapmış olduğumuz bu işlem sonrasında ne gibi bir sonuç ile kaşılaşacağız. Biz slider kontrolü üzerindeki değerleri değiştirdikçe ProgressBar kontrolünün değerleri de değişiyor olacaktır.

Slider.xaml
<Window x:Class="WPFControls.Slider"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Slider" Height="300" Width="300">
    <Grid x:Name="LayoutRoot">
        <Slider RenderTransformOrigin="0.501,0.622" Margin="81,161.66,66,0"
            x:Name="Slider" Style="{DynamicResource SimpleSlider}"
            VerticalAlignment="Top" Height="22" Maximum="100" Minimum="0" Value="0" >
            <Slider.RenderTransform>
                <TransformGroup>
                    <ScaleTransform ScaleX="-1" ScaleY="-1"/>
                    <SkewTransform AngleX="0" AngleY="0"/>
                    <RotateTransform Angle="179.863"/>
                    <TranslateTransform X="-0.954" Y="-9.028"/>
                </TransformGroup>
            </Slider.RenderTransform>
            <Slider.Background>
                <LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
                    <GradientStop Color="#FFFFFFFF" Offset="0"/>
                    <GradientStop Color="#FFF5A544" Offset="1"/>
                </LinearGradientBrush>
            </Slider.Background>
        </Slider>
        <ProgressBar Margin="80,119,63,0" Style="{DynamicResource SimpleProgressBar}" VerticalAlignment="Top" Height="20" Value="{Binding Path=Value, ElementName=Slider, Mode=Default}">
            <ProgressBar.Background>
                <LinearGradientBrush EndPoint="1,0" StartPoint="0,0">
                    <GradientStop Color="#FFBABABA" Offset="0"/>
                    <GradientStop Color="#FFC7C7C7" Offset="0.5"/>
                    <GradientStop Color="#FF5D9C1D" Offset="0.75"/>
                </LinearGradientBrush>
            </ProgressBar.Background>
        </ProgressBar>
    </Grid>
</Window>

Kontrolü çalıştırdığımızda aşağıdaki gibi bir ekran görüntüsü ile karşılaşırız.


Ayrıca sizler yukarıdaki kod blogunu kendi XAML dosyanıza eklediğiniz SimpleSlider kaynağını bulamıyorum şeklinde hata verecektir. Bu stil için oluşturulmuş olan bir kaynak dosyadır. Bu kaynak bilgisini kaldırmanız durumunda sorunsuzca çalışacaktır. Zaman içerisinde sizlere bütün Simple Style dosyasını veriyor olacağız. Kullanmak isteyenler için SimpleSlider kaynak stili aşağıdaki gibidir.

SimpleStyle.xaml
<Style x:Key="SimpleSlider" TargetType="{x:Type Slider}">
    <Setter Property="Background" Value="{DynamicResource LightBrush}"/>
        <Setter Property="BorderBrush" Value="{DynamicResource NormalBorderBrush}"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Slider}">
                        <Grid x:Name="GridRoot">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="Auto" MinHeight="{TemplateBinding MinHeight}"/>
                                <RowDefinition Height="Auto"/>
                            </Grid.RowDefinitions>
   
                            <!-- TickBar shows the ticks for Slider -->
                            <TickBar Visibility="Collapsed" x:Name="TopTick" Height="4" SnapsToDevicePixels="True" Placement="Top" Fill="{DynamicResource GlyphBrush}"/>
                                <Border Grid.Row="1" Margin="0" x:Name="Border" Height="4" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding                                     BorderThickness}" CornerRadius="2"/>

                                <!-- The Track lays out the repeat buttons and thumb -->
                                <Track Grid.Row="1" x:Name="PART_Track">
                                    <Track.Thumb>
                                        <Thumb Style="{DynamicResource SimpleSliderThumb}"/>
                                    </Track.Thumb>
                                    <Track.IncreaseRepeatButton>
                                        <RepeatButton Style="{DynamicResource SimpleScrollRepeatButtonStyle}" Command="Slider.IncreaseLarge"/>
                                    </Track.IncreaseRepeatButton>
                                        <Track.DecreaseRepeatButton>
                                            <RepeatButton Style="{DynamicResource SimpleScrollRepeatButtonStyle}" Command="Slider.DecreaseLarge"/>
                                        </Track.DecreaseRepeatButton>
                                </Track>

                            <TickBar Visibility="Collapsed" Grid.Row="2" x:Name="BottomTick" Height="4" SnapsToDevicePixels="True" Placement="Bottom" Fill="{TemplateBinding Foreground}"/>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <Trigger Property="TickPlacement" Value="TopLeft">
                                <Setter Property="Visibility" Value="Visible" TargetName="TopTick"/>
                            </Trigger>
                            <Trigger Property="TickPlacement" Value="BottomRight">
                                <Setter Property="Visibility" Value="Visible" TargetName="BottomTick"/>
                            </Trigger>
                            <Trigger Property="TickPlacement" Value="Both">
                                <Setter Property="Visibility" Value="Visible" TargetName="TopTick"/>
                                <Setter Property="Visibility" Value="Visible" TargetName="BottomTick"/>
                            </Trigger>
                            <Trigger Property="IsEnabled" Value="false">
                                <Setter Property="Background" Value="{DynamicResource DisabledBackgroundBrush}" TargetName="Border"/>
                                <Setter Property="BorderBrush" Value="{DynamicResource DisabledBorderBrush}" TargetName="Border"/>
                            </Trigger>

                            <!-- Use a rotation to create a Vertical Slider form the default Horizontal -->
                            <Trigger Property="Orientation" Value="Vertical">
                                <Setter Property="LayoutTransform" TargetName="GridRoot">
                                    <Setter.Value>
                                        <RotateTransform Angle="-90"/>
                                    </Setter.Value>
                                </Setter>
                                <!-- Track rotates itself based on orientation so need to force it back -->
                                <Setter TargetName="PART_Track" Property="Orientation" Value="Horizontal"/>
                            </Trigger>

                        </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
</Style>

Hazırlayacak olduğumuz bir diğer örnek ise ekran üzerine eklemiş olduğumuz bir resmin boyutlarını büyültüp azaltmak olacaktır. Bu işlem için form üzerine slider kontrolü ile bir adet resim eklemek ve sonrasında slider üzerinde değişiklik olduğu zaman resmin boyutunu bizim belirlediğimiz boyutta değiştirmek olacaktır.

Slider.xaml
<Window x:Class="WPFControls.Slider"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Slider" Height="300" Width="300">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="200" />
            <RowDefinition Height="30" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Rectangle Grid.Row="0" Grid.Column="0" Width="250">
            <Rectangle.Fill>
                <ImageBrush x:Name="imageBrush" ImageSource="Images/copy.png" />
            </Rectangle.Fill>
        </Rectangle>
        <Slider Ticks="1, 2, 3, 4, 5, 6, 7, 8, 9, 10"
            Value="1"
            Delay="100"
            Interval="5"
            TickPlacement="BottomRight"
            Minimum="1"
            Maximum="10"
            Width="100"
            AutoToolTipPlacement="BottomRight"
            ValueChanged="Slider_ValueChanged"
            Grid.Row="1"
            Grid.Column="0">
        </Slider>
    </Grid>
</Window>

XAML kodu yukarıdaki gibi düzenledikten sonra CS dosyasının içerisinde aşağıdaki değişiklikleri yapıyoruz.

Slider.xaml.cs
using System.Windows;
using System.Windows.Media;

namespace WPFControls
{
    /// <summary>
    /// Interaction logic for Slider.xaml
    /// </summary>
    public partial class Slider : Window
    {
        public Slider()
        {
            InitializeComponent();
        }

        private void Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            double value = e.NewValue;
            ImageBrush imageBrush = this.FindName("imageBrush") as ImageBrush;
            imageBrush.Viewbox = new Rect(0.3, 0.3, 1 / value, 1 / value);
        }
    }
}

Yapmış olduğumuz işlemler sonrasında ekran görüntüsü aşağıdaki biçimde olacaktır.



Sonuç olarak, bu yazımızda web ve windows uygulamalarının kullanılması en kolay olan kontrollerinden Slider kontrolünü incelemeye çalıştık. En temel iki özelliğinin olduğunuda bunlarında max ve min değerleri olduğuna değindik. Ayrıca değinmiş olduğumuz bu özellikleri örnekler ile açıklayarak daha da anlaşılır olmasını sağlamaya çalıştık.

Umarım yararlı olabilmiştir.

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.

WPF - PasswordBox 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 üzerinde kullanılan en temel kontrollerin özelliklerini inceliyor ve nasıl kullanıldığını, özellikleri nelerdiri inceliyor olacağız.

WPF - PasswordBox Control
PasswordBox kontrolünün TextBox kontrolüne benzer bir tasarımı vardır. Tek farkı içerisine yazmış olduğumuz karakter,rakam ve özel karakterleri şifreli bir şekilde göstermesidir. Bu özelliği dışında en önemli özeliklerinden biri de kesme,kopyalama ve yapıştırma işlemlerine varsayılan olarak izin vermemesidir.



Windows1.xaml
<StackPanel>
    <Label Content="Şifreniz"/>
    <PasswordBox x:Name="PasswordBox" Width="130"/>
</StackPanel>

PasswordBox kontrolü kullanırken karakterleri tombul noktalarla değilde başka bir karakter ile de göstermek isteyebilirsiniz. Bu durumda yapmanız gereken PasswordChar özelliğine bir değer vermek olacaktır.

<StackPanel>
    <Label Content="Şifreniz"/>
    <PasswordBox x:Name="PasswordBox" PasswordChar="*" Width="130"/>
</StackPanel>

Karakteri değiştirdikten sonra aklınıza gelebilecek bir diğer değişiklik düşüncesi ile karakter girişini sınırlamak olabilir. Bu durumda ise MaxLength özelliğine bir değer atamanız yeterli olacaktır.

<StackPanel>
    <Label Content="Şifreniz"/>
    <PasswordBox x:Name="PasswordBox" PasswordChar="*" MaxLength="6" Width="130"/>
</StackPanel>

PasswordBox kontrolüne girilebilecek max karakter sayısınıda belirledik.

WPF Password Kontrolünde Databinding İşlemi
Passworbox kontrolü ile veri işlemlerini veriye bağlama yolu ile direk yapamayız. Bunun sebebi ise DependencyProperty tarafında desteklenen bir şifre türü değildir.

Nedenini açıklamak gerekirse, DataBinding ile tuttuğumuz parolalalar güvenlik sebebiyle iyi bir tercih değildir. Ancak bazı durumlarda bu kontrolünü kullanmak gerekebilmektedir. Özel durumlarda aşağıda oluşturacağımız PasswordBoxHelper 'dan yararlanabilirsiniz.

Windows1.xaml
<StackPanel>
    <PasswordBox w:PasswordHelper.Attach="True"
        w:PasswordHelper.Password="{Binding Text, ElementName=plain, Mode=TwoWay}"
        Width="130"/>
    <TextBlock Padding="10,0" x:Name="plain" />
</StackPanel>

XAML kod tarafında PasswordHelper sınıfını xmlnamespaces (xmlns:w) ekliyoruz. Sonrasında ise PasswordHelper.Attach ve PasswordHelper.Password özelliklerini orjinal password özelliğine bağlayarak güvenlik açıklarını ortadan kaldırmış oluyoruz.

PasswordHelper.cs
public static class PasswordHelper
{
    public static readonly DependencyProperty PasswordProperty =
    DependencyProperty.RegisterAttached("Password",
        typeof(string), typeof(PasswordHelper),
    new FrameworkPropertyMetadata(string.Empty, OnPasswordPropertyChanged));

    public static readonly DependencyProperty AttachProperty =
    DependencyProperty.RegisterAttached("Attach",
    typeof(bool), typeof(PasswordHelper), new PropertyMetadata(false, Attach));

    private static readonly DependencyProperty IsUpdatingProperty =
    DependencyProperty.RegisterAttached("IsUpdating", typeof(bool),
        typeof(PasswordHelper));


    public static void SetAttach(DependencyObject dp, bool value)
    {
        dp.SetValue(AttachProperty, value);
    }

    public static bool GetAttach(DependencyObject dp)
    {
        return (bool)dp.GetValue(AttachProperty);
    }

    public static string GetPassword(DependencyObject dp)
    {
        return (string)dp.GetValue(PasswordProperty);
    }

    public static void SetPassword(DependencyObject dp, string value)
    {
        dp.SetValue(PasswordProperty, value);
    }

    private static bool GetIsUpdating(DependencyObject dp)
    {
        return (bool)dp.GetValue(IsUpdatingProperty);
    }

    private static void SetIsUpdating(DependencyObject dp, bool value)
    {
        dp.SetValue(IsUpdatingProperty, value);
    }

    private static void OnPasswordPropertyChanged(DependencyObject sender,
        DependencyPropertyChangedEventArgs e)
    {
        PasswordBox passwordBox = sender as PasswordBox;
        passwordBox.PasswordChanged -= PasswordChanged;
       
        if (!(bool)GetIsUpdating(passwordBox))
        {
            passwordBox.Password = (string)e.NewValue;
        }
        passwordBox.PasswordChanged += PasswordChanged;
    }

    private static void Attach(DependencyObject sender,
        DependencyPropertyChangedEventArgs e)
    {
        PasswordBox passwordBox = sender as PasswordBox;

        if (passwordBox == null)
            return;

        if ((bool)e.OldValue)
        {
            passwordBox.PasswordChanged -= PasswordChanged;
        }
   
        if ((bool)e.NewValue)
        {
            passwordBox.PasswordChanged += PasswordChanged;
        }
    }

    private static void PasswordChanged(object sender, RoutedEventArgs e)
    {
        PasswordBox passwordBox = sender as PasswordBox;
        SetIsUpdating(passwordBox, true);
        SetPassword(passwordBox, passwordBox.Password);
        SetIsUpdating(passwordBox, false);
    }
}

PasswordHelper sınıfı yardımı ile PasswordBox kontrolünün yetkinliklerini ve güvenlik özelliklerini fazlası ile arttırabilmemiz mümkündür. Bu arada bu sınıfı hazırlayan functional blog grubuna da teşekkürlerimizi sunuyoruz.

Sonuç olarak PasswordBox kontrolünü kullanmak istediğimizde neler yapabileceğimize detaylı bir şekilde değinmeye çalıştık. Ayrıca DataBinding işlemleri esnasında bu kontrolün yeterince güvenli olmadığını ve kendi PasswordHelper sınıfını oluşturarak daha güvenlikli bir hale nasıl getirebileceğimize değinmeye çalıştık.

Umarım yararlı olabilmiştir.

Perşembe, Ekim 22, 2009

WPF - DataGrid Pratikleri

Windows Presentation Foundation ile ilgili kontrolleri özellikle de .Net Framework 4.0 ile çok daha sık kullanacak olduklarımızı incelmeye devam ediyoruz. Bir önceki yazımızda WPF DataGrid kontrolünün nasıl kullanabileceğini ve özelliklerinden nasıl yararlanabileceğimizi anlatmaya çalışmıştık. Bu yazımızda yine DataGrid kontrolünü incelerken detaylı bir şekilde proje geliştirme esnasında DataGrid kontrolünü nasıl kullanabileceğimizi açıklamaya çalışıyor olacağız.

Son kullanıcıya veri göstermek istenildiğinde akla gelen ilk kontrollerdendir DataGrid kontrolü.  Asp.Net uygulamalarında DataGrid, Windows Form uygulamalarında DataGridView kontrolü olarak geçmektedir. Ayrıca  üçüncü parti kontrol geliştiren yazılım firmalarınında ilk olarak değindikleri ve özelleştirdikleri kontroldür. Bu durumda bu kontrolün WPF ilk çıktığı zamanlarda bileşen panelinin içerisinde yer almaması oldukça büyük bir eksiklik olarak hissediliyordu. .Net Framework 3.5 'in SP1 sürümünün çıkması ve sonrasında WPF Toolkitin iyice kullanılabilir hale gelmesi ile WPF için yeni yeni kontroller geliştiricilere sunulmaya başladı. Bu geliştirilen kontrollerden şu anda için en sık kullanılan DataGrid, DateTimePicker ve Calendar kontrolleri özelleştirilebilir halleri ile .Net Framwork bünyesine de eklenmiştir. Zaman içerisinde kontrol panelinin içeriğinin artacağından kimsenin şüphesi yoktur.

Peki DataGrid kontrolünü VS2010 ile kullanırken herşey çok kolay. Zaten Toolbar içerisinde ekli olan bütün kontroller yer almaktadır. Peki ben geliştirme işlemini VS2008 içerisinde yapacağım, hem de WPF içerisinde DataGrid kontrolleri kullanmak istiyorum dersek neler yapmamız gerekiyor. Alt kısımlarda verecek olduğumuz linklerden yararlanarak kullanabilirsiniz. O zaman ilk olarak VS2008 ile neler yapmak gerekmektedir. Bu konulara değindikten sonra DataGrid pratiklerini incelemeye başlayalım.

Visual Studio 2008 içerisinde olmayan WPF kontrollerini kullanmak istediğimizde yapmamız gereken en önemli iş WPF Toolkit 'i kurmak yeterli olacaktır. Çalışmak için gereklilikleri aşağıda ver alan linklerden yararlanarak kurabilmeniz mümkündür.

.Net Framework 3.5 SP1 kurulması gerekmektedir.
WPF Toolkit
• WpfToolkit.msi dosyasını kurduktan sonra WPFToolkit.dll 'i program files dosyasının içerisine ekler. Projeye içerisine referans ederek kullanılabilmesi mümkündür.

Visual Studio 2008 ile anlatmış olduğumuz uygulamayı yapmak istersek nasıl yapabileceğimizi neler gerektiğini açıkladık. Artık uygulamamızı geliştirmeye başlayabiliriz. Bakalım DataGrid kontrolü ile neler yapabileceğiz.

DataGrid kontrolleri içerisinde CRUD (Create-Read-Update-Delete) işlemlerini nasıl yapabileceğimizi açılmaya çalışıyor olacağız. Bu işlem normalde hazırladığımız örneklerden biraz daha farklı olarak DataSet yardımı ile kullanmayı inceleyeceğiz. Uygulama içerisinde Northwind veri tabanından yararlanıyor olacağız. Oluşturacak olduğumuz dataset 'in içerisine aşağıda resimde de gördüğünüz Customers ve Orders tablolarını ekliyoruz.



İlk olarak DataSet 'e eklemiş olduğumuz Customers tablosunu DataGrid kontrolü içerisine ekleyelim. Bunun için ise, XAML sayfanın içerisine DataGrid kontrolünü ekledikten sonra ItemSource değerine {Binding} değerini atıyoruz.

Windows1.xaml
<Window x:Class="DataGridPratikleri.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Northwindler" Height="231" Width="500">

    <Grid>
        <DataGrid ItemsSource="{Binding}" Height="193" HorizontalAlignment="Left" Name="dataGrid1" VerticalAlignment="Top" Width="478" />
    </Grid>
</Window>


WPF uygulamasına DataGrid kontrolünü ekledik. Şimdi ise DataSet içerisine eklemiş olduğumuz tabloları kullanarak otomatik olarak oluşturulan veri getirme fonksiyonundan yararlanarak verileri gösterelim. Table Adapter yardımı ile

Windows1.xaml.cs

public Window1()
{
    InitializeComponent();

    DataSet1 dataset = new DataSet1();

    CustomersTableAdapter adapter = new CustomersTableAdapter();
    adapter.Fill(dataset.Customers);

    this.DataContext = dataset.Customers.DefaultView;
}


Verileri görüntüleyebilmek için gerekli işlemleri gerçekleştirdik. Yapmamız gereken son işlem ise Grid içerisine yerleşecek olan kolonlar otomatik olarak ekleneceği için AutoGenereteColumns özelliğine True değerini atamak olacaktır. Sonrasında ise aşağıdaki gibi bir görünüme sahip oluruz.



Yapmış olduğumuz işlemler sonrasında DataGrid içerisinde verilerin sorunsuzca gözüktüğünü gözlemledik. DataGrid içerisinde gösterilen verilerin satır ve sütunlarının otomatik olarak oluşturuluyor. Ayrıca bu otomatik oluşturulma işleminin dışında bizlerde DataGrid kontrolü üzerinde sağ tıklama yaptıktan sonra karşımıza çıkan menüden DataGrid seçeneğinin altında yer alan Add/Edit yardımı ile gerekli düzenlemeleri yapabiliriz. Ancak unutulmaması gereken bir konu, verileri otomatik olarak oluşturduğumuz için bu seçenek içerisinde şu anda bir deneme yaptığınızda herhangi bir değer çıkmayacaktır.

Veri kontrolüni sağlanabileceği bir başka yöntem ise ObjectDataProvider kullanımıdır. Bu sınıf yardımı ile XAML içerisinde veri kaynağı olarak kullanılacak olan örnekleri sağlamaya yardımcı olur. Bı işlem sonrasında da denetimleri veri kaynağı üzerinde yaptırabilme olanağı da vardır. (Not:İlerleyen yazılarımızda ObjectDataProvider kullanımı detayları ile açıklayacağız.)

ObjectDataProvider 'i kullanacağımız CustomerDataProvider isimli sınıfı oluşturarak işlemlerimize başlıyoruz. Bu sınıf içerisinde DataSet içerisinde yer alan objelerden de yararlanıyor olacağız.


public class CustomerDataProvider
{
    private CustomersTableAdapter adapter;
    private DataSet1 dataset;

    public CustomerDataProvider()
    {
        dataset = new DataSet1();
        adapter = new CustomersTableAdapter();
        adapter.Fill(dataset.Customers);
    }

    public DataView GetCustomers()
    {
        return dataset.Customers.DefaultView;
    }
}


Projenin içerisine yeni bir sınıf ekleyiruz ve yazmış olduğumuz kod bloklarının ObjectDataProvider ile uyumlu olması için yukarıda da görmüş olduğunuz kod parçacıklarını ekledik.. Şimdi sıra XAML kod tarafının içeriğini bu yapı ile çalışabilecek duruma getirmemiz gerekmektedir.

Windows1.xaml

<Window ...
    <Window.Resources>
        <!-- create an instance of our DataProvider class -->
        <ObjectDataProvider x:Key="CustomerDataProvider"
                ObjectType="{x:Type local:CustomerDataProvider}"/>
        <!-- define the method which is invoked to obtain our data -->
        <ObjectDataProvider x:Key="Customers"
                ObjectInstance="{StaticResource CustomerDataProvider}"
                MethodName="GetCustomers"/>
    </Window.Resources>
    <DockPanel DataContext="{Binding Source={StaticResource Customers}}">
        <DataGrid Name="dataGrid" ItemsSource="{Binding}" />
    </DockPanel>
<Window>


XAML tarafında ki düzenlemeleri de tamamladıktan sonra dizayn kısmına gereken DataGrid 'in üzerine sağ tıklama yaptığımız da DataGrid menüsünün altında yer alan seçeneklerden GenerateColumns,Add/EditColumns ve Remove Columns seçenekleri yer alacaktır. Bunlardan GenerateColumns seçeneğini seçersek bize DataBound kullanılacak şekilde bütün kolonları belirler. Tabii bu işlemi ObjectDataProvider kullandığımız için yapabiliyoruz. Biraz önceki kontrolümüzde bu seçenekler yer almıyordu. Ayrıca Add/Edit columns seçeneğine tıkladığımızda ilk etapta hiç bir değer gelmeyecektir. Ancak ASP.NET uygulamalarında kullanmış olduğumuz DataGrid konrollerinden de alışık olduğumuz gibi kolonları buradan düzenleyebilmemiz, tipini belirleyebilmemiz mümkündür. Bu açıkladığımız bilgileri görsel olarak görmek gerekirse, ekran görüntüleri aşağıdaki gibi olacaktır.



Add/Edit Columns seçeneğine tıkladıktan sonra herhangi bir kontrol ekleyip düzenle dediğimizde ise aşağıdaki gibi bir görüntü ile karşılaşırız.



Sizlerinde de fark etmiş olacağınız gibi Asp.Net uygulamalarında kullanmış olduğumuz yöntemlerin benzerlerini WPF uygulamalarında da kullanabilmemiz mümkün durumdadır. Bu ekran yardımı ile yapmış olduğunuz değişikler sonrasında XAML kod tarafında DataBound edilebilecek şekilde kolon bilgilerinin eklendiğini gözlemleyebilirsiniz.

Güncelleme İşlemleri
DataGrid kullanılan uygulamalarda son kullanıcılargenellikle Grid içerisinde yer alan kolonlara girmiş oldukları değelerin kayıt olabilmesini istemektedirler. DataTable içerisinde veri gösterildiği için son kullanıcı tarafından yapılan bu değişiklikleri farklı yötemler ile veri tabanına kayıt edebilmemiz mümkündür. Örnek olarak biraz anlatmak gerekirse, kullanabileceğimiz yöntemlerden biri bütün değişiklieri yapmak ve sonrasında misal olarak sonlandır isimli bir buton ile bütün değişikleri kaydebiliriz. Ya da her değişiklik yapıldığı anda da DataTable üzerinde kayıt işleminin yapılabilmesi mümkündür.

Satır üzerinde yapılan değişikleri yakalayabilmek için DataTable 'in RowChanged ve RowDeleted olaylarından yararlanabiliriz. Bu işlemler sonrasında istediğimiz işlemleri sorunsuzca yaptırabilir duruma geliyoruz.

CustomerDataProvider sınıfını oluşturduğumız sınıfın içeriğini aşağıdaki gibi olacak şekilde güncelliyoruz. Bu güncelleme işleminde DataSet 'i de bir ObjectDataProvider olarak tanımlıyoruz. Ayrıca RowChanged ve RowDeleted olaylarını da yakalayarak güncelleme işleminin yapılmasını sağlıyoruz.

Günceleme işlemi için ilk olarak yapacağımız DataSet bağlantısını da ObjectDataProvider yapısına uydurmak olacaktır. Sonrasında ise CustomerDataProvider isimli sınıfımız içerisinde güncelleme işleminin yapılabilmesi için bir takım değişikler yapacağız. Yapmış olduğumuz değişiklikler sonrasında DataGrid içerisinde yapılan herhangi değişiklik sonrasında başka bir kolona geç dediğimiz anda değişiklikler veri tabanında güncellenmiş olacktır. Sınıfın içerisindeki değişiklik aşağıdaki gibidir.

Windows1.xaml

using Test.DataSet1TableAdapters;
using System.Data;

namespace Test
{
    public class NorthWindDataProvider
    {
        private static DataSet1 northwindDataSet;

        public static DataSet1 NorthwindDataSet
        {
            get
            {
                if (northwindDataSet == null)
                {
                    northwindDataSet = new DataSet1();
                }
                return NorthWindDataProvider.northwindDataSet;
            }
        }
    }
    public class CustomerDataProvider
    {
        private CustomersTableAdapter adapter;

        public CustomerDataProvider()
        {
            DataSet1 dataset = NorthWindDataProvider.NorthwindDataSet;

            adapter = new CustomersTableAdapter();
            adapter.Fill(NorthWindDataProvider.NorthwindDataSet.Customers);

            dataset.Customers.CustomersRowChanged += new DataSet1.CustomersRowChangeEventHandler(CustomerRowModified);
            dataset.Customers.CustomersRowDeleted +=new DataSet1.CustomersRowChangeEventHandler(CustomerRowModified);

        }

        void CustomerRowModified(object sender, DataSet1.CustomersRowChangeEvent e)
        {
            adapter.Update(NorthWindDataProvider.NorthwindDataSet.Customers);
        }

        public DataView GetCustomers()
        {
            return NorthWindDataProvider.NorthwindDataSet.Customers.DefaultView;
        }
    }
}


Değişikliğimiz sonrasında XAML kod bölümünde herhangi bir değişiklik yapmıyoruz. Uygulamamızı çalıştırıp değişiklikleri tamamladıktan sonra tekrardan uygulamamızı çalıştırdığımızda değişikliklerin kaydolduğunu ve DataGrid içerisinde yeni değerinin yer aldığını gözlemleriz.

Sonuç olarak DataGrid içerisinde veri tabanında yer alan verileri göstermeyi ve üzerinde değişiklik yapmak istediğimiz zaman hangi işlemleri uygulamayacağımızı anlatmaya çalıştık.

Umarım yararlı olabilmiştir.
Kaynak
www.windowsclient.com

Salı, Ekim 20, 2009

Visual Studio 2010 Beta2 - Download

An itibari ile Microsoft Visual Studio 2010 ide 'sinin Beta2 uygulamasını MSDN abonelerine indirilebilir duruma getirdi. Çok kısa bir zaman içerisinde de bütün yazılım geliştiricilerin ulaşabileceği bir şekilde indirilebilir duruma getirilecektir.
Eğer ki sizlerde MSDN abonesi iseniz, http://msdn.microsoft.com/en-us/vstudio/dd582936.aspx link yardımı ile kurabilir ve gerekli dökümanlara erişebilirsiniz.







Not: Unutmamamız gerekir ki Visual Studio 2010 'unun ide si WPF ortamında geliştirilmektedir. :)

Güncelleme: ISO formatında indirebilmeniz için http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=dc333ac8-596d-41e3-ba6c-84264e761b81 linkten yararlabilirsiniz.
İyi çalışmalar.

Pazar, Ekim 18, 2009

WPF - DataGrid Kullanımı

.Net Framework 4.0 'ın çıkışının yaklaşması ile WPF içerisinde de değişiklikler daha da ön plana çıkmaya başlamıştır. Özellikle bileşen paneli içerisinde oluşan gelişmeler gözlerden kaçmamaktadır. Tabii bu gelişimde WPF Control toolkitin de katkısını unutmamak gerekmektedir. Bu gelişmeler sonrası gelen en büyük yeniliklerden birisi de DataGrid kontrolüdür.

Veri tabanı ilişkisi olan ve liste şeklinde veri gösterilmesi gerektiği durumlarda en sık olarak kullanılan kontrollerin başında gelmektedir DataGrid kontrolü. Bazen yalnızca verileri gösterirken bazende DataGrid üzerinde kayıt silme, güncelleme ve yeni ekleme işlemleri de yapılabilmektedir. DataGrid kullanmanın kolaylıklarını ve avantajlarını tekrardan anlatmayacağız. Zaten yıllardır .Net programcılarının en sık kullandığı kontroldür. Ancak bu avantajlı durum Windows Presentation Foundation ile yeni nesil form ile uygulama geliştirmek isteyen yazılımcılarda durum biraz daha farklı oluyordu. Çünkü .Net 3.5 sonrasında gerçek anlamıyla kullanmaya başlayabildiğimiz WPF Control Toolkit yardımı ile DataGrid kontrolünü kullanabiliyorduk. Ama .Net Framework bünyesinde maalesef DataGrid kontrolü yer almıyodu. Özellikle eski adı WPF/E Silverlight teknolojisinde DataGrid kontrolünün daha önceden eklenmiş olması web uygulamalarında rahatlıkla bu kontrol kullanılırken neden windows form uygulamalarında kullanılamıyor şeklinde akıllara soru işaretleri doğuruyordu. Tabii ki hiçte kullanılamıyor da değildi. Biraz çaba sonrasında kendi DataGrid user controlümüzü oluşturup bunu kullanabiliyorduk. Ya da 3. parti bileşen geliştiren firmaların ürünlerinden yararlanarakta DataGrid kontrolü kullanabilmemiz mümkündü ve mümkün olacaktır. Fakat biz bu yazımızda .Net Framework 4.0 'ın içerisinde bulunacak olan WPF DataGrid kontrolünü incelemeye çalışıyor olacağız.

Not: Yazımızı Visual Studio 2010 Beta1 ve .Net Framework 4.0 Beta1 sürümleri ile geliştirmekte ve anlatmaktayız. Zaman içerisinde kullanım ve yazım standartı konusunda bir değişiklik olabilme ihtimali bulunmaktadır. Bilginize...

DataGrid kullanımı örnek üzerinde incelemeye çalışacağız. İlk olarak VS2010 Beta1 ile WPF projesi oluşturuyoruz. Sonrasında ise toolkit bölümüne bakarak DataGrid kontrolünü ve diğer bir çok kontrolü görebilmek mümkündür. Bizim yararlanacak olduğumuz DataGrid kontrolü olduğu için Controls seçeneği altında yer alan kontrollere göz atıyoruz.



Kontrolü form üzerine sürüklediğimizde XAML kod tarafında <DataGrid /> kod parçacığının eklendiğini gözlemleriz. DataGrid kontrolünün özellikleri arasında Name,Width,Height,HorizontalAligment,Margin ve diğer bir çoğu yer almaktadır.

Hazılayacak olduğumuz örnek için formun üzerine bir tane DataGrid kontrol sürükleyip bırakıyoruz. Sonrasında ise XAML tarafına aşağıdaki kod parçası eklenecektir.

Windows1.xaml
<DataGrid Height="100" HorizontalAlignment="Left" Margin="28,32,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="200" />

Visual Studio üzerindeki görüntüsü ise aşağıdaki gibi olacaktır.



DataGrid içerisinde gösterecek olduğumuz verileri oluşturmaya başlayalım. Bu işlem için bir tane kullanıcı sınıfı oluşturacağız ve sonrasında oluşturmuş olduğumuz elemanlara lis yardımı ile veri ekleyerek grdi içerisinde göstereceğiz.

WPF uygulamasına bir tane Users isimli sınıf ekliyor ve içerisine aşağıdaki kod parçasını ekliyoruz.

Users.cs
using System;

namespace DataGridKullanimi
{
    public class Users
    {
        public int UserID { get; set; }
        public string CurrentName { get; set; }
        public string CurrentSurname { get; set; }
        public DateTime BirthDay { get; set; }
        public bool IsActive { get; set; }
    }
}

Kullanıcılar sınıfını oluşturduğumuza göre şimdi de kullanıcılar verisini bir listeye dolduralım.

Window1.xaml.cs
private List<Users> LoadGrid()
{
    List<Users> users = new List<Users>();
    users.Add(new Users()
    {
        UserID = 1,
        CurrentName = "a",
        CurrentSurname = "b",
        BirthDay = new DateTime(2000, 12, 11),
        IsActive = false
    });
    users.Add(new Users()
    {
        UserID = 2,
        CurrentName = "aa",
        CurrentSurname = "bb",
        BirthDay = new DateTime(1987, 12, 11),
        IsActive = true
    });
    users.Add(new Users()
    {
        UserID = 4,
        CurrentName = "aya",
        CurrentSurname = "baya",
        BirthDay = new DateTime(1960, 12, 11),
        IsActive = true
    });
    return users;
}

Kullanıcı bilgilerini listeye doldurduktan sonra artık DataGrid içerisinde kullanabiliriz. DataGrid içerisinde veriyi ItemsSource özelliği yardımı ile alıyoruz.

Bu işlem için ise,

dataGrid1.ItemsSource = LoadGrid();

kod blogunu kullanmak yeterli olacaktır. Bu işlem sonrasında projemizi çalıştırdığımız karşımıza istediğimiz gibi bir sonuç çıkacaktır.



Grid içerisinde görülecek olan verilerin satır ve sütunların boyutlarının ayarlanabilinmesi mümkündür.

Window1.xmal
XX<DataGrid Height="200" HorizontalAlignment="Left" Margin="28,32,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="400" RowHeight="30" ColumnWidth="40"/>ZZ



Sabit olarak satır ve sütun özellikleri verebilmekle birlikte, en çok ve en az olabilecek boyutlarıda kullanabilmemiz mümkündür.

Grid üzerinde yer alan kolonların yatay, dikey, tamamen gibi çizgilerinin görünülebilirliklerinin ayarlanabilmesi mümkündür. Örneğin bizde grid üzerinde yer alan kolonların dikey çizgilerinin görünürlüğünü yok edelim.

Bu işlem için; GirdLinesVisibility="Vertical" özelliğini kullanmak yeterli olacaktır. Peki yapmış olduğumuz bu değişiklik sonrasında ne gibi bir ekran görüntüsüne sahip olacağız.


Grid üzerinde yapabileceğimiz işlemleri incelemeye devam ediyoruz. DataGrid içerisinde yer alan kolonlara hem bütün arkaplan için hemde satır bazlı olarak renklendirilebilmesi mümkündür.

Bu işlem için XAML kod bölümünde DataGrid in özelliklerine Background, RowBackground ve AlternatingBackground özelliklerine değerler vermemiz yeterli olacaktır.

Background="LightGray" RowBackground="LightYellow" AlternatingBackground="LightBlue"


DataGrid kullanırken arka planda aslında bir grid 'in içerisinde hazırlanmış olan bir kontrol olduğunu unutmamak gerekiyor. Bu durumda da dış kenarlıklarına hem renk hem de kalınlık verebilmemiz mümkündür. Kullanmamız gereken özellikler BorderBrush ve BorderThickness olacaktır.

XAML kod bölümünde yer alan DataGrid kontrolünün özelliklerine; BorderBrush="Red" BorderThickness="5" özelliklerini vermemiz yeterli olacaktır.



Grid içerisinde yer alan satırların ve kolonların yalnızca okunabilir olmasını istersek IsReadOnly özelliğine True değerini vermemiz yeterli olacaktır. Kullanılabiliecek bir diğer özelilk ise satırların sabit kalmasıdır. Freeze özelliği olarak bilinen bu özellikten yararlanabilmek için ilk olarak özelliği aktifleştirmek sonrasında da hangi kolondan itibaren kullanılacağınu belirtmek yeterli olacaktır. AreRowDetailsFrozen="True" FrozenColumnCount="2" şeklinde kullanılmaktadır.

Kullanabileceğimiz özellikleri incelemeye devam ediyoruz. Şimdi değinecek olduğumuz özellik ise satırların yeniden düzenlenebilirliği ve yeniden boyutlanabilirlidir. Bu iki özellik sabit bir tasarım sunmak istenildiğinde çok sık kullanılabilmektedir. CanUserReoderColumns="False" CanUserResizeColumns="False" şeklinde kullanılabilmektedir.

Sıralama, hem web uygulamalarında hem de windows uygulamalarında kullanılan DataGrid ler de en sık kullanılan özelliklerden birisidir. Bu özellike WPF DataGrid içerisinde de kullanılabilmesi mümküdür. CanUserSortColumns özelliğini kullanarak sıralama işleminin gerçekleşebilmesi mümkündür. True ve False değerlerini alabilmektedir. Bizim hazırlamış olduğumuz uygulamada kullanılmasını istemediğimiz için False özelliğini veriyoruz.

DataGrid kontrolünün değineceğimiz son özelliği ise Scroll olacaktır. Hazırlanan WPF Form içerisinde yer alan DataGrid kontrolünün içerisinde yer alan verilerin sayısının kontolün genişlik ve yükseklik değerlerinin üzerine çıkması durumunda scroll 'un çıkıp çıkmamasıdır. Kullanımı, HorizantalScrollBarVisibility ve VerticalScrollBarVisibility şeklindedir.

Anlatmış olduğumuz özellikleri de DataGrid kontrolüne ekledikten sonra karşımıza çıkan son ekran görüntüsü aşağıdaki gibi olacaktır.



Belirtmiş olduğumuz bütün özelliklerin sorunsuzca çalıştığı gözlemlenmektedir.

Sonuç olarak yazımızda WPF DataGrid kontrolünün ne işe yaradığını, ne amaçlarla kullanıldığını ve özelleştirmek istediğimizde ne tür özellikleri kullanabileceğimizi detaylı bir biçimde açıklamaya çalıştık. Tekrardan hatırtılması gereken konu ise, bu uygulama VS2010 Beta1 ve .Net FW 4.0 Beta1 sürümleri ile geliştirildi. Gelecekte çıkacak sürümlerinde değişiklik olabilme ihtimali yer almaktadır.

Herkese iyi çalışmalar diliyorum.

Umarım yararlı olabilmiştir.