XML
  Home arrow XML arrow Styles and Control Templates
Iron Speed
ASP Free Forums 
.NET  
ASP  
ASP Code  
ASP.NET  
ASP.NET Code  
BrainDump  
C#  
Code Examples  
Database  
Database Code  
IIS  
Microsoft Access  
MS SQL Server  
Visual Basic.NET  
Windows Scripting  
Windows Security  
XML  
ASP Web Hosting  
ASP.NET Web Hosting 
Dedicated Servers 
Download TestComplete 
Windows Web Hosting
 
IBM® developerWorks 
Weekly Newsletter
 
Developer Updates  
Free Website Content 
 RSS  Articles
 RSS  Forums
 RSS  All Feeds
Write For Us Get Paid 
Request Media Kit
Contact Us 
Site Map 
Privacy Policy 
Support 
 USERNAME
 
 PASSWORD
 
 
  >>> SIGN UP!  
  Lost Password? 
XML

Styles and Control Templates
By: O'Reilly Media
  • Search For More Articles!
  • Disclaimer
  • Author Terms
  • Rating: 4 stars4 stars4 stars4 stars4 stars / 2
    2007-06-21

    Table of Contents:
  • Styles and Control Templates
  • Inline Styles
  • Reusing Styles
  • Named Styles

  • Rate this Article: Poor Best 
      ADD THIS ARTICLE TO:
      Del.ici.ous Digg
      Blink Simpy
      Google Spurl
      Y! MyWeb Furl
    Email Me Similar Content When Posted
    Add Developer Shed Article Feed To Your Site
    Email Article To Friend
    Print Version Of Article
    PDF Version Of Article
     
     
    Iron Speed
     
    ADVERTISEMENT

    Free Web 2.0 Code Generator! Generate data entry and reporting .NET Web apps in minutes. Quickly create visually stunning, feature-rich apps that are easy to customize and ready to deploy. Download Now!

    Styles and Control Templates
    (Page 1 of 4 )

    A style is a set of properties applied to content used for visual rendering. If you want to learn more about styles in Windows, you've come to the right place. This article is excerpted from chapter five of the book Programming Windows Presentation Foundation, written by Chris Sells and Ian Griffiths (O'Reilly; ISBN: 0596101139). Copyright © 2006 O'Reilly Media, Inc. All rights reserved. Used with permission from the publisher. Available from booksellers or direct from O'Reilly Media.

    In a word processing document, a “style” is a set of properties to be applied to ranges of content—e.g., text, images, etc. For example, the name of the style I’m using now is called “Normal,Body,b” and for this document in pre-publication, that means a font family of Times, a size of 10, and full justification. Later on in the document, I’ll be using a style called “Code,x,s” that will use a font family of Courier New, a size of 9, and left justification. Styles are applied to content to produce a certain look when the content is rendered.

    In WPF, a style is also a set of properties applied to content used for visual rendering. A style can be used to set properties on an existing visual element, such as setting the font weight of a Buttoncontrol, or it can be used to define the way an object looks, such as showing the name and age from aPersonobject. In addition to the features in word processing styles, WPF styles have specific features for building applications, including the ability to associate different visual effects based on user events, provide entirely new looks for existing controls, and even designate rendering behavior for non-visual objects. All of these features come without the need to build a custom control (although that’s still a useful thing to be able to do, as discussed in Chapter 9).

    Without Styles

    As an example of how styles can make themselves useful in WPF, let’s take a look at a simple implementation of tic-tac-toe in Example 5-1.

    Example 5-1.  A simple tic-tac-toe layout

    <!-- Window1.xaml -->
    <Window

        x:Class="TicTacToe.Window1"
        
    xmlns=http://schemas.microsoft.com/ winfx/avalon/2005
        xmlns:x=http://schemas.microsoft.com/ winfx/xaml/2005
        Text="TicTacToe"> 
     
    <!-- the black background lets the tic-tac-toe -->
      <!-- crosshatch come through on the margins -->
      <Grid Background="Black">
        <Grid.RowDefinitions>
          <RowDefinition />
          <RowDefinition />
          <RowDefinition />

        </Grid.RowDefinitions>
       
    <Grid.ColumnDefinitions>
          <ColumnDefinition />
          <ColumnDefinition />
          <ColumnDefinition />

        </Grid.ColumnDefinitions>
        <Button Margin="0,0,2,2" Grid.Row="0" Grid.Column="0" x:Name="cell00" />
        <Button Margin="2,0,2,2" Grid.Row="0" Grid.Column="1" x:Name="cell01" />
        <Button Margin="2,0,0,2" Grid.Row="0" Grid.Column="2" x:Name="cell02" />
        <Button Margin="0,2,2,2" Grid.Row="1" Grid.Column="0" x:Name="cell10" />
        <Button Margin="2,2,2,2" Grid.Row="1" Grid.Column="1" x:Name="cell11" />
        <Button Margin="2,2,0,2" Grid.Row="1" Grid.Column="2" x:Name="cell12" />
        <Button Margin="0,2,2,0" Grid.Row="2" Grid.Column="0" x:Name="cell20" />
        <Button Margin="2,2,2,0" Grid.Row="2" Grid.Column="1" x:Name="cell21" />
        <Button Margin="2,2,0,0" Grid.Row="2" Grid.Column="2" x:Name="cell22" />
      </Grid>
    </Window>

    This grid layout arranges a set of nine buttons in a 3× 3 grid of tic-tac-toe cells, using the margins on the button for the tic-tac-toe crosshatch. A simple implementation of the game logic in the XAML code-behind file looks like Example 5-2.

    Example 5-2.   A simple tic-tac-toe implementation

    // Window1.xaml.cs
    ...
    namespace TicTacToe {
      public partial class Window1 : Window {
        // Track the current player (X or O)
        string currentPlayer;

        // Track the list of cells for finding a winner etc.
        Button[] cells;

        public Window1() {
          InitializeComponent();

        // Cache the list of buttons and handle their clicks
        this.cells = new Button[] { this.cell00, this.cell01, ... };
        foreach( Button cell in this.cells ) {
          cell.Click += cell_Click;
        }

        // Initialize a new game
        NewGame();

        }

        // Wrapper around the current player for future expansion,
        // e.g. updating status text with the current player
        string CurrentPlayer {
         
    get { return this.currentPlayer; }
          set { this.currentPlayer = value; }
        }

        // Use the buttons to track game state
        void NewGame() {
         
    foreach( Button cell in this.cells ) {
            cell.Content = null;
          }
         
    CurrentPlayer = "X";
        }

        void cell_Click(object sender, RoutedEventArgs e) {
          Button button = (Button)sender;

          // Don't let multiple clicks change the player for a cell
          if( button.Content != null ) { return; }

          // Set button content
          button.Content = CurrentPlayer;

          // Check for winner or a tie
         
    if( HasWon(this.currentPlayer) ) {
            MessageBox.Show("Winner!", "Game Over");
            NewGame();
            return;
         
    }
         
    else if( TieGame() ) {
            MessageBox.Show("No Winner!", "Game Over");
            NewGame();
            return;
         
    }

          // Switch player
          if( CurrentPlayer == "X" ) {
           
    CurrentPlayer = "O";
          }
          else {
           
    CurrentPlayer = "X";
          }
       
    }

        // Use this.cells to find a winner or a tie
        bool HasWon(string player) {...}
        bool TieGame() {...}
     
    }
    }

    Our simple tic-tac-toe logic uses strings to represent the players and uses the buttons themselves to keep track of the game state. As each button is clicked, we set the content to the string indicating the current player and switch players. When the game is over, the content for each button is cleared. The middle of a game looks like Figure 5-1.


    Figure 5-1.  A simple tic-tac-toe game

    Notice in Figure 5-1 how the grid background comes through from the margin. These spacers almost make the grid look like a drawn tic-tac-toe board (although we’ll do better later). However, if we’re really looking to simulate a hand-drawn game, we’ve got to do something about the size of the font used on the buttons; it doesn’t match the thickness of the lines.

    One way to fix this problem is by setting the size and weight for each of the Button objects, as in Example 5-3.

    Example 5-3.   Setting control properties individually

    <Button FontSize="32" FontWeight="Bold" ... x:Name="cell00" />
    <Button FontSize="32" FontWeight="Bold"... x:Name="cell01" />
    <Button FontSize="32" FontWeight="Bold"... x:Name="cell02" />
    <Button FontSize="32" FontWeight="Bold"... x:Name="cell10" />
    <Button FontSize="32" FontWeight="Bold"... x:Name="cell11" />
    <Button FontSize="32" FontWeight="Bold"... x:Name="cell12" />
    <Button FontSize="32" FontWeight="Bold"... x:Name="cell20" />
    <Button FontSize="32" FontWeight="Bold"... x:Name="cell21" />
    <Button FontSize="32" FontWeight="Bold"... x:Name="cell22" />

    While this will make the X’s and O’s look better according to my visual sensibilities today, if I want to change it later, I’ve now committed myself to changing both properties in nine separate places, which is a duplication of effort that offends my coding sensibilities. I’d much prefer to refactor my decisions about the look of my tic-tac-toe cells into a common place for future maintenance. That’s where styles come in handy.

    More XML Articles
    More By O'Reilly Media


       · This article is an excerpt from the book "Programming Windows Presentation...
     

    Buy this book now. This article is excerpted from chapter five of the book Programming Windows Presentation Foundation, written by Chris Sells and Ian Griffiths (O'Reilly; ISBN: 0596101139). Check it out today at your favorite bookstore. Buy this book now.

    XML ARTICLES

    - More on Triggers and Styles and Control Temp...
    - Looking at Triggers with Styles and Control ...
    - A Closer Look at Styles and Control Templates
    - Styles and Control Templates
    - Properties and More in XAML
    - Elements and Attributes in XAML
    - XAML in a Nutshell
    - Importing XML Files into Access 2007
    - Using MSXML3.0 with VB 6.0
    - MSXML, concluded
    - MSXML, continued
    - MSXML Tutorial
    - Generating XML Schema Dynamically Using VB.N...
    - XSL Transformations using ASP.NET
    - Applying XSLT to XML Using ASP.NET

     
    Accelerating Trading Partner Performance
     
    Competing on Analytics
     
    Cost Effective Scaling with Virtualization and Coyote Point Systems
     
    Five Checkpoints to Implementing IP Telephony
     
    Hosted Email Security: Staying Ahead of New Threats
     




    © 2003-2008 by Developer Shed. All rights reserved. DS Cluster 4 hosted by Hostway