Introduction

This article demonstrate how we can create our own themes in silverlight.

We can create our own custom themes in silverlight application.

Step 1: Create one SilverlightClassLibrary

We have OwnTheme folder in our application, in that folder we have two resourcedirectory files,

First AliceBlueTheme.xaml and SilverTheme.xaml.

AliceBlueTheme :

<Style TargetType="Button">
<Setter Property="Background" Value="AliceBlue"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Foreground" Value="Black"/>
<Setter Property="BorderBrush" Value="LightBlue"/>
</Style>

<Style TargetType="Border">
<Setter Property="Background" Value="AliceBlue"/>
<Setter Property="BorderBrush" Value="LightBlue"/>
<Setter Property="BorderThickness" Value="1"/>
</Style>

<Style TargetType="CheckBox">
<Setter Property="Background" Value="AliceBlue"/>
<Setter Property="BorderBrush" Value="AliceBlue"/>
<Setter Property="Foreground" Value="Black"/>

</Style>

<Style TargetType="StackPanel">
<Setter Property="Orientation" Value="Vertical"/>
<Setter Property="Background" Value="AliceBlue"/>
</Style>

<Style TargetType="HyperlinkButton">
<Setter Property="Background" Value="AliceBlue"/>
<Setter Property="BorderBrush" Value="AliceBlue"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Foreground" Value="Black"/>
</Style>

<Style TargetType="ComboBox">
<Setter Property="Background" Value="AliceBlue"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="BorderBrush" Value="AliceBlue"/>
</Style>

<Style TargetType="ComboBoxItem">
<Setter Property="Background" Value="AliceBlue"/>
<Setter Property="BorderBrush" Value="AliceBlue"/>
<Setter Property="BorderThickness" Value="0.5"/>
<Setter Property="Foreground" Value="Black"/>
</Style>

SilverTheme :

<Style TargetType="Button">
<Setter Property="Background" Value="Silver"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Foreground" Value="Black"/>
<Setter Property="BorderBrush" Value="LightGray"/>
</Style>

<Style TargetType="Border">
<Setter Property="Background" Value="Silver"/>
<Setter Property="BorderBrush" Value="Black"/>
<Setter Property="BorderThickness" Value="1"/>
</Style>

<Style TargetType="CheckBox">
<Setter Property="Background" Value="Silver"/>
<Setter Property="BorderBrush" Value="Silver"/>
<Setter Property="Foreground" Value="Black"/>

</Style>

<Style TargetType="StackPanel">
<Setter Property="Orientation" Value="Vertical"/>
<Setter Property="Background" Value="Silver"/>
</Style>

<Style TargetType="HyperlinkButton">
<Setter Property="Background" Value="Silver"/>
<Setter Property="BorderBrush" Value="Silver"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Foreground" Value="Black"/>
</Style>

<Style TargetType="ComboBox">
<Setter Property="Background" Value="Silver"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="BorderBrush" Value="Silver"/>
</Style>

<Style TargetType="ComboBoxItem">
<Setter Property="Background" Value="Silver"/>
<Setter Property="BorderBrush" Value="Silver"/>
<Setter Property="BorderThickness" Value="0.5"/>
<Setter Property="Foreground" Value="Black"/>
</Style>

Step 2:

Now we have two other resourcedirectory file where we keep the path of our crated themes

(AliceTheme and SilverTheme) as below,

Theme.Xaml :

<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/CustomThemesinSilverlight;component/OwnThemes/AliceBlueTheme.xaml"/>
</
ResourceDictionary.MergedDictionaries>

Theme1.xaml :

<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/CustomThemesinSilverlight;component/OwnThemes/SilverThemes.xaml"/>
</
ResourceDictionary.MergedDictionaries>

Step 3:

We have two classes in our silverlight application like,Silverthemeclass.cs and Aliceblueclass.cs.

Silverthemeclass.cs :

public class SilverThemeClass:Theme
{
private static Uri ThemeResourceUri = new Uri("/CustomThemesinSilverlight;component/Theme1.xaml", UriKind.Relative);

public SilverThemeClass()
: base(ThemeResourceUri)
{

}
public static bool GetIsApplicationTheme(Application app)
{
return GetApplicationThemeUri(app) == ThemeResourceUri;
}

public static void SetIsApplicationTheme(Application app, bool value)
{
SetApplicationThemeUri(app, ThemeResourceUri);
}


AliceBlueclass.cs :

public class AliceThemesClass:Theme
{
private static Uri ThemeResourceUri = new Uri("/CustomThemesinSilverlight;component/Themes.xaml", UriKind.Relative);

public AliceThemesClass()
: base(ThemeResourceUri)
{

}
public static bool GetIsApplicationTheme(Application app)
{
return GetApplicationThemeUri(app) == ThemeResourceUri;
}

public static void SetIsApplicationTheme(Application app, bool value)
{
SetApplicationThemeUri(app, ThemeResourceUri);
}

}

Step 4: Now our silverligthclasslibrary is ready,Bulid the application and add reference in silverlight application.

Here we have class named themchanedcommand.cs where we get themes.

public class ThemeChangeCommand : ICommand
{
#region ICommand Members

public bool CanExecute(object parameter)
{
return true;
}

public event EventHandler CanExecuteChanged;

public void Execute(object parameter)
{
Theme themeContainer = (Theme)((FrameworkElement)Application.Current.RootVisual).FindName("ThemeContainer");

string themeName = parameter as string;

if (themeName == null)
{
themeContainer.ThemeUri = null;
}
else
{
themeContainer.ThemeUri = new Uri("/CustomThemesinSilverlight;component/" + themeName , UriKind.RelativeOrAbsolute);
}

if (CanExecuteChanged != null)
CanExecuteChanged(this, new EventArgs());
}

#endregion

}

Step 5: Use created themes in MainPage.xaml .

<Grid x:Name="LayoutRoot" >

<Grid.Resources>
<local:ThemeChangeCommand x:Key="themeCommand" />
</Grid.Resources>

<toolkit:Theme x:Name="ThemeContainer" >

<Grid Height="400" HorizontalAlignment="Left" Name="grid1" VerticalAlignment="Top" Width="800" Grid.Row="0" >
<Grid.RowDefinitions>
<RowDefinition Height="36" />
<RowDefinition Height="212*" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="284" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Border Grid.Row="1" Height="200" HorizontalAlignment="Left" Name="border1" VerticalAlignment="Top" Width="280">
<CheckBox Content="ThemesInSilverlight" Height="16" Name="checkBox1" Width="130" VerticalAlignment="Top" HorizontalAlignment="Left"/>
</Border>
<Button Height="30" Width="166" Content="BlueTheme" VerticalAlignment="Center" x:Name="BlueButton" Command="{StaticResource themeCommand}" CommandParameter="Themes.xaml" Margin="20,0" Click="BlueButton_Click"></Button>
<Button Height="30" Width="166" HorizontalAlignment="Left" Content="SilverTheme" VerticalAlignment="Center" Grid.Column="1" x:Name="SilverBtn" Command="{StaticResource themeCommand}" CommandParameter="Theme1.xaml" Margin="14,0"></Button>
<StackPanel Grid.Column="1" Grid.Row="1" Height="242" HorizontalAlignment="Left" Name="stackPanel1" VerticalAlignment="Top" Width="425" >
<HyperlinkButton Height="20" Width="100" Content="Select Themes"></HyperlinkButton>
<Border Height="53" x:Name="MyBorder" BorderThickness="5"></Border>
<ProgressBar Height="80" Name="progressBar1" Width="80" Margin="0,50,0,0" />
</StackPanel>

</Grid>
</toolkit:Theme>

</Grid>

Output look like as below,

custom themes in silverlight

Summary : We can create custom themes in silverlight.