ARTICLE

Custom Themes in Silverlight

Posted by Priya Linge Articles | Silverlight with C# August 22, 2011
This article demonstrate how we can create our own themes in silverlight.
Reader Level:

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.
 

Login to add your contents and source code to this article
post comment
     

Nice Article Priya........

Posted by Dea Saddler Aug 22, 2011
COMMENT USING
PREMIUM SPONSORS
DynamicPDF™ product line allows you to dynamically generate PDF documents, merge PDF documents and add new content to existing PDF documents from within your applications.
Get Career Advice from Experts
SPONSORED BY
  • PDF reports have never been easier to create. With our included WYSIWYG Designer, you can layout your reports, set up your data source and let DynamicPDF ReportWriter do the rest.
Get Career Advice from Experts