Çarşamba, Mayıs 05, 2010

Visual Studio 2010 & Asp.Net MVC 2 – Code Snippet

Uygulama geliştirirken diller için hazırlanmış olan Code Snippet lar hayatımızı kolaylaştıran çok güzel bir kolaylıktır. Bu kolaylığın farkında olan Microsoft ‘ta Visual Studio 2010 ile Code Snippet ları asp markup kod tarafına da taşıyarak web uygulama geliştiricilerin oldukça rahatlamasına sağlamıştır. Özellikle benim gibi web formaların üzerine eklemiş olduğu kontrolleri sürükle-bırak ile değilde tek tek markup kodları yazan geliştiriciler için oldukça güzel bir özelliktir. Ancak bu yazımızda Asp.Net ile gelen code snippetleri değilde MVC2 ile birlikte gelenleri inceliyor olacağız.

İlk olarak code snippetları kullanmak için gerekli kısa yazımını bildikten sonra tab tuşuna iki kere basmamız durumunda kodu kendi tamamlayacak ve işlemleri yapmaya devam edebileceğiz. Ancak code snippet için tanımlanmış olan kısa yazımı bilmiyorsanız çift tab işlemi geçersiz olacaktır. Bu durumda kullanabileceğiniz code snippetlara göz atabilmeniz için CTRL+K, CTRL+X kısa yolları ile görebilirsiniz.

MVC2 Code Snippet 

Karşımıza çıkartmış olduğumuz ekran sonrasında ASP.NET MVC 2 ‘yi seçiyor ve istediklerimizi kullanmaya başlayabiliyoruz.

MVC 2 Code Snippet

Şimdi MVC 2 içerisinde en sık kullanılabilecek olan HTML ve C# snippet lara göz atalım.

HTML

actionlink

Markup snippet ASP.NET MVC için action link kodunun yazılması için kullanılmaktadır.
<%= Html.ActionLink("linktext", "actionname") %>

beginformajaxcs

Markup snippet ASP.NET MVC için AJAX-enabled forma C# ile kullanılabilmesine yardımcı olacak kodu oluşturur.
<% using (Ajax.BeginForm("actionname", new AjaxOptions {UpdateTargetId= "elementid" })) { %>
<% } %>

beginformcs

Markup snippet ASP.NET MVC için form da yardımcı kodu oluşturur.
<% using (Html.BeginForm()) { %>
<% } %>

displayforcs

Markup snippet ASP.NET MVC template yardımcısıdır.
<%= Html.DisplayFor(x => x.Property) %>

editorforcs

Markup snippet ASP.NET MVC template kod oluşturucu.
<%= Html.EditorFor(x => x.Property) %>

foreachcs

Markup snippet ASP.NET MVC için foreach kod oluşturucu
<% foreach (var item in collection) { %>
<% } %>

ifcs

Markup snippet if else blogunun sadece if blogunu oluşturur. 
<% if (true) { %>
<% } %>

ifelsecs

Markup snippet if-else blogunu oluşturur.
<% if (true) { %>
<% } else { %>
<% } %>

renderpartialcs

Markup snippet ASP.NET MVC view ‘in render edilmesi için gerekli kod blogunu oluşturur
<% Html.RenderPartial("viewname"); %>

textboxmvc

Markup snippet ASP.NET MVC textbox için gerekli olan kod blogunu oluşturur
<%= Html.TextBox("name") %>

validationsummarymvc

Markup snippet ASP.NET MVC validation bilgilendirmesi için gerekli olan kod blogunu oluşturur. 
<%= Html.ValidationSummary() %>

C#

mvcaction

Code snippet action için.
public ActionResult Action()
{
    return View();
}

mvcpostaction

Code snippet action http ‘ye göndermek için.
[HttpPost]
public ActionResult Action()
{
    return View();
}

İyi günler…

Visual Studio 2010 – Extension Manager

Visual Studio üzerinde uygulama geliştirirken kullandığımız bazı eklentiler vardır. Bunları genellikle Microsoft ‘un web sayfası içerisinde Visual Studio Gallery alt dizininden yararlanarak bulur ve kurarız. Bu işlem Visual Studio 2010 ‘un çıkışı ile birlikte daha da basitleşmiş bir şekilde karşımıza çıkıyor.

Visual Studio 2010 ‘u açtıktan sonra tools menüsünün içerisinde yer alan Extension Manager bağlantısına tıklayarak karşımıza içeriklerin yer aldığı bir ekran çıkması sağlanır.

Tools ->Extension Manager

Extension Manager bağlantı sonucunda karşımıza çıkan ekranda daha önceden yüklenmiş olan, güncellenecek ve yeni yüklenebilecek eklentilere erişebilmek mümkündür. Ayrıca daha önceden eklemiş olduğunuz ama o esnada kullanmak istemediğiniz eklentileri de yine aynı ekran üzerinde pasif duruma getirip daha sonrasında yeniden aktif duruma getirebilmeniz mümkündür.

Extension Manager

Şimdi yapmanız gereken ihtiyacınız olan eklentiyi bulup kullanmak olacaktır.

İyi günler…

Salı, Mayıs 04, 2010

WPF – TV Uygulaması

Windows Presentation Foundation (WPF) geçtiğimiz günlerde Visual Studio 2010 ve .Net Framework 4.0 'ın çıkışı ile 4.0 sürümüne geçiş yapmıştır. Gelen yenilikleri, iyileştirilmeleri ve diğer detaylı ilerleyen zamanlarda inceliyor olacağız. Ancak daha önceden başlamış olduğumuz ve WPF teknoloji içerisinde yer alan kontrolleri detaylı olarak ne iş yaptıklarını ve nasıl kullanılabileceklerini incelediğimiz çalışmalar yaptığımız yazılarımıza devam ediyor olacağız.

WPF yaygınlaştıkça ve daha önceden hazırlanan windows form uygulamaları WPF uygulama yapısına taşınma vakalarını çok daha sık bir şekilde rastlar olduk. WPF 'in bize sağladığı kolaylıkları ve olanakları yazılarımızda parça parça değinmeye çalışıyoruz. Bu sefer ise daha önceden incelemiş olduğumuz MediaElement i kullanarak televizyon görünümlü bir video oynatıcıyı nasıl hazırlayabileceğimizi incelemeye çalışıyor olacağız.

Programcılık teknikleri ve yeterlilikleri ile video oynatmak istediğimizde kullanabileceğimiz başlıca teknolojiler WPF, Silverlight, MediaPlayer API ve flash olarak başlıcaları sıralanmaktadır. Bahsetmiş olduğumuz teknolojilerden özellikle Silverlight ve WPF yardımı ile ise rahatlıkla yüksek kalitedeki videoları izleyebilir, yüksek çözünürlükteki videoları bilgisayarı ve internet bant genişliğinizi zorlamadan rahatlıkla görüntüleyebilirsiniz. Özellikle de yüksek çözünürlüklü videoların saniyede 60 kare gösterdiğini düşünürsek bu görüntü topluluklarının kesilmeden rahatlıkla izlenebilmesi çok önemli bir faktör olarak karşımıza çıkmaktadır. Peki WPF ile videoları izleme arasındaki ilişkiyi nasıl kullanacağız. Bilgidiğiniz kadarıyla MediaElement yardımı ile çabuk ve basitçe videoların görüntülenmesi mümkün. Bu sefer ise vektörel çizimleri ve Resource dosyalarını kullanarak televizyon benzeri bir tasarım oluşturup ortasına MediaElement ekledikten sonra videoyu göstererek işlemleri tamamlamış olacağız.

Öncelikli olarak oluşturmuş olduğumuz XAML tasarıma göz atalım.

<Window x:Class="TV.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="TV" Height="720" Width="720">
    <Window.Resources>
        <ControlTemplate x:Key="RadioButtonTemplate"
                  TargetType="RadioButton">
            <Grid>
                <Ellipse Width="25" Height="25" Fill="Silver" />
                <Ellipse Name="backgroundEllipse" Width="22" Height="22">
                    <Ellipse.Fill>
                        <RadialGradientBrush>
                            <GradientStop Offset="0" Color="Red"/>
                            <GradientStop Offset="1.25" Color="Black" />
                        </RadialGradientBrush>
                     </Ellipse.Fill>
                </Ellipse>
                <ContentPresenter Content="{TemplateBinding Content}" />
            </Grid>
        <ControlTemplate.Triggers>

            <Trigger Property="RadioButton.IsEnabled" Value="False">
                <Setter TargetName="backgroundEllipse" Property="Fill">
                    <Setter.Value>
                        <RadialGradientBrush>

                            <GradientStop Offset="0" Color="LightGray" />
                            <GradientStop Offset="1.25" Color="Black" />
                        </RadialGradientBrush>
                    </Setter.Value>
                </Setter>
            </Trigger>
            <Trigger Property="RadioButton.IsChecked" Value="True">
                <Setter TargetName="backgroundEllipse" Property="Fill">
                    <Setter.Value>
                        <RadialGradientBrush>
                            <GradientStop Offset="0" Color="LimeGreen" />
                            <GradientStop Offset="1.25" Color="Black" />
                        </RadialGradientBrush>
                    </Setter.Value>
                </Setter>
            </Trigger>
         </ControlTemplate.Triggers>
      </ControlTemplate>
    </Window.Resources>
    <Canvas>
        <Border Canvas.Left="150" Height="370" Width="490"
                   Canvas.Top="20" Background="MediumSeaGreen">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition />
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>
                <Border Margin="0,20,0,10" Background="Gray"
                          HorizontalAlignment="Center" VerticalAlignment="Center"
                          BorderThickness="2" BorderBrush="Silver" CornerRadius="2">
                    <MediaElement Height="300" Width="400"
                            Name="videoMediaElement" Source="
c:\users\sertur\documents\visual studio 10\Projects\WPF\TV\TV\Video\Wildlife.wmv"
                            LoadedBehavior="Manual" Stretch="Fill" />
                </Border>

                <StackPanel Grid.Row="1" HorizontalAlignment="Right"
                         Orientation="Horizontal">
                    <RadioButton Name="playRadioButton" IsEnabled="False"
                                Margin="0,0,5,15" Checked="playRadioButton_Checked"
                                Template="{StaticResource RadioButtonTemplate}">
                        <Image Height="20" Width="20" Stretch="Uniform" />
                     </RadioButton>
                     <RadioButton Name="pauseRadioButton" IsEnabled="False"
                             Margin="0,0,5,15" Checked="pauseRadioButton_Checked"
                             Template="{StaticResource RadioButtonTemplate}">
                           <Image Height="20" Width="20" Stretch="Uniform" />
                     </RadioButton>
                     <RadioButton Name="stopRadioButton" IsEnabled="False"
                          Margin="0,0,15,15" Checked="stopRadioButton_Checked"
                          Template="{StaticResource
                          RadioButtonTemplate}">
                         <Image Height="20" Width="20" Stretch="Uniform" />
                     </RadioButton>
                 </StackPanel>

                 <CheckBox Name="powerCheckBox" Grid.Row="1" Width="25"
                         Height="25" HorizontalAlignment="Left"
                         Margin="15,0,0,15" Checked="powerCheckBox_Checked"
                         Unchecked="powerCheckBox_Unchecked">

                        <CheckBox.Template>
                            <ControlTemplate TargetType="CheckBox">
                                <Grid>

                                    <Ellipse Width="25" Height="25" Fill="Silver" />
                                    <Ellipse Name="backgroundEllipse" Width="22" Height="22">
                                        <Ellipse.Fill>
                                            <RadialGradientBrush>
                                                <GradientStop Offset="0"
                                                         Color="LightGray" />
                                                <GradientStop Offset="1.25"
                                                         Color="Black" />
                                            </RadialGradientBrush>
                                        </Ellipse.Fill>
                                    </Ellipse>
                                    <Image Width="20"
                                              Height="20" />
                                </Grid>
                                <ControlTemplate.Triggers>
                                    <Trigger Property="CheckBox.IsChecked"
                                              Value="True">
                                        <Setter TargetName="backgroundEllipse" Property="Fill">
                                            <Setter.Value>
                                                <RadialGradientBrush>
                                                    <GradientStop Offset="0" Color="LimeGreen" />
                                                    <GradientStop Offset="1.25" Color="Black" />
                                                </RadialGradientBrush>
                                            </Setter.Value>
                                        </Setter>
                                    </Trigger>
                                </ControlTemplate.Triggers>
                            </ControlTemplate>
                        </CheckBox.Template>
                    </CheckBox>
                </Grid>
                <Border.RenderTransform>
                     <SkewTransform AngleY="15" />
                </Border.RenderTransform>
                <Border.BitmapEffect>
                    <BitmapEffectGroup>
                         <BevelBitmapEffect BevelWidth="10" />
                         <DropShadowBitmapEffect Color="Gray" ShadowDepth="15" Softness="1"/>
                    </BitmapEffectGroup>
                </Border.BitmapEffect>
            </Border>
            <Border Canvas.Left="185" Canvas.Top="410" Height="300"
                         Width="400">
                <Rectangle Name="reflectionRectangle">
                    <Rectangle.Fill>
                        <VisualBrush
                                    Visual="{Binding ElementName=videoMediaElement}">
                              <VisualBrush.RelativeTransform>
                                    <ScaleTransform ScaleY="-1" CenterY="0.5" />
                              </VisualBrush.RelativeTransform>
                        </VisualBrush>
                    </Rectangle.Fill>
                    <Rectangle.OpacityMask>
                        <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                               <GradientStop Color="Black" Offset="-0.25" />
                               <GradientStop Color="Transparent" Offset="0.5" />
                        </LinearGradientBrush>
                    </Rectangle.OpacityMask>
               </Rectangle>
               <Border.RenderTransform>
                    <SkewTransform AngleY="15" AngleX="-45"/>
               </Border.RenderTransform>
        </Border>
    </Canvas>
</Window>

Yukarıdaki belirttiğimiz işlemler sonrasında tasarım olarak televizyona benzettik ve MediaElement yardımı ile video izleyebilecek altyapısını sağlamış oluyoruz. Hazırlamış olduğumuz sablona ilişkin ekran görüntüsü aşağıdaki gibidir.

mak87_1

Şimdi yapmamız gereken bir diğer işlem ise aç, başlat, duraklat ve durdur özelliklerini kullanacağımız işlemleri yapacak olduğumuz işlemleri yapıyor olacağız.

using System.Windows;

namespace TV
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        private void powerCheckBox_Checked( object sender, RoutedEventArgs e )
        {
            reflectionRectangle.Visibility = Visibility.Visible;
            playRadioButton.IsEnabled = true;
            pauseRadioButton.IsEnabled = true;
            stopRadioButton.IsEnabled = true;
         }


         private void powerCheckBox_Unchecked( object sender, RoutedEventArgs e )
         {
 
             videoMediaElement.Close();
             reflectionRectangle.Visibility = Visibility.Hidden;
             playRadioButton.IsChecked = false;
             pauseRadioButton.IsChecked = false;
             stopRadioButton.IsChecked = false;
             playRadioButton.IsEnabled = false;
             pauseRadioButton.IsEnabled = false;
             stopRadioButton.IsEnabled = false;
         }

         private void playRadioButton_Checked( object sender, RoutedEventArgs e )
         {
              videoMediaElement.Play();
         }

         private void pauseRadioButton_Checked( object sender, RoutedEventArgs e )
         {
             videoMediaElement.Pause();
         }

         private void stopRadioButton_Checked( object sender, RoutedEventArgs e )
         {
             videoMediaElement.Stop();
         }
    }
}

Kod üzerindeki işlemleri de tamamladıktan sonra HD videolarıda sorunsuzca oynatabilecek televizyonumuzu hazırlamış bulunuyoruz. HD video bulabilmek için Windows 7 'nin örnek videolar bölümünü kullanabilmeniz mümkündür. Yaptımız işlemler sonrasında sol tarafta yer alan düğmeye basarak televizyonu açıyor ve görüntümüzü sorunsuzca izleyebiliyoruz.

Sonuç olarak bu yazımızda WPF ile shapes ve MediaElement nesnelerini kullanarak basit bir tv uygulamasını nasıl yapabileceğimizi incelemeye çalıştık.

Umarım sizler için yararlı olabilmiştir.

Kaynak
MSDN

Turhal Temizer

info@turhaltemizer.com

Pazartesi, Mayıs 03, 2010

Asp.Net MVC Framework - RSSFeed

Asp.Net MVC Framework – RSSFeed

 

ASP.NET MVC Framework ilk çıktığı günden bu yana gelişimi ve web geliştiricilerin üzerinde ki beğeni etkilerini incelediğimizde sürekli artan bir grafik olduğunu gözlemleriz. Bu doğrultuda artık geliştiriciler yavaş yavaş uygulamlarını MVC Framework 'e geçirmek için planlar yapıyorlar. Bu doğrultuda Asp.Net web sayfalarında yapmış oldukları yapıları da Asp.Net MVC Framework 'te kullanmak isteyeceklerdir ki bu da en olası durumdur. Daha önceden incelemiş olduğumuz konularıdaki yazılarda da değindiğimiz MVC ile hazırlanan web sayfaları gazatecilik, blog, topluluk ve bunun gibi diğer bir çok sistem için oldukça uyumlu bir yapı olduğundan defalarca bahsetmiştik. Bu web uygulamalarında en çok göze batan ve dikkat edilen özellik ise RSS bilgilerinin gösteriliyor olmadır. Bu yazımızda Asp.Net MVC Framework yardımı ile RSS bilgisini site içerisinde nasıl gösterebileceğimizi inceliyor olacağız.

İsterseniz daha önceden hazırlamış olduğunuz uygulamanızın üzerine isterseniz de yeni oluşturacağınız bir uygulamanın içeriğine controller sınıfı ekleyerek adını RSSFeedController olarak belirterek işlemlerimizi yapmaya başlıyoruz.

image.axd

Controller sınıfını oluşturduktan sonra RSS verilerini rahatlıkla işleyebilmek için projeye System.ServiceModel.Web.dll 'i referans gösteriyoruz. System.ServiceModel isim içerisinde yer alan Syndication isim alanı RSS işlemleri için gerekli olan işlemleri yapabilmemize olanak tanır.

Bu durumda bahsetmiş olduğumuz isim alanını kullanarak Controller içerisinde yer alacak olan metodu hazırlayabiliriz.

System.ServiceModel.Syndication; // System.ServiceModel.Web.dll referans olarak ekleniyor.
public class RSSFeedController : Controller
{
    public ActionResult RSSFeed()
    {
        string strFeed = "blabla.feed"; //RSS Feed adresi girilecek
        using (XmlReader reader = XmlReader.Create(strFeed))
            {
                SyndicationFeed rssData = SyndicationFeed.Load(reader);
                return View(rssData);
        }
    }
}

Controller sınfını ve içerisinde yer alacak olan ActionResult 'ı hazırladıktan sonra şimdi gerekli view 'ı oluşturup gerekli içeriği hazırlayarak işlemleri tamamlayabiliriz.


<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<SyndicationFeed>" %>
<%@ Import Namespace="System.ServiceModel.Syndication"%>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
RSSFeed
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>RSSFeed</h2>
<% foreach (var item in ViewData.Model.Items)
{
string URL = item.Links[0].Uri.OriginalString;
string Title = item.Title.Text;
Response.Write(string.Format("<p><a href=\"{0}\"><b>{1}</b></a>", URL, Title));
Response.Write("<br/>" + item.Summary.Text + "</p>");
} %>
</asp:Content>

İsim alanını ekledikten sonra RSS 'te yer alan URL, konu başlığı ve içeriğini de gösterek RSSFeed i hazırlamış oluyoruz. Yaptığımız işlemler sonrasında karşımıza çıkan ekran görüntüsü aşağıdaki gibi olacaktır.

image.axd

Sonuç olarak istediğimiz işlemi başarılı bir şekilde sağlamış oluyoruz. Yukarıda yapmış olduğumuz örnek ise Asp.Net geliştirme takımının msdn içerisindeki blogundaki içerikleri göstermektedir.

Sonuç olarak bu yazımızda System.ServiceModel.Syndacation isim alanını kullanarak RSS Feed 'in nasıl hazırlanabileceğini incelemeye çalıştık.

Umarım sizler için yararlı olabilmiştir.

Kaynak
MSDN

Turhal Temizer

info@turhaltemizer.com

Perşembe, Nisan 29, 2010

WPF – ComboBox & LivePreview

Windows Presentation Foundation (WPF) geçtiğimiz günlerde Visual Studio 2010 ve .Net Framework 4.0 'ın çıkışı ile 4.0 sürümüne geçiş yapmıştır. Gelen yenilikleri, iyileştirilmeleri ve diğer detaylı ilerleyen zamanlarda inceliyor olacağız. Ancak daha önceden başlamış olduğumuz ve WPF teknoloji içerisinde yer alan kontrolleri detaylı olarak ne iş yaptıklarını ve nasıl kullanılabileceklerini incelediğimiz çalışmalar yaptığımız yazılarımıza devam ediyor olacağız.

WPF yaygınlaştıkça ve daha önceden hazırlanan windows form uygulamaları WPF uygulama yapısına taşınma vakalarını çok daha sık bir şekilde rastlar olduk. WPF 'in bize sağladığı kolaylıkları ve olanakları yazılarımızda parça parça değinmeye çalışıyoruz. Günümüzde geliştirilen uygulamalara göz attığımızda eskiye oranla bazı yenilikler görebiliyoruz. Örneğin bunlardan benim en çok hoşuma gideni stil üzerinden bir değişiklik yapmak istediğimizde o değişikliği seçmek anlık görerek (live preview) nasıl bir sonuç elde edebileceğimizi görmek ve sonrasında beğendiğimizi seçerek işlemlerimize devam etmek olmuştur. Bu konuya en güzel örnek ise Office System 2007 ailesi ile gelen live preview özelliğini gösterebiliriz. Örneğin Word dökümanı olarak hazırlanmış olan paragraflar topluluğunu düşünelim. Bu metnin yazı tipini değiştirmek istediğimizde eskiden tek tek seçer beğenmezsek geri alır ve bir diğerini seçerdik. Şimdi ise işler biraz daha kolaylaşmış durumda. Değiştirmek istediğimiz metini seçtikten sonra yapmamız gereken yazı tiplerinin üzerinde farenin imlecini dolaştırmak olacaktır. Sonrasında olacak olan değişikler anlık olarak görüntülenecektir. Bu bizi çok büyük zaman kaybından kurtarmaktadır. Tabii tahmin edeceğiniz üzere bu uygulama şekli WPF ile yapılmaktadır. Biz bu yazımızda combo box içerisinde olan değerleri form üzerinde anlık yani live preview özelliği ile nasıl görüntüleyebileceğimizi ve kullanabileceğimizi inceliyor olacağız.

Not: Yazı içerisinde kullanılacak olan örnek Visual Studio 2010 ve .Net Framework 4.0 üzerinde geliştirilecektir.

Hatırlayacağınız üzere daha önceden kullanmış ve incelemiş olduğumuz WPF kontrollerine ilişkin olan özellikler yardımı ile yapmak istediğimiz işlemleri kolaylıkla yapabiliyorduk. Bu sefer biraz daha farklı bir kaç işlem yapacağız. İlk olarak ComboBox kontrolünün dependency nesnesini kullanacağız. Sonrasında da ComboBox 'in olaylarından OnSelectionChanged 'i kullanarak bizim için yararlı olacak iki olay daha ekleyerek işlemi tamamlamış olacağız.

Öncelikle proje bir tane sınıf ekliyor ve içerisine aşağıda yer alan kod parçasını ekliyoruz.

using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;

namespace LivePreCB
{
    public class LivePreview : ComboBox
    {
        #region DependencyProperty LivePreviewItem

        /// <summary>
        /// Gets or sets the live preview item.
        /// </summary>
        /// <value>The live preview item.</value>
        public object LivePreviewItem
        {
            get { return GetValue(LivePreviewItemProperty); }
            set { SetValue(LivePreviewItemProperty, value); }
        }

        /// <summary>
        /// Dependency property to get or set the live preview item
        /// </summary>
       public static readonly DependencyProperty LivePreviewItemProperty =
           DependencyProperty.Register("LivePreviewItem", typeof(object), typeof(LivePreview),
           new FrameworkPropertyMetadata(null));

       #endregion

       #region Construction

        /// <summary>
        /// Initializes a new instance of the <see cref="LivePreviewComboBox"/> class.
        /// </summary>
        public LivePreview()
        {
             DependencyPropertyDescriptor.FromProperty(IsDropDownOpenProperty, typeof(LivePreview))
                 .AddValueChanged(this, OnDropDownOpenChanged);
        }

        #endregion

        #region Overrides

        /// <summary>
        /// See <see cref="ComboBox.OnSelectionChanged" />
        /// </summary>
        protected override DependencyObject GetContainerForItemOverride()
        {
            var container = base.GetContainerForItemOverride();
            var comboBoxItem = container as ComboBoxItem;
            if (comboBoxItem != null)
            {
                DependencyPropertyDescriptor.FromProperty(ComboBoxItem.IsHighlightedProperty, typeof(ComboBoxItem))
                    .AddValueChanged(comboBoxItem, OnItemHighlighted);
            }
            return container;
        }

        /// <summary>
        /// See <see cref="ComboBox.OnSelectionChanged" />
        /// </summary>
        protected override void OnSelectionChanged(SelectionChangedEventArgs e)
        {
            LivePreviewItem = SelectedItem;
            base.OnSelectionChanged(e);
        }

         #endregion

         #region Private Helpers

         private void OnItemHighlighted(object sender, EventArgs e)
         {
             var comboBoxItem = sender as ComboBoxItem;
             if (comboBoxItem != null && comboBoxItem.IsHighlighted)
                 {
                     LivePreviewItem = comboBoxItem.DataContext;
                 }
         }

         private void OnDropDownOpenChanged(object sender, EventArgs e)
         {
             if (IsDropDownOpen == false)
             {
                 LivePreviewItem = SelectedItem;
             }
         }
         #endregion
    }
}

Hazırlamış olduğumuz bu sınıf yardımı ile Combox 'ın standart SelectionChanged olayını geliştirerek kontrolün içerisinde yer alan değerlerin anlık olarak görüntülenmesi için gerekli olacak olayları hazırlamış oluyor. Şimdi tek yapmamız gereken bu sınıfı kullanmak olacaktır.

ComboBox kontrolünü kullanmadan önce ilk olarak içerisinde kullanılacak olan değerleri ekleyeceğiz. Bunun için IEnumerable<> generic arayüzünü kullanacak ve çıkış değeri olarak System.Windows.Media isim alanı altında bulunan ve sistemin renk kütüphanesini kullanan Brush sınfı yardımı ile renkleri ekliyor olacağız.

using System.Collections.Generic;
using System.Windows;
using System.Windows.Media;

namespace LivePreCB
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public IEnumerable<Brush> TestData
        {
            get
            {
                yield return new SolidColorBrush(Colors.Red);
                yield return new SolidColorBrush(Colors.Purple);
                yield return new SolidColorBrush(Colors.Pink);
                yield return ne SolidColorBrush(Colors.RosyBrown);
                yield return new SolidColorBrush(Colors.PapayaWhip);
                yield return new SolidColorBrush(Colors.PaleTurquoise);
                yield return new SolidColorBrush(Colors.Peru);
            }
        }
        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;
          
}
    }
}

Generic koleksiyona renk bilgilerini ekledik ve DataContext yardımı ile sınıf içerisinde yer alan koleksiyonları almasını belirterek veri kümesini hazırlamış olduk. Artık yapmamız gereken bir nokta kaldı. Oluşturmuş olduğumuz LivePreview sınıfını XAML kod içerisinde xml namespace olarak gösterdikten sonra oluşturmuş olduğumuz TestData koleksiyonunu veri kaynağı olarak bağlayıp LivePreview özellikli ComboBox ile ilişkilendirerek işlemleri tamamlıyoruz.

<Window x:Class="LivePreCB.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:l="clr-namespace:LivePreCB"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="16">
        <StackPanel HorizontalAlignment="Left" VerticalAlignment="Top">
            <TextBlock Text="Seçilen Değer" />
            <Rectangle Width="20" Height="20" Fill="{Binding SelectedItem, ElementName=liveBox}" Margin="16" />
            <TextBlock Text="Anlık Görüntüsü" />
            <Rectangle Width="20" Height="20" Fill="{Binding LivePreviewItem, ElementName=liveBox}" Margin="16"/>
        </StackPanel>
        <l:LivePreview x:Name="liveBox" Width="80" ItemsSource="{Binding TestData}" SelectedIndex="0" Margin="16" VerticalAlignment="Top">
            <l:LivePreview.ItemTemplate>
                <DataTemplate>
                    <Rectangle Width="20" Height="20" Fill="{Binding}" />
                </DataTemplate>
            </l:LivePreview.ItemTemplate>
        </l:LivePreview>
    </StackPanel>
</Window>

LivePreview özellikli ComboBox kontrolü hazır duruma gelmiş oluyor. Bu işlemler sonucunda uygulamayı çalıştırdığımız ekran görüntüsü aşağıdaki gibi olacaktır.

ComboBox LivePreview

Oluşan sonuç tam istediğimiz gibi oluşmuştur. Yukarıda görmüş olduğunuz örneği sadece renklere göre değil aklınıza gelen diğer birçok özelliğe görede uygulamayabilmeniz mümkündür. Önemli olan hayal etmenizdir...

Sonuç olarak bu yazımızda Office System 2007 ile hayatımıza giren LivePreview özelliğini ComboBox kontrolüne nasıl aktarabileceğimizi ve kullanabileceğimizi incelemeye çalıştık.

Umarım sizler için yararlı olabilmiştir.

Kaynak
MSDN

Turhal Temizer

info@turhaltemizer.com

Çarşamba, Nisan 28, 2010

WPF – Calendar

Windows Presentation Foundation (WPF) geçtiğimiz günlerde Visual Studio 2010 ve .Net Framework 4.0 'ın çıkışı ile 4.0 sürümüne geçiş yapmıştır. Gelen yenilikleri, iyileştirilmeleri ve diğer detaylı ilerleyen zamanlarda inceliyor olacağız. Ancak daha önceden başlamış olduğumuz ve WPF teknoloji içerisinde yer alan kontrolleri detaylı olarak ne iş yaptıklarını ve nasıl kullanılabileceklerini incelediğimiz çalışmalar yaptığımız yazılarımıza devam ediyor olacağız.

Masaüstü, web ya da mobil uygulamalara göze aldığımızda sıklıkla kullanılan belirli bileşenler(component) bulunmaktadır. Bunlar programcılığın özellikle de form üzerinde uygulama geliştiren yazılımların kesinlikle hakim olması gereken bileşnlerdir. Bizde yazımızda bu bahsetmiş olduğumuz bileşenler arasında yer alan Calendar kontrolünü inceliyor olacağız.

Şimdi Calendar kontrolü üzerinde nasıl bir işlem yapılabilir ki diye düşünüldüğünde üzerinde herhangi bir tarih seçtirir ve bu seçtirmiş olduğum tarihi ya uygulama içerisinde kullanır ya da veri tabanına kaydederek işlemi tamamlamış olurum. Aslında bu düşündüğümüz kesinlikle doğru ve WPF içerisinde de bu işlemleri sorunsuzca eskiden yapabildiğimiz gibi yapabiliyoruz. Ancak bunların üzerine eklenen ek özellikler yer almaktadır. Ne gibi? Örnek olarak aklımıza şöyle bir durum getirelim. Biz belirli tarihlerde düzenlenen kongreleri kontrol eden bir otomasyon sistemi hazırlıyoruz. Bu sistemde yer alan kongrelerin doğaş olarak başlangıç ve  bitiş tarihleri bulunmaktadır. Bunları son kullanıcıya seçtirtmek isteyen yazılımcı form üzerine başlangıç ve bitiş tarihlerinin alınabildiği iki adet calendar kontrolü ekler ve gerekli işlemleri yaparak çalışmasını tamamlar. Kullanılan bu teknikte kesinlikle ama kesinlikle bir hata var demiyoruz. Ancak bazı istisnai durumlarda sorunlar çıkabilmektedir. Ne gibi bir sorun diye örneklemek gerekirse; 2 hafta süren bir kongreyi ele alalım. Bu kongre birinci hafta pzt,sal,çrş günleri düzenlenmektedir. İkinci hafta ise prş,cum günleri düzenlenmektedir. Ancak biraz önce hazırlamış olduğumuz sistemi göz önüne aldığımızda başlangıç tarihini 1 Ocak bitiş tarihini de 13 Ocak olarak seçecek ve işlem tamamlanacaktır. Bu yapılan işlemler sonrasında da kongreyi düzenleyen kurumlar 2 haftalık bir bütçe ayırmaktadır. Fakat burada çok önemli bir nokta gözümüze çarpmakta. Kongre iki hafta sürmüyor ki!!! Sadece 5 iş günü sürmektedir. Bu durumda biz bu günleri tek tek seçebilmemiz ihtiyacı doğuyor. İlk olarak vermiş olduğumuz örnekte hatırlayacağınız üzere iki tane calendar bileşeni bulunmaktaydı. Yapmış olduğumuz işlemi iki bileşen yerine tek bileşen ile tarih aralığını seçtirerekte yaptırabilme istekleri aklımıza gelmektedir. Bu işlemleri 3. parti bileşenler ile yapabilmek mümkünken bizlerin ana amacı bu işlemi kendi kontrollerimiz yardımı ile yapmaktadır. Çünkü 3. parti bileşenlerin ekstra bir maliyeti bulunmaktadır. Kullanımı oldukça basit olan calendar kontrolü üzerinde yapabileceğimiz istekleri sıraladığımızda bayaa fazla işlem yapması gerektiği fikri ortaya çıkıyor. İşte biz bu yazımızda calendar kontrolünün WPF yardımı ile yukarıda açıklamaya çalıştığımız örnekleri nasıl yapabileceğimizi açıklamaya çalışıyor olacağız.

Calendar bileşenini incelerken yapacak olduğumuz uygulamayı Visual Studio 2010 ortamında ve .Net Framework 4.0 'da inceliyor olacağız.

DisplayDate

Şimdi ile olarak basit olarak ekrana calendar bileşeni ekliyor ve herhangi bir gün değeri atayarak örneklerimize başlıyoruz.

<Calendar DisplayDate="01/01/2010"/>

Tahmin edeceğiniz üzere eklediğim DisplayDate özelliğine eklemiş olduğumuz değer sonrasında ocak ayı bizlerin karşısına gelecektir. Eğer ki bu özelliği kullanmazsak şu anın bulunduğu ay bilgisi ve günler gelecektir.

WPF Calendar

SelectionMode

İki tarih aralığını seçerken nasıl bu işlemi nasıl yapabileceğimizi nasıl yapabileceğimizi daha önceden açıklamış ve ekstradan karşımıza çıkan istisnai durumların neler olacağını açıklamıştık. İki tarih aralığını seçerken ya da bu tarihlerin arasında kalan bazı günleri seçmek istediğimizde Calendar bileşeninin SelectionMode özelliğine MultipleRange, SingleRange, SingleDate, None değerlerinden birini atamak yeterli olacaktır.

Kullanım şekli;

<Calendar SelectionMode="MultipleRange"/>

Şimdi bu değerleri kullanarak calendar bileşenini ne kadar esnekleştirebileceğimize göz atalım...

MultipleRange

Rastgele tarih aralıklarını seçebilmemize olanak tanır. Kongre örneğinde bahsetmiş olduğumuz iki hafta gibi gözüken bir ogranizasyon bütçesinin aslında beş gün olduğunu göstermek için bu değer kullanılabilir.

WPF Calendar

SingleDate

Eğer ki SelectionMode 'a SingleDate değerini verirsek son kullanıcı yalnızca tek bir tarih seçebilecektir.

WPF Calendar

SingleRange

Adında anlaşılacağı üzere sürekli tarih aralığı seçmemize olanak tanımaktadır.

mak85_3

None

Sadece tarihleri göstermek amacıyla calendar bileşenini kullanılıyorsa bu özellik idealdir. Çünkü son kullanıcının takvim üzerinden herhangi bir değer seçmesine olanak vermemektedir.

Blackout Dates

Takvim kontrolünü kullanırken seçilmesi istenmeyen tarihlerin olması durumunda SelectionMode özelliğine BlackoutDates değerini atayarak bizlerin seçebileceği değerlerin seçilemez duruma getirilebilmesine olanak tanımaktadır. Ayrıca seçilemez tarihlerin son kullanıcı tarafından rahatlıkla anlaşılabilmesi için bu tarihlerin üzerine çarpı da koymaktadır.

<Calendar SelectionMode="{Binding SelectedItem, ElementName=selectionmode}" >
    <Calendar.BlackoutDates>
        <CalendarDateRange Start="04/01/2010" End="04/27/2010" />
    </Calendar.BlackoutDates>
</Calendar>

 WPF Calendar

Calendar Mode

Bildiğiniz üzere calendar kontrolünü kullanırken sürekli olarak gün detayına kadar görüntülenmesi gerekiyordu. Ancak WPF yardımı ile Month,Year ve Decide şeklinde görüntüleyebilinmesi mümkündür. Bu değerleri DisplayMode özelliğine atayarak kullanıyoruz.

<Calendar DisplayMode="Decide"/>

WPF Calendar

Calendar bileşenin bütün özelliklerini detaylı bir şekilde inceledik. Şimdi işlemiş olduğumuz özelliklerin hepsini kolayca kullanabilmek için basit bir uygulama hazırlayacağız. Uygulama tamamen XAML üzerinde olacak ve detaylarına girmeden sadece kaynak kodları yer alacak. Çünkü içerisinde yer alan bütün özelliklere değindik ve kullanmış olduğumuz bütün kontrolleri daha önceki yazılarımızda incelemiştik.

<Window x:Class="WPFCalendar.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:System="clr-namespace:System;assembly=mscorlib"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <ObjectDataProvider x:Key="calendarSelectionMode"
            MethodName="GetNames" ObjectType="{x:Type System:Enum}">
        <ObjectDataProvider.MethodParameters>
            <x:Type TypeName="CalendarSelectionMode" />
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
    <ObjectDataProvider x:Key="displayModes"
            MethodName="GetNames" ObjectType="{x:Type System:Enum}">
        <ObjectDataProvider.MethodParameters>
            <x:Type TypeName="CalendarMode" />
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
</Window.Resources>
<Grid>
    <TabControl TabStripPlacement="Left">
        <TabItem Header="Selection Modes">
            <DockPanel>
                <StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Margin="8">
                    <TextBlock Margin="4,0" VerticalAlignment="Center">Selection Mode:</TextBlock>
                    <ComboBox x:Name="selectionmode" ItemsSource="{Binding Source={StaticResource calendarSelectionMode}}" SelectedIndex="0" />
                </StackPanel>
                <Calendar SelectionMode="{Binding SelectedItem, ElementName=selectionmode}" />
            </DockPanel>
        </TabItem>
    <TabItem Header="Blackout Dates">
        <Calendar SelectionMode="{Binding SelectedItem, ElementName=selectionmode}" DisplayDate="01.01.2010" >
             <Calendar.BlackoutDates>
                 <CalendarDateRange Start="01/01/2010" End="01/06/2010" />
             </Calendar.BlackoutDates>
        </Calendar>
    </TabItem>
    <TabItem Header="Date Range">
        <Calendar DisplayDateStart="01/01/2010" DisplayDateEnd="01/15/2010" />
    </TabItem>
    <TabItem Header="DisplayMode">
        <DockPanel>
            <StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Margin="8">
                <TextBlock Margin="4,0" VerticalAlignment="Center">Selection Mode:</TextBlock>
                <ComboBox x:Name="displayModes" ItemsSource="{Binding Source={StaticResource displayModes}}" SelectedIndex="0" />
            </StackPanel>
            <Calendar DisplayMode="{Binding SelectedItem, ElementName=displayModes}" />
        </DockPanel>
     </TabItem>
   </TabControl>
  </Grid>
</Window>

Yukarıdaki kod parçasını derleyip çalıştırdıktan sonra karşımıza gelen ekran görün

WPF Calendar

Hazırlamış olduğumuz bu son örnek yardımı ile Calendar bileşenini incelemeyi tamamlamış oluyoruz. Umarım sizler için yararlı olabilmiştir.

Kaynak
MSDN

Turhal Temizer

Salı, Nisan 27, 2010

Yazgeliştir Zirvesi Mayıs 2010






Yazgeliştir etkinliklerinin en yenisi olan Yazgeliştir Zirvelerinin ilki 29 Mayıs Cumartesi günü Microsoft İstanbul ofisinde gerçekleştirilecek. Etkinlikte Microsoft Regional Director (RD), Microsoft Most Valuable Professional (MVP) ve Yazgeliştir editörleri konuşmacı olacak. Microsoft’un çeşitli yazılım geliştirme ürün ve araçları ile ilgili seminerlere katılabilir, Visual Studio 2010, SQL Server 2008 R2, ASP.Net 4.0, Sharepoint 2010 ile gelen yenilikleri konunun uzmanlarından öğrenebilirsiniz. Etkinlikte aynı zamanda Yazgeliştir editörleri ile bir araya gelip kendilerine danışmak istediğiniz konularda sorular sorabilirsiniz.


29 Mayıs 2010, Microsoft İstanbul Ofisi


Kayıt olmak için
tıklayın!

Perşembe, Nisan 22, 2010

Enterprise Library 5.0

Data, ön bellek, şifreleme, istisnai durumlar ve daha bir çok özelliği hazırlamış olduğumuz uygulamalarda daha esnek ve kolay geliştirmemize olanak tanıyan Enterprise Library ‘nin 5 sürümünü aşağıdaki linkten indirebilirsiniz. Bizlere sağladığı olanaklar aşağıdan erişebilirsiniz.

  • •Major architectural refactoring that provides improved testability and maintainability through full support of the dependency injection style of development
  • •Dependency injection container independence (Unity ships with Enterprise Library, but you can replace it with a container of your choice)
  • •Programmatic configuration support, including a fluent configuration interface and an XSD schema to enable IntelliSense
  • •Redesign of the configuration tool to provide:
    •     •A more usable and intuitive look and feel
    •     •Extensibility improvements through meta-data driven configuration visualizations that replace the requirement to write design time code
    •     •A wizard framework that can help to simplify complex configuration tasks
    • •Data accessors for more intuitive processing of data query results
    • •Asynchronous data access support
    • •Honoring validation attributes between Validation Application Block and DataAnnotations
    • •Integration with Windows Presentation Foundation (WPF) validation mechanisms
    • •Support for complex configuration scenarios, including additive merge from multiple configuration sources and hierarchical merge
    • •Optimized cache scavenging
    • •Better performance when logging
    • •A reduction of the number of assemblies
    • •Support for the .NET 4.0 Framework and integration with Microsoft Visual Studio 2010
    • •Improvements to Unity

    İyi çalışmalar…

 

Salı, Nisan 13, 2010

WPF – TextBox SpellCheck

WPF ile uygulama hazırlamanın kolaylıklarından onlarca kez bahsettik. Bu sefer çook kısaca benim en çok hoşuma giden özelliklerden birine değineceğiz. Türkçeye metin düzeltme ya da kelime düzeltme olarak çevrilen Spell Checker özelliği.

Son kullanıcıların metin yazabilmesi için genellikle TextBox bileşenini kullandırırız. Bu güzel bileşenin özelliklerinde WPF ile birlikte gözle görülür bir gelişme yaşanmıştır. Bunlardan bir tanesine SpellCheck özelliğidir. Form üzerine TextBox bileşenini ekledikten sonra özelliklerini aşağıdaki gibi basitçe kullanıyoruz.

<StackPanel>
        <TextBlock Text="Dunya çok güzelmiş."/>
        <TextBox SpellCheck.IsEnabled="True" Language="EN-us"></TextBox>
    </StackPanel>

Koyu renk ile belirtilmiş olan bölümü ekledikten sonra uygulamayı çalıştırıyor ve çıkan sonucun nasıl olduğuna göz atıyoruz.

WPF TextBox Turhal

Yukarıdaki ekranda da gördüğümüz üzere Office Word ‘den de alışık olduğumuza benzer bir görünüm kazanmış oluyor ve sisteme tanımlı olan dil kütüphanelerini kullanabilmemize olanak tanımış oluyoruz.

Ayrıca bizlerin harici olarak oluşturmuş olduğumuz kütüphaneleri de kullanabilmemiz mümkündür.

İyi günler…

Yazgeliştir Webinerleri

YG_Webiner_Logo

Nisan ve Mayıs aylarında 4 farklı webiner gerçekleştireceğiz ve değineceğimiz konular Microsoft CRM Dynamics and Extendibility, WCF Ria Services, Windows Mobile 6.5 ile Web Widgets Geliştirmek, Windows Embedded CE 6.0 R3 - Silverlight Uygulaması Geliştirmek olacak.
Tüm Yazgeliştir topluluğunun davetli olduğu bu webinerlere aşağıdaki linklerden katılabilirsiniz.
Not: Webinerlere katılmak için bilgisayarınızda Windows Live Meeting'in kurulu olması gerekmektedir. Ayrıca webiner linkleri webiner saatinden 30 dakika önce aktifleşecektir.

Microsoft Crm Dynamics and Extendibility
14 Nisan 21:00-22:00
Eralp Erat
https://www.livemeeting.com/cc/usergroups/join?id=K9RBHB&role=attend

WCF Ria Services
28 Nisan 21:00-22:00
Emre Coşkun
https://www.livemeeting.com/cc/usergroups/join?id=BNK9WS&role=attend

Windows Mobile 6.5 - Web Widgets Geliştirmek
12 Mayıs 21:00-22:00
Ekin Özçiçekçiler
https://www.livemeeting.com/cc/usergroups/join?id=GB8FC5&role=attend

Windows Embedded CE 6.0 R3 - Silverlight Uygulaması Geliştirmek
26 Mayıs 21:00-22:00
Hasan Aytış
https://www.livemeeting.com/cc/usergroups/join?id=PRP2G2&role=attend

Pazartesi, Nisan 12, 2010

Visual Studio 2010 – RTM

Visual Studio 2010 çıktı.

Uzun bir gelişme sürecinin ardından Visual Studio 2010 resmi olarak satışa sunuldu.Visual Studio 2010

IDE üzerinde WPF ‘in nimetlerinden yararlanılarak yapılan değişiklikler, WWF ‘in tasarımın ve akış tiplerinin yenilenmesi, F# dilinin entegre edilmesi, MVC 2 ile beraber gelmesi ve diğer bir çok özelliği ile bugün VS2010 çıkmış bulunuyor. Deneme sürümünü indirip kurmak isteyenler aşağıda verecek olduğum linkten yararlanabilirler. Almak isteyenler için ise Visual Studio 2010 Ultimate satış fiyatı $11850. :)

http://www.microsoft.com/visualstudio/en-us/download