Caner Tosuner

Leave your code better than you found it

C# Ref ve Out Kullanımı

Object-Oriented programramming ile birlikte günümüz PC'lerinin de geçmişe göre bir hayli performanslı olması biz developer'ları git gide programlama dili & RAM ilişkisinden uzaklaştırıyor. Çok iyi hatırlıyorum üniversite 1. sınıfta C++ dersi almıştım ve dersi anlatan hoca ilk derste yanılmıyorsam şöyle bir cümle kurmuştu "Muhtemelen birçoğunuz ilk ve son defa bu derste Programlama ve RAM ilişkisini bu kadar yakından öğrenme şansınız olacak..". Tabi hoca bunu söylerken ne yazık ki bizde öyle çokta anlıyormuş gibi dinlememiştik. C# programlama dilinde kullanılan veri tiplerini 2 başlıkta tanımlayabiliriz. Değer tipleri ve Referans tipleri.

Kısaca tanımlamak gerekirse, değer tipler; ram de kaplayacağı alanı belli olan int,double,byte vs gibi struct olan tiplerdir ve stack'de bulunurlar. Referans tipler; string,object, kendi yazdığımız custom objeler bunlar ram'de kaplayacakları alan belli olmadığından heap'de tutulurlar. 

Gelelim konumuzun başlığında bulunan "ref" ve "out" parametrelerimize. C# da kullanıma sunulan ref ve out isminde iki tane parametre tanımlama çeşidi bulunmakta. Bu kullanımlarla birlikte ref ve out parametreleriyle yazmış olduğumuz metodlara değişkenleri göndermeden önceki değerleri ile metoddan çıktıktan sonraki değerleri kullanıma göre farklılıklar göstermektedir. Aslında ref veya out ile tanımlandığında RAM'de ne oluyor tanımlanmadığında ne oluyor, aralarında ne gibi farklar var bunları incelicez.

 

Geliştirme yaparken tanımlamış olduğumuz parametre alan metodları kullanmak istediğimizde ilgili metoda parametre geçme işlemi 2 yolla yapılır "pass by value" ve "pass by reference". Kısaca tanımlamak  gerekirse ;

  • Pass by value fonksiyona parametre gönderirken o parametrenin bir kopyasının oluşturulup gönderilmesi ve metod içerisinde yapılan değişikliklerden metod içerisinde ki yeni değerin etkilenmesi,
  • Pass by reference fonksiyona parametre gönderirken o parametrenin ram'de adresinin gönderilip metod içerisindeki yapılan değişiklerden orjinal değerin etkilenmesi.

 

Ref - Out Nedir den önce aşağıdaki örneği bir inceleyelim; C# da geriye herhangi bir değer dönmeyen bir metod yazalım ve içerisine int tipinde 3 değişken alsın sonrasında bu değerlerden birini metod içerisinde değiştirsin ve değişkenin metoddan önceki ve sonraki değerlerine bir bakalım 

public class RefOutExample
{
    static void Main()
    {
        int originalValue = 43;
 
        Console.WriteLine("ChangeMethod'dan önce: " + originalValue);//Output 43
 
        ChangeMethod(1,3,originalValue);
 
        Console.WriteLine("ChangeMethod'dan sonra: " + originalValue); //Output 43
    }
    static void ChangeMethod(int x, int y, int i)
    {
        i = i+x+y;//47
    }
}

 

Yukarıda ki örnekte ChangeMethod'isimli metoda parametreyi geçereken değişkenin orjinal halini değilde bir örneğini geçtiğimizden metod içerisinde ki değişiklik orjinal değeri etkilemedi.

 

C# Ref Kullanımı

Value Type'lar metodlara birebir kopyası oluşturularak geçirilirler ve metod içerisinde o değişkenle ilgili yapılan değişikliklerden orjinal değer etkilenmez. Ancak bazen değer tiplerini de referansları ile metodlara parametre olarak vermek isteyebiliriz. Referans yolu ile metoda parametre olarak geçtiğimiz değişken üzerinde yapılacak bütün değişiklikler orjinal değeri etkileyecektir çünkü artık o metod içerisinde değişkenin bir kopyası değilde RAM'de ki adresi bulunmaktadır. Örnek kullanımı aşağıdaki gibidir.

using System;
					
public class RefOutExample
{
   public static void Main()
    {
        int originalValue = 43;

        Console.WriteLine("ChangeMethod'dan önce: " + originalValue);//Output 43

        ChangeMethod(1,3,ref originalValue);

        Console.WriteLine("ChangeMethod'dan sonra: " + originalValue); //Output 47
    }

    static void ChangeMethod(int x,int y, ref int i)
    {
        i = i+x+y;//47
    }
}
 

Yukarıda görüldüğü gibi ChangeMethod'una bu sefer parametreyi ref keyword'ü kullanarak geçtik ve bu metoda o değişkenin örneğini değilde RAM'de bulunan adresini geçtiğinden "i" parametresi metodu çağırırken kullandığımız "originalValue" değerine refer ettiğinden yapılan bir değişiklik "originalValue" parametresinin kendisine yapılmıştır.

 

Ref'in Özellikleri

  • Metodu tanımlarken referans yolu ile iletilmek istenen değişkenin önüne "ref" yazılmalıdır. 
  • originalValue değişkeni metoda parametre olarak geçilmeden önce bir başlangıç değeri almak zorundadır,
  • "i" değişkeni metod içerisinde herhangi bir değişiklik yapmadan da kullanılabilir.

   

C# Out Kullanımı

Out aslında ref ile hemen hemen aynı amaca hizmet ediyor diyebiliriz. Ancak ref ile aralarında temel 2 farklılık var bunları aşağıda ki Ref-Out Farklılıkları başlığında yazıyor olacağım

 

Out'un Özellikleri

  • Metodu tanımlarken geçilmek istenen değişkenin önüne "out" yazılmalıdır. 
  • originalValue değişkeni metoda parametre olarak geçilmeden önce bir başlangıç değeri almak zorunda değildir.
  • "i" değişkeni metod içerisinde herhangi bir değişiklik yapmadan kullanılamaz.

 

Yukarıda Ref için yazdığımız metodun aynısını Out içinde yazalım

using System;
					
public class RefOutExample
{
   public static void Main()
    {
        int originalValue;

        ChangeMethod(1,3,ref originalValue);

        Console.WriteLine("ChangeMethod'dan sonra: " + originalValue); //Output 47
    }

    static void ChangeMethod(int x,int y, out int i)
    {
        i = i+x+y;//47
    }
}

 

Ref-Out Farklılıkları

Ref Out
Metodu tanımlarken geçilmek istenen değişkenin önüne "ref" yazılmalıdır. Metodu tanımlarken geçilmek istenen değişkenin önüne "out" yazılmalıdır.
originalValue değişkeni metoda parametre olarak geçilmeden önce bir başlangıç değeri almak zorundadır. originalValue değişkeni metoda parametre olarak geçilmeden önce bir başlangıç değeri almak zorunda değildir.
"i" değişkeni metod içerisinde herhangi bir değişiklik yapmadan da kullanılabilir. "i" değişkeni metod içerisinde herhangi bir değişiklik yapmadan kullanılamaz.

   

Aynı metodda hem "ref" hem "out" kullanımı

Gelin birde hem ref hem out tanımlı parametreleri olan bir metod kullanalım

using System;
					
public class RefOutExample
{
   public static void Main()
    {
        int refValue=5;//başlangıç değeri atanması zorunludur.
        int outValue;//başlangıç değeri atanması zorunlu değildir.

        ChangeMethod(out outValue, ref refValue);

        Console.WriteLine("ChangeMethod'dan sonra refValue : " + refValue); //Output 7
        Console.WriteLine("ChangeMethod'dan sonra outValue: " + outValue); //Output 8
    }

    static void ChangeMethod(out int i,ref int j)
    {
          i = 8; // i argümanına bir değer atamak zorunludur
          j = j + 2; // j için böyle bir zorunluluk yoktur
    }
}

 

Daha çok C - C++ dillerinde etkin bir şekilde kullanılan pass by reference C# dilinde de developer'ların kullanımına sunulmuş. Birden fazla parametre dönmesini istediğimiz metodlar da veya orjinal veri üzerinde method içerisinde işlem yapmak istediğimizde ref ve out keywordlerinden kolayca faydalanabiliriz.

C# Destructor Nedir ?

Destructor kısaca constructor'ın tam tersidir.Constructor için bir nesnenin instance'ı alınırken Ram'de ki Heap bölümünde yer ayırmadan önce çağrılan metod diyebiliriz. Destructor tam bu nesne ram'den silinmeden önce çağrılan metod dur. 

Peki neden buna gerek var dersek; garbage collector sağ olsun bizim için ram'de işleri bitmiş nesneleri ram'den siliyor ve bazen tam bu silinme anını bilmek isteriz. Aslında C# tarafında çok fazla ihtiyaç duyulan bir şey değil ancak C-C++ gibi Ram yönetimini developer'a bırakan programlama dillerinde Destructor'a çok fazla ihtiyaç duyuluyordu. C# ram yönetimini tamamiyle developer'a bırakmadığından gerek kalmadıkça bu metodu kullanmıyoruz.

Destructor Özellikleri

  • Her class'ın sadece bir tane Destructor'ı olabilir,
  • Destructor tanımlanırken class ismini başına "~" işareti koyulur,
  • Struct'lar için tanımlanamaz, sadece class'lar için tanımlanırlar,
  • Dışarıdan çağrılamaz, otomatik olarak invoke olur,
  • Destructor parametre alamaz.
  • Kalıtım yapılamazlar ve overload edilemezler.

 

Örnek kullanım olarak;

	class Person
	{
		~Person()  // destructor
		{
			// cleanup statements...
		}
	}

Kullanımı yukarıda olduğu gibidir. Yazım olarak Constructor tanımlar gibi yazıyoruz ancak isminin başına "~" işaretini koyuyoruz.

sealed class nedir

Kalıtım nesneye dayalı programlamada ki en büyük etkendir. Projede tanımladığımız bir class başka bir class veya interface'den ihtiyaca göre inheret olabilir ve böylelikle bir nevi oop'nin faydalarından yararlanmış oluruz. Ancak bazen yazmış olduğumuz bir class'ın başka class'lara kalıtım vermesini istemeyebiliriz. Neden böyle bir şeye ihtiyaç duyalım ki dersek genellikle security konularından dolayı böyle bir durum söz konusu olabilir. C# tarafında bu ihtiyacımızı karşılayacak olan sealed  keyword'ü bulunmaktadır. Eğer bir class sealed tanımlanırsa bu class alt class'lara kalıtım veremez.

Örnek olarak ; sealed tanımlı A class'ımız olsun ve 2 tanede sealed olmayan B,C adında class'larımız olsun

// Sealed class
sealed class A
{

} 
public class B
{

} 

//Sorunsuz çalışır
public class C : B
{

} 


//Hata verir !!!  cannot derive from sealed type 'A'
public class C : A
{

} 

C class'ı B class'ından kalıtım alabilirken A class'ından kalıtım alamayacaktır. Çünkü A class'ı sealed'dır ve başka hiçbir class'a kalıtım veremez. 

.Net Framework içerisinde bir çok sealed class bulunmaktadır. Bunlardan en tanınmış olanı String class'ı dır. Bu nedenledir ki herhangi bir class String class'ından kalıtım almaya çalıştığında "cannot derive from sealed type 'string'" hatasını verir. 

Windows Phone 8.1 XAML Controls

Control

Desc

AppBar Bottom

Displays an AppBar at the bottom of the window

AutoSuggestBox

Text input with suggestions

Border

Visual border

Button

Clickable button

Canvas

Absolute positioning layout container

CaptureElement

Captures input from a camera device

CheckBox

Checkbox

ComboBox

Combobox

CommandBar
See AppBar

Handles the placement of AppBarButton elements

ContentControl

A control that has a single element of content

ContentDialog

WP8.1 'MessageBox'
See MessageDialog for Win8.1

ContentPresenter

Acts as a place-holder in a control template for the control's content

DatePicker

Date selection

DatePickerFlyout

Displays a full-screen date picker

Ellipse

Shape

FlipView

Displays a collection of items, one at a time

Flyout

Displays a non-modal window

Grid

Used to layout other controls (children) in a row/column matrix

GridView

Displays a horizontal grid of items

Hub

Displays data in horizontal sections

Hyperlink

Displays a hyperlink inside TextBlock and RichTextBlock elements

HyperlinkButton

Displays a hyperlink

Image

Displays an image

ItemsControl

A control that displays a collection of elements

ItemsPresenter

Acts as a place-holder in a control template for a list of items

Line

Shape

ListBox

Displays a list of items

ListPickerFlyout

Displays a full-screen flyout list of items

ListView

Displays a collection of items in a list that scrolls vertically

MapControl

Displays a map

MediaElement

Plays audio and video

MenuFlyout

Displays a flyout menu

Path

Shape

PasswordBox

Displays a password entry text box

PickerFlyout

Creates a custom flyout

Pivot

Manages a horizontally scrolled collection of page-like pivot items

Polygon

Shape

Polyline

Shape

Popup

Defines a custom container for other XAML elements

ProgressBar

Displays a progress bar

ProgressRing

Displays a progress ring

RadioButton

Allows the selection of a single item in a group

Rectangle

Shape

RepeatButton

A button that raises a Click event repeatedly until released

RichEditBox

Text box with rich formatting

RichTextBlock

Same as TextBlock but with rich formatting

ScrollBar

Scrollbar with thumb

ScrollViewer

Presents content in a view that may be panned and zoomed

SemanticZoom

Allows the user to zoom between two views of a collection of items

Slider

Allows the user to quickly specify a value by moving a thumb control

StackPanel

Container that layouts out other elements in a horizontal or vertical fashion

TextBlock

Displays text (non-editable)

TextBox

Allows the user to edit text

TimePicker

Time selection

TimePickerFlyout

Displays a full-screen time picker

ToggleButton

A button which can represent two states

ToggleSwitch

Displays an "on/off" switch representing a boolean value

Tooltip

Displays context help for an element

UserControl

Allows the creation of custom controls

VariableSizedWrapGrid

Display items in multiple rows and columns. See also WrapGrid

Viewbox

Container that scales content to a specific size

WebView

Displays a browser

WrapGrid

Display items in rows and columns. See also VariableSizedWrapGrid

 

 

 

 

Smart Home Project

Summary

Smart Home project provides users to control the electronic devices via it’s desktop application and mobile application. User can create scenarios which are “Arrive” and “Leave” scenarios and they can create feature events about sensors or electronic devices which are time-based and the system perform these events according to the different device types. All the actions process on the system are logged in the database and reports to the user.

 

 

Desktop Application

There is a laptop which is connected to the arduino and it receives and sends data from cloud system to arduino board or arduino board to cloud system. Users can access the in time data that comes from arduino board and it is displayed on a page which works on desktop application. They can create “Arrive” and “Leave” scenarios or they can create feature events using that application.

 

 

Cloud

 In the cloud side all data and necessary files are stored on azure cloud services. All the tables in the database have been developed by using MS-SQL, and using Entity Framework technology insertion, deletion and update operations performed. There is a virtual machine runs on azure and it communicates with mobile application and desktop application the process the commands.

 

 

 

 

Mobile Application

 There is an application which works on Windows Phone operating system. Users who has Windows Phone device can install the application and login. After processing some security functions they can easily display the device status and values of the sensors that are in smart home system.

 

Use Case Diagram

 

JQuery Mobile Google Analytics kodu ekleme

JQuery Mobile website geliştirip içerisine Google Analytics script'i eklemek istediğinizde tek yapmanız gereken http://www.google.com/analytics/ adresine giderek uygulamanızı oluşturmanız ve Google'ın size verdiği ID'yi alarak aşağıdaki script'te ilgili yere yazmanız.

 

<scripttype="text/javascript">

 

var _gaq = _gaq || [];

 

_gaq.push(['_setAccount', 'Google-App-ID']);

 

_gaq.push(['_trackPageview']);

 

(function () {

var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;

ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';

var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);

})();

 

</script>

 

Üstte bulunan bu script'i <head> </headtagleri arasına yazıp Google'ın sitenizle ilgili verileri tutmasını sağlayabilirsiniz.

 

MSP ler kitap yazdı !

Windows Phone 8 İçin Uygulama Geliştirme Rehberi

 

Microsoft Student Partners Türkiye ekibinin yaklaşık 1 yıldır üzerinde çalıştığı Windows Phone 8 kitabı Ocak 2014′de yayınlandı. Hızlı değişim ve gelişim gösteren teknoloji ile aynı anda öğrenmenin çok zor olduğu bu dönemde MSP Türkiye ekibi ülkemizde Windows Phone programlama öğrenme hızını biraz daha arttırabilmek amacıyla kolları sıvadı.

 

Windows Phone 8 için Uygulama Geliştirme Rehberi, MSP liderleri ve MSP’ler tarafından planlandı ve yürütüldü. Liderler bu projede yer almak isteyen MSP’leri belirledi. Gönüllü olan öğrenciler ile kitapta yer alacak üniteleri belirledikten sonra konular kişilere dağıtıldı ve bireysel çalışma aşamasına geçildi. Microsoft Virtual Academy, Channel9 gibi online eğitim sitelerinden kendi konuları ile ilgili teknik bilgiler toplayan MSP’ler bu bilgileri kendi tecrübeleri ile birleştirerek yazıya döktüler. Bu projeyi bir an önce sonuçlandırabilmek için düzenli aralıklarla toplanıp projenin durumu gözden geçirildi. Disiplini elden bırakmayan MSP Türkiye ekibi bu verimli çalışmasının meyvesini bu ay aldı ve rehber D&R ve İdefix gibi marketlerde yerini aldı.

Windows Phone 8 Uygulama Geliştirme Rehberi, Windows Phone 8 uygulaması geliştirmek isteyen birinin başka bir şeye ihtiyacı olmadan bu kitabı takip ederek kısa sürede Windows Phone 8 programlamayı öğrenmesini mümkün kılıyor. Tamamen Türkçe içeriğe sahip bu kitap, Windows Phone sayfa tasarımı, harita kullanımı, uygulamanızın Windows Azure ile entegrasyonu gibi konularda bilgiler içeren 23 bölümden oluşuyor. Windows Phone 8 Uygulama Geliştirme Rehberi’ne ulaşmak isterseniz PusulaD&R ve Idefix linklerine tıklamanız yeterli! 

 

TextBox InputScope only Letters

 

        private void TextBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
        {
            if (e.Key >= Key.A && e.Key <= Key.Z)
            {
                e.Handled = false;
            }
            else if (e.Key == Key.Space)
                e.Handled = false;
            else
                e.Handled = true;
        }

ExpanderView without left side Line

Expander Style        

<Style x:Key="ExpanderViewStyle" TargetType="toolkit:ExpanderView">
            <Setter Property="HorizontalAlignment" Value="Stretch"/>
            <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            <Setter Property="ItemsPanel">
                <Setter.Value>
                    <ItemsPanelTemplate>
                        <StackPanel/>
                    </ItemsPanelTemplate>
                </Setter.Value>
            </Setter>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="toolkit:ExpanderView">
                        <Grid>
                            <Grid.Resources>
                                <QuadraticEase x:Key="QuadraticEaseOut" EasingMode="EaseOut"/>
                                <QuadraticEase x:Key="QuadraticEaseInOut" EasingMode="EaseInOut"/>
                            </Grid.Resources>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="41"/>
                                <ColumnDefinition Width="*"/>
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="Auto"/>
                            </Grid.RowDefinitions>
                            <VisualStateManager.VisualStateGroups>
                                <VisualStateGroup x:Name="ExpansionStates">
                                    <VisualStateGroup.Transitions>
                                        <VisualTransition From="Collapsed" GeneratedDuration="0:0:0.15" To="Expanded">
                                            <Storyboard>
                                                <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Height)" Storyboard.TargetName="ItemsCanvas">
                                                    <EasingDoubleKeyFrame EasingFunction="{StaticResource QuadraticEaseOut}" KeyTime="0:0:0.00" Value="0"/>
                                                    <EasingDoubleKeyFrame x:Name="CollapsedToExpandedKeyFrame" EasingFunction="{StaticResource QuadraticEaseOut}" KeyTime="0:0:0.15" Value="1"/>
                                                </DoubleAnimationUsingKeyFrames>
                                                <DoubleAnimation Duration="0" To="1.0" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="ItemsCanvas"/>
                                            </Storyboard>
                                        </VisualTransition>
                                        <VisualTransition From="Expanded" GeneratedDuration="0:0:0.15" To="Collapsed">
                                            <Storyboard>
                                                <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Height)" Storyboard.TargetName="ItemsCanvas">
                                                    <EasingDoubleKeyFrame x:Name="ExpandedToCollapsedKeyFrame" EasingFunction="{StaticResource QuadraticEaseInOut}" KeyTime="0:0:0.00" Value="1"/>
                                                    <EasingDoubleKeyFrame EasingFunction="{StaticResource QuadraticEaseInOut}" KeyTime="0:0:0.15" Value="0"/>
                                                </DoubleAnimationUsingKeyFrames>
                                                <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="ItemsCanvas">
                                                    <EasingDoubleKeyFrame EasingFunction="{StaticResource QuadraticEaseInOut}" KeyTime="0:0:0.00" Value="1.0"/>
                                                    <EasingDoubleKeyFrame EasingFunction="{StaticResource QuadraticEaseInOut}" KeyTime="0:0:0.15" Value="0.0"/>
                                                </DoubleAnimationUsingKeyFrames>
                                                <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)" Storyboard.TargetName="ItemsCanvas">
                                                    <EasingDoubleKeyFrame EasingFunction="{StaticResource QuadraticEaseInOut}" KeyTime="0:0:0.00" Value="0.0"/>
                                                    <EasingDoubleKeyFrame EasingFunction="{StaticResource QuadraticEaseInOut}" KeyTime="0:0:0.15" Value="-35"/>
                                                </DoubleAnimationUsingKeyFrames>
                                            </Storyboard>
                                        </VisualTransition>
                                    </VisualStateGroup.Transitions>
                                    <VisualState x:Name="Collapsed">
                                        <Storyboard>
                                            <DoubleAnimation Duration="0" To="0" Storyboard.TargetProperty="(FrameworkElement.Height)" Storyboard.TargetName="ItemsCanvas"/>
                                            <DoubleAnimation Duration="0" To="0.0" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="ItemsCanvas"/>
                                        </Storyboard>
                                    </VisualState>
                                    <VisualState x:Name="Expanded">
                                        <Storyboard>
                                            <DoubleAnimation Duration="0" Storyboard.TargetProperty="(FrameworkElement.Height)" Storyboard.TargetName="ItemsCanvas"/>
                                            <DoubleAnimation Duration="0" To="1.0" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="ItemsCanvas"/>
                                        </Storyboard>
                                    </VisualState>
                                </VisualStateGroup>
                                <VisualStateGroup x:Name="ExpandabilityStates">
                                    <VisualState x:Name="Expandable"/>
                                    <VisualState x:Name="NonExpandable">
                                        <Storyboard>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="ExpandableContent">
                                                <DiscreteObjectKeyFrame KeyTime="0:0:0.0" Value="Collapsed"/>
                                            </ObjectAnimationUsingKeyFrames>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="Line">
                                                <DiscreteObjectKeyFrame KeyTime="0:0:0.0" Value="Collapsed"/>
                                            </ObjectAnimationUsingKeyFrames>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="NonExpandableContent">
                                                <DiscreteObjectKeyFrame KeyTime="0:0:0.0" Value="Visible"/>
                                            </ObjectAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                </VisualStateGroup>
                            </VisualStateManager.VisualStateGroups>
                            <ListBoxItem x:Name="ExpandableContent" Grid.ColumnSpan="2" Grid.Column="0" toolkit:TiltEffect.IsTiltEnabled="True" Grid.Row="0" Grid.RowSpan="2">
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="41"/>
                                        <ColumnDefinition Width="*"/>
                                    </Grid.ColumnDefinitions>
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="Auto"/>
                                        <RowDefinition Height="Auto"/>
                                        <RowDefinition Height="Auto"/>
                                    </Grid.RowDefinitions>
                                    <ContentControl x:Name="Header" Grid.ColumnSpan="2" ContentTemplate="{TemplateBinding HeaderTemplate}" Content="{TemplateBinding Header}" Grid.Column="0" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" Grid.Row="0"/>
                                    <ContentControl x:Name="Expander" ContentTemplate="{TemplateBinding ExpanderTemplate}" Content="{TemplateBinding Expander}" Grid.Column="1" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" Margin="11,0,0,0" Grid.Row="1"/>
                                    <Grid x:Name="ExpanderPanel" Background="Transparent" Grid.ColumnSpan="2" Grid.Column="0" Grid.Row="0" Grid.RowSpan="2"/>
                                </Grid>
                            </ListBoxItem>
                            <ContentControl x:Name="NonExpandableContent" Grid.ColumnSpan="2" ContentTemplate="{TemplateBinding NonExpandableHeaderTemplate}" Content="{TemplateBinding NonExpandableHeader}" Grid.Column="0" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" Grid.Row="0" Grid.RowSpan="2" Visibility="Collapsed"/>
                            <Canvas x:Name="ItemsCanvas" Grid.Column="1" Margin="11,0,0,0" Opacity="0.0" Grid.Row="2">
                                <Canvas.RenderTransform>
                                    <CompositeTransform TranslateY="0.0"/>
                                </Canvas.RenderTransform>
                                <ItemsPresenter x:Name="Presenter"/>
                            </Canvas>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

 

Use style in control

<toolkit:ExpanderView x:Name="ExpanderToday"  Style="{StaticResource ExpanderViewStyle}">

 

Windows Phone PasswordBox with numeric Input Scope

First, define below variables at class level

string_enteredPasscode="";
string_passwordChar="*";

 

Second, trigger TextBox KeyUp event that you use in xaml,

 privatevoidTextBox_KeyUp(objectsender, System.Windows.Input.KeyEventArgse)
        {
            if (tbCvv.Text.Length==3) return;
            _enteredPasscode=GetNewPasscode(_enteredPasscode, e);
            tbCvv.Text=Regex.Replace(_enteredPasscode, @".", _passwordChar);
 
            tbCvv.SelectionStart=tbCvv.Text.Length;
        }
 
        privatestringGetNewPasscode(stringoldPasscode, KeyEventArgskeyEventArgs)
        {
            stringnewPasscode=string.Empty;
            switch (keyEventArgs.Key)
            {
                caseKey.D0:
                caseKey.D1:
                caseKey.D2:
                caseKey.D3:
                caseKey.D4:
                caseKey.D5:
                caseKey.D6:
                caseKey.D7:
                caseKey.D8:
                caseKey.D9:
                    newPasscode=oldPasscode+ (keyEventArgs.PlatformKeyCode-48);
                    break;
                caseKey.Back:
                    if (oldPasscode.Length>0)
                        newPasscode=oldPasscode.Substring(0, oldPasscode.Length-1);
                    break;
                default:
                    //others
                    newPasscode=oldPasscode;
                    break;
            }
            returnnewPasscode;
        }