<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE spec SYSTEM "xmlspec.dtd">
<spec status="final" w3c-doctype="wgnote">
  <header>
    <title>Silverlight Techniques</title>
    <w3c-designation>WCAG20-SILVERLIGHT-TECHS</w3c-designation>
  	<w3c-doctype>W3C Working Group Note</w3c-doctype>
  	<pubdate>
  		<day>3</day>
  		<month>January</month>
  		<year>2012</year>
  	</pubdate>
  	<publoc>
      <loc href="http://www.w3.org/WAI/GL/WCAG20/WD-WCAG20-Silverlight-TECHS-20060331/">http://www.w3.org/WAI/GL/WCAG20/WD-WCAG20-Silverlight-TECHS-20060331/</loc>
    </publoc>
    <latestloc>
      <loc href="http://www.w3.org/WAI/GL/WCAG20/WD-WCAG20-Silverlight-TECHS/">http://www.w3.org/WAI/GL/WCAG20/WD-WCAG20-Silverlight-TECHS/</loc>
    </latestloc>
    <prevlocs>
      <loc href="http://www.w3.org/WAI/GL/WCAG20/WD-WCAG20-Silverlight-TECHS-20100107/">http://www.w3.org/WAI/GL/WCAG20/WD-WCAG20-Silverlight-TECHS-20100107/</loc>
    </prevlocs>
    <authlist>
    	<author>
    		<name>Wolf Schmidt, Microsoft</name>
    	</author>
    	<author>
        <name>Michael Cooper, W3C</name>
      </author>
    </authlist>
    <status>
      <p>
        <emph>This section describes the status of this document at the time of its publication. Other documents may supersede this document. A list of current W3C publications and the latest revision of this technical report can be found in the <loc href="http://www.w3.org/TR/">W3C technical reports index</loc> at http://www.w3.org/TR/.</emph>
      </p>
      <p>This version of CSS techniques has not significantly changed since the 19 November 2004 Working Draft. The <loc href="/WAI/GL/">Web Content  Accessibility Guidelines Working Group</loc> (WCAG WG) has focused on addressing issues related to Guidelines and Success Criteria. This publication  demonstrates how the different documents may link to each other. As the focus of the WCAG WG returns to techniques and test suites, the structure and presentation of the techniques documents will likely change to  reflect the relationships between Guidelines, Techniques, and testing documents. In future revisions, we expect to distinguish between techniques required for conformance versus those that are optional. Please refer to "<loc href="http://trace.wisc.edu/bugzilla_wcag/condensedreports/css_issues.php">Issue tracking for WCAG 2.0 Techniques for CSS</loc>" for a list of open issues related to this Working Draft. The "<loc href="/WAI/GL/WCAG20/css-tech-change-history.html">History of Changes to CSS Techniques for WCAG 2.0 Working Drafts</loc>" is also available.
			</p>
      <p>Please send comments about this document to <loc href="mailto:public-comments-wcag20@w3.org">public-comments-wcag20@w3.org</loc>. The <loc href="http://lists.w3.org/Archives/Public/public-comments-wcag20/">archives for the public comments list</loc> are publicly available.   <loc href="http://lists.w3.org/Archives/Public/w3c-wai-gl">Archives of the WCAG WG mailing list</loc> are also publicly available.</p>
      <p>Publication as a Working Draft does not imply endorsement by the W3C Membership. This is a draft document and may be updated, replaced or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress.  The WCAG WG intends to publish this as a Working Group Note at the time that WCAG 2.0 becomes a Recommendation.</p>
      <!-- do not need patent section since these are not on the Rec track -->
      <p>This document has been produced as part of the W3C <loc href="http://www.w3.org/WAI/">Web Accessibility Initiative</loc> (WAI). The goals of the WCAG WG are discussed in the <loc href="http://www.w3.org/WAI/GL/new-charter-2000.html">Working Group charter</loc>. The WCAG WG is part of the <loc href="http://www.w3.org/WAI/Technical/Activity">WAI Technical Activity</loc>.</p>
    </status>
    <abstract>
      <p>This document provides information to Web content developers who wish to satisfy the Success Criteria of "Web Content Accessibility Guidelines 2.0" <bibref ref="WCAG20"/> (currently a W3C Working Draft).   The techniques in this document are specific to Flash content <bibref ref="SILVERLIGHT"/>.  Use of the illustrative techniques provided in this document may make it more likely for Web content to demonstrate conformance to WCAG 2.0 Success Criteria (by passing the relevant tests in the WCAG 2.0 test suite - <emph>to be developed</emph>) than if these illustrative techniques are not used.</p>
      <p>There may be other techniques besides those provided in this document that may be used to demonstrate conformance to WCAG 2.0; in that case, it is encouraged to submit those techniques to the WCAG WG for consideration for inclusion in this document, so that the set of techniques  maintained by the WCAG WG is as comprehensive as possible. Deprecated examples illustrate techniques that the Working Group no longer recommends, but may be applicable in some cases. </p>
      <p>This document is part of a series of documents published by the W3C
Web Accessibility Initiative (WAI) to support WCAG 2.0.</p>
    </abstract>
    <langusage>
      <language id="en-US"/>
    </langusage>
    <revisiondesc>
      <p/>
    </revisiondesc>
  </header>
  <body>
    <!-- techniques -->
    <div1 id="silverlight">
      <head>Silverlight Techniques</head>
    	<div2 id="silverlight_notes">
    		<head>Silverlight Technology Notes</head>
        <p>Microsoft Silverlight is a development platform for applications.
          To learn more about Silverlight and how Microsoft defines and markets
          the Silverlight technology, see <loc href="http://www.microsoft.com/silverlight/what-is-silverlight/">What
          Is Silverlight? document on microsoft.com</loc>. </p>
        <p>Once an application author produces a Silverlight application, the
          most common way to deploy that application is to present the Silverlight
          content using a browser plug-in that end users have installed on their
          computers. The Silverlight plug-in is instantiated within an HTML page
          as an &lt;object&gt; or &lt;embed&gt; tag.   &lt;object&gt; tag attributes
          reference Silverlight's unique classid, and/or its MIME type, thus
          invoking a plug-in instance within the browser host's HTML content.
          Users request the Silverlight-containing page as a URL, and the surrounding
          HTML plus the Silverlight content is viewed within a browser host such
          as Firefox, Internet Explorer, Google Chrome, or Safari. There are
          other means by which Silverlight-developed content can be deployed
          that are NOT viewed in the plug-in or hosted by HTML; this is discussed
          in the upcoming section "Browser Host Platform Considerations". </p>
        <p>The content that is displayed within the Silverlight content area
          is specified as the "source" parameter, within the Silverlight
          object/embed tag. The "source" parameter value references
          a URI for a package. The package is typically served by the same server
          that served the HTML (and the package itself is typically requested
          through http: or https: protocol). The package always contains an application
          manifest, and a managed code compiled DLL. The package might also contain
          other content, for example media files or image files that the application
          consumes as resources. The compiled DLL typically contains two types
          of information within its compiled structure: CLR runtime code that
          handles dynamic operations of the application such as startup logic,
          business rules, event handlers, and further resources. The resources
          inside the DLL are primarily UI definitions in a markup format/language
          called XAML. </p>
        <p>Silverlight provides a combination of built-in support for accessibility
          and capabilities that authors and authoring tools can take advantage
          of in order to enable support for accessible content. Tools and related
          technologies that are related to this include: </p>
        <ulist><item><p> Microsoft Visual Studio 2010 (or Microsoft Visual Studio 2008
            if still developing for version 3 of the Silverlight runtime) – Silverlight authors
            can use Express versions if their development needs are fairly basic </p></item><item><p> Microsoft Expression products, in particular Microsoft Expression
            Blend </p></item><item><p> Silverlight Tools – a separate package for Visual Studio that
            should be installed for effective Silverlight application development </p></item><item><p> Developer tools that are specifically for verification of information
            presented to either the UIA or MSAA accessibility frameworks. </p></item></ulist>
    		<div3 id="silverlight_notes_frameworks">
    		<head> Accessibility Frameworks </head>
        <p>Silverlight support for assistive technologies is based on implementing
          Silverlight for Microsoft UI Automation (often abbreviated as UIA).
          In the UIA accessibility framework, Silverlight is implemented as a
          UI Automation server. This means that Silverlight provides information
          about the application itself and its current content through the framework.
          Any subscriber to the operating system's automation can consume that
          information as a UI Automation client. One such client role is typically
          implemented by assistive technologies, most notably by screen readers.
          By acting as a UI Automation client, an assistive technology can programmatically
          determine many aspects of Silverlight content and content structure.
          In addition, UIA has APIs that can change the content in a predictable
          way that maintains security boundaries between applications. Reading
          information from Silverlight through the UIA accessibility framework
          requires no extra work on the part of a given assistive technology,
          presuming that the assistive technology has already implemented UIA.
          All information that Silverlight reports to UIA comes through the common
          property set, and a fixed set of possible user interactions is programmatically
          accessible through a discoverable set of automation patterns and techniques. </p>
        <p>As an example of how UI Automation might provide information to an
          assistive technology, consider the following scenario: </p>
        <olist><item><p> A Silverlight application author produces an application that
            follows all Microsoft-documented best practices for providing accessibility
            information, either by specific programming actions or by relying
            on a known set of Silverlight default behaviors (many of these actions/behaviors
            are also described as Silverlight WCAG techniques). </p></item><item><p> A user views a Web page that contains Silverlight content, using
            a browser host that loads the HTML, and using an operating system
            such as Microsoft Windows (XP, Vista or Windows 7) that supports
            UI Automation. </p></item><item><p> An assistive technology that is already running on the user's
            system loads the UIA representation of all Web content loaded by
            the browser. Part of that representation is an automation element
            that represents the Silverlight plug-in. The plug-in content area
            itself is focusable in the browser host's HTML rendering and representation
            model. </p></item><item><p> The user navigates elements in the Silverlight application area,
            either by using the TAB sequence, or by using navigation techniques
            implemented by a particular assistive technology. </p></item><item><p> By forwarding information that is pertinent to either the navigated-to
            element or the application in general, the accessibility framework
            provides the assistive technology with the information from Silverlight
            application. As a specific example, a screen reader might read the
            name and role of the currently focused control element such as a
            Silverlight <obj>TextBox</obj>. In addition, the assistive
            technology can provide means to enter data or otherwise interact
            with elements of that application, if that element reports to UIA
            that it supports such interaction. </p></item></olist>
        <p>A good introductory topic on UI Automation is available on <loc href="http://msdn.microsoft.com/en-us/library/ms747327.aspx">MSDN</loc>. </p>
        <p>UI Automation supersedes Microsoft Active Accessibility (MSAA), an
          earlier Microsoft accessibility framework. UI Automation provides built-in
          bridging support for MSAA, such that assistive technologies that are
          implemented as clients for MSAA rather than UIA receive the expected
          interface hooks for IAccessible and can call methods of the MSAA interfaces.
          Also, applications that provide MSAA/ IAccessible are readable to a
          UIA-client assistive technology through similar bridging. </p>
        <p>Whether implemented as clients for UI Automation or for MSAA, support
          for assistive technologies is provided for users viewing content using
          combinations of: </p>
        <ulist><item><p> Microsoft Internet Explorer 6 or later, in combination with Microsoft
            Silverlight on Windows. </p></item><item><p> Mozilla Firefox 3 or later, in combination with Microsoft Silverlight
            on Windows. </p></item><item><p> Google Chrome 4 or later, in combination with Microsoft Silverlight
            on Windows </p></item></ulist>
        <p>Screen reader assistive technology support for either MSAA or UIA
          is provided in several assistive technologies, including but not limited
          to: </p>
        <ulist><item><p> JAWS </p></item><item><p> Windows-Eyes </p></item><item><p> NVDA </p></item><item><p> Microsoft Narrator </p></item></ulist>
        <p>The exact level of support to assistive technologies will partially
          depend on whether that assistive technology is implemented as a UIA
          client or an MSAA client. This can vary depending on specific version
          releases of the assistive technology. In general, the UIA architecture
          is capable of reporting a richer information set to clients than is
          MSAA. This is because UIA has a larger number of properties available,
          and also because UIA has the patterns concept to support class extension
          whereas MSAA does not (class extension is a key concept in Silverlight
          programming). </p>
        <p>Silverlight uses UI Automation support as a general system that addresses
          parts or entireties of many WCAG criteria at a system/platform level,
          rather than requiring each Silverlight author to build the entirety
          of such support as an individually coded feature of a Silverlight application.
          The following is a list of criteria where UI Automation support in
          Silverlight is necessary to apply the Silverlight WCAG techniques,
          and the application must be on a client and platform that also supports
          UIA (or MSAA): </p>
        <ulist><item><p> <loc href="http://www.w3.org/TR/UNDERSTANDING-WCAG20/content-structure-separation-programmatic.html">Success
              Criterion 1.3.1 (Info and Relationships)</loc> </p></item><item><p> <loc href="http://www.w3.org/TR/UNDERSTANDING-WCAG20/content-structure-separation-programmatic.html">Success
              Criterion 1.3.3 (Sensory Characteristics)</loc> </p></item><item><p> <loc href="http://www.w3.org/TR/UNDERSTANDING-WCAG20/content-structure-separation-sequence.html">Success
              Criterion 1.3.2 (Meaningful Sequence)</loc> </p></item><item><p> <loc href="http://www.w3.org/TR/UNDERSTANDING-WCAG20/consistent-behavior-consistent-functionality.html">Success
              Criterion 3.2.4 (Consistent Functionality)</loc> </p></item><item><p> <loc href="http://www.w3.org/TR/UNDERSTANDING-WCAG20/ensure-compat-rsv.html">Success
              Criterion 4.1.2 (Name Role Value)</loc> </p></item></ulist>
        <p>The following is a list of criteria where UIA Automation support in
          Silverlight is helpful but not necessary: </p>
        <ulist><item><p> <loc href="http://www.w3.org/TR/UNDERSTANDING-WCAG20/content-structure-separation-programmatic.html">Success
              Criterion 1.1.1 (Non-text Content)</loc> </p></item><item><p> <loc href="http://www.w3.org/TR/UNDERSTANDING-WCAG20/minimize-error-identified.html">Success
              Criterion 3.3.1 (Error Identification)</loc> </p></item><item><p> <loc href="http://www.w3.org/TR/UNDERSTANDING-WCAG20/minimize-error-cues.html">Success
              Criterion 3.3.2 (Labels or Instructions)</loc> </p></item><item><p> <loc href="http://www.w3.org/TR/UNDERSTANDING-WCAG20/minimize-error-suggestions.html">Success
              Criterion 3.3.3 (Error Suggestion)</loc> </p></item><item><p> <loc href="http://www.w3.org/TR/UNDERSTANDING-WCAG20/minimize-error-reversible.html">Success
              Criterion 3.3.4 (Error Prevention)</loc> </p></item></ulist>
    			<div4 id="silverlight_notes_frameworks_nrv">
    			<head> Further notes on Name Role Value </head>
        <p><loc href="http://www.w3.org/TR/UNDERSTANDING-WCAG20/ensure-compat-rsv.html">Success
            Criterion 4.1.2 (Name Role Value)</loc> directly influenced the design
            of both the Microsoft UI Automation accessibility framework and its
            MSAA predecessor. Many aspects of providing name, role and value
            are built-in to the Silverlight UIA support, and that information
            can be programmatically determined by assistive technologies that
            are programmed as UI Automation clients. </p>
    				<div5 id="silverlight_notes_frameworks_nrv_name">
        <head> Name </head>
        <p>In most cases, the name of the control is used to identify that control
          to users, as well as providing a programmatic identifier. In UI Automation
          programming, any entity that can have a name is represented as an <loc href="http://msdn.microsoft.com/en-us/library/system.windows.automation.automationelement.aspx">AutomationElement</loc>,
          and its name is determined by reading the value of the <loc href="http://msdn.microsoft.com/en-us/library/system.windows.automation.automationelement.automationelementinformation.name.aspx">AutomationElementInformation.Name
          property</loc>. There is an intermediate "Current" property,
          so an example usage is something like: </p>
        <p><code>string AName = anAutomationElement.Current.Name;  </code></p>
          <p><prop>Name</prop> is the most common UI Automation property
            that is consumed by assistive technologies. Application authors in
            general that rely on UI Automation (and Silverlight application authors
            in particular) typically provide strings for <prop>Name</prop> that
            can inform users of the purpose that the element serves in the application.
            For example, if an application provides a button that can be activated,
            the <prop>Name</prop> reported to UI Automation could best describe
            its purpose by using a <prop>Name</prop> string something like "Submit
            form". While there is some crossover here with the concept of
            Value, what is notable about <prop>Name</prop> is that it is
            controlled only by the application rather than typical means of user
            input that would alter the data of Value. </p>
        <p>Because UI Automation is also used as a framework for automation testing
          of applications, UI Automation supports a parallel identification property
          named <loc href="http://msdn.microsoft.com/en-us/library/system.windows.automation.automationelement.automationelementinformation.automationid.aspx">AutomationId</loc>. <prop>AutomationID</prop> is
          not relevant to accessibility support scenarios, although in practice <prop>Name</prop> and <prop>AutomationID</prop> sometimes
          use the same string values, or are supported by parallel property-forwarding
          techniques by implementing technologies. The intended design difference
          between <prop>AutomationId</prop> and <prop>Name</prop> is
          the following: </p>
        <ulist><item><p> <prop>AutomationID</prop> is not intended to be human readable,
            but is intended to be unique </p></item><item><p> <prop>Name</prop> is intended to be human readable but might
            not be unique </p></item></ulist>
        <p>Silverlight in particular has a property-forwarding technique whereby
          the Silverlight-specific <loc href="http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.name%28VS.95%29.aspx">Name</loc> or <loc href="http://msdn.microsoft.com/en-us/library/cc189028%28VS.95%29.aspx">x:Name</loc> properties
          are promoted as the initial <loc href="http://msdn.microsoft.com/en-us/library/system.windows.automation.automationelement.automationelementinformation.name.aspx">AutomationElementInformation.Name</loc>.
          This forwarding is implemented within build procedures to provide a
          fallback for testing and initial development of an application's UI
          Automation representation. In many cases a forwarded Name/x:Name does
          not result in a particularly human-comprehensible or user-actionable
          string or phrase. Silverlight application authors should use a test-based
          methodology to examine all possible <loc href="http://msdn.microsoft.com/en-us/library/system.windows.automation.automationelement.automationelementinformation.name.aspx">AutomationElementInformation.Name</loc> values
          exposed by their application, and assure that each such string is specifically
          replaced by a UI-specific <loc href="http://msdn.microsoft.com/en-us/library/system.windows.automation.automationproperties.name%28VS.95%29.aspx">AutomationProperties.Name
          value</loc>. </p>
    				</div5>
    				<div5 id="silverlight_notes_frameworks_nrv_role">
        <head> Role </head>
        <p>Role in UI Automation can be determined through several techniques. </p>
        <p>The most straightforward technique for determining a given AutomationElement's
          role is to check the value of <loc href="http://msdn.microsoft.com/en-us/library/system.windows.automation.automationelement.automationelementinformation.controltype.aspx">ControlType</loc>.
          This value provides an enumeration that reports role as several known
          possibilities plus an alternate role of "Custom" if no enumeration-defined
          role is a good descriptor. For example, a Silverlight <obj>Button</obj> control
          describes itself to UI Automation as a ControlType of <loc href="http://msdn.microsoft.com/en-us/library/system.windows.automation.controltype.button.aspx">Button</loc>,
          and a Silverlight <obj>TreeView</obj> describes itself as <loc href="http://msdn.microsoft.com/en-us/library/system.windows.automation.peers.automationcontroltype%28VS.95%29.aspx">Tree</loc>. </p>
        <p>For further information on roles, UI Automation clients can query
          an AutomationElement to see which UI Automation patterns that element
          supports. The patterns describe expectations of the interaction model,
          and the patterns themselves expose the methods that clients should
          call to engage that interaction. For more information, see <loc href="http://msdn.microsoft.com/en-us/library/ms741836.aspx">Get
          Supported UI Automation Control Patterns on MSDN</loc>. </p>
    				</div5>
    				<div5 id="silverlight_notes_frameworks_nrv_value">
        <head> Value </head>
        <p>In MSAA, the "Value" concept was addressed by the simple
          property <prop>Value</prop> and had to be represented as a string.
          One of the major refinements of UIA over MSAA is to expand what types
          of data can be expected to exist as a value. For this reason, determining "Value" requires
          a larger understanding of UI Automation and how to access UI Automation
          patterns exposed by each peer, and is not discussed further in this
          document. For more information, see <loc href="http://msdn.microsoft.com/en-us/library/ms741836.aspx">Get
          Supported UI Automation Patterns</loc> and <loc href="http://msdn.microsoft.com/en-us/library/ms746719.aspx">UI
          Automation Control Patterns for Clients</loc>. The most basic concept
          of Value is often represented by the <loc href="http://msdn.microsoft.com/en-us/library/system.windows.automation.valuepattern.aspx">ValuePattern</loc>,
          but UI Automation clients should be aware of the larger range of patterns
          that can possibly return or provide a value. In general, the UIA Value
          pattern is only relevant for setting the value directly, such as in
          a text box where a user types or otherwise inputs a string or phrase. </p>
        <p>State is also a related concept to value. UI Automation elements typically
          report states that make sense given their role, and such state is reported
          in the provider implementations. There are also some generalized state
          properties available in any automation element. Examples of these include: <loc href="http://msdn.microsoft.com/en-us/library/system.windows.automation.automationelement.automationelementinformation.haskeyboardfocus.aspx">HasKeyboardFocus</loc>; <loc href="http://msdn.microsoft.com/en-us/library/system.windows.automation.automationelement.automationelementinformation.isoffscreen.aspx">IsOffscreen</loc>. </p>
    				</div5>
    			</div4>
    			<div4 id="silverlight_notes_frameworks_concepts">
        <head> Object Tree Concepts and UI Automation Tree Views </head>
        <p>The object tree is composed of all the programming constructs that
          a Silverlight application author explicitly declares by writing XAML
          UI definitions (which are initially loaded by the Silverlight runtime)
          and by invoking run-time code. The relationships between nodes in XAML
          markup, and the declaration order of peer elements in XAML, create
          identical relationships/orders in the object tree representation. In
          code, order is made explicitly by using structured definitions and
          APIs of various types of collections (list, dictionaries, etc.) that
          are common in .NET Framework programming. For example, to get the first
          child of a StackPanel named myPanel, call myPanel.Childen[0]
          (.NET collections are zero-index based). Parent-child relationships
          are declared by how specific properties are set. For example, to add
          a   "newButton" child element to myPanel as the last child,
          call myPanel.Children.Add(newButton). </p>
        <p>An object tree representation forms the basis of the Silverlight run-time
          programming model, and enables programmatic access to every programming
          entity or element part of a running Silverlight application. The object
          tree representation is particularly useful for accessibility frameworks,
          and in turn for assistive technologies that use the accessibility framework
          as a client. The relationships and item order in the object tree also
          define the default reading order, as well as the default tab sequence
          for default Silverlight key handling. The Silverlight plug-in code
          that renders Silverlight content into the plug-in display area is literally
          reading the same run-time object tree that is being simultaneously
          reported to the accessibility frameworks or other subsystems of Silverlight
          (for example, printing APIs). </p>
        <p>Silverlight supports UI Automation (UIA) as its primary accessibility
          framework on Windows platform. Silverlight also provides accessibility
          information to MSAA, by reporting information through the UIA-MSAA
          bridge. By using the APIs of the relevant accessibility framework,
          assistive technologies and other accessibility framework clients can
          discover the information and relationships declared in a Silverlight
          application's runtime object tree. The accessibility framework APIs
          work against the UI automation tree in a manner that does not require
          any specific knowledge of the Silverlight programming model. For example,
          the UI Automation APIs use an abstraction of a <obj>UIAutomationElement</obj> to
          represent any accessible Silverlight object. By calling UI Automation
          APIs against this abstracted object, accessibility framework clients
          can determine any child elements and their count, check parent elements,
          can obtain name/role/value of that <obj>UIAutomationElement</obj>,
          and so on. In fact, Silverlight accessibility support in general is
          achieved without assistive technologies even being aware that Silverlight
          is a distinct technology from HTML. This is because Silverlight implements
          its accessibility framework support such that Silverlight dovetails
          into the surrounding HTML content through the connection point of the "SilverlightControl" <obj>UIAutomationElement</obj> that
          exists within the browser host's HTML content. </p>
        <p>For more information, see <loc href="http://msdn.microsoft.com/en-us/library/ee684009%28VS.85%29.aspx">UI
            Automation (unmanaged)</loc> or <loc href="http://msdn.microsoft.com/en-us/library/ms753107.aspx">UI
            Automation (managed)</loc> </p>
    				<div5 id="silverlight_notes_frameworks_concepts_example">
        <head> An Object Tree / UI Automation Example </head>
        <p>In the following XAML example, a Silverlight <obj>StackPanel</obj> is
          the container element for four different Button elements. In the visible
          user interface, the resulting buttons are oriented vertically, with
          the first declared button vertically above the others and first in
          the tab sequence. (Event handling logic for each button is not shown
          and is not relevant for the example.) </p>
        <p><code><![CDATA[<StackPanel Orientation="Vertical" >
  <Button>Hit</Button>
  <Button>Stay</Button>
  <Button>Split</Button>
  <Button>Double Down</Button>
</StackPanel>
]]></code></p>
          <p>The following image shows the resulting render order. Note the first
            “Hit” button has the blue border as focus indicator; focus was placed
            here by traversing the default tab order, and this element was the
            first Silverlight element that captured the focus. </p>
        <p><image><img source="working-examples/silverlight/stackpanelbuttonsorder.png" height="98" width="277"/><alt>Image:StackPanelButtonsOrder.png</alt></image> </p>
        <p>The following is the same UI as defined in C# code rather than XAML.
          The key concept here is that each call to a Silverlight collection <function>Add</function> method
          adds that item to the end of the existing collection. Thus, to define
          a collection’s order, add the intended first item with the first
          call to <function>Add</function>, the second item in the next line of code,
          and so on. This code is analogous to what a XAML parser does when it
          processes the previous XAML example, and results in the same visible
          UI and same default tab order. </p>
    					<p><code><![CDATA[ void MakeUI()
 {
   StackPanel sp = new StackPanel() { Width = 300, Orientation = Orientation.Vertical };
   Button hitButton = new Button() { Content = "Hit" };
   Button stayButton = new Button() { Content = "Stay" };
   Button splitButton = new Button() { Content = "Split" };
   Button doubleDownButton = new Button() { Content = "DoubleDown" };
   sp.Children.Add(hitButton);
   sp.Children.Add(stayButton);
   sp.Children.Add(splitButton);
   sp.Children.Add(doubleDownButton);
 }
]]></code></p>
          <p>The following is a screenshot of the UI Automation subtree specifically
            in the area of the UI as declared by either the XAML or C# shown
            previously. The tool being used in this screenshot is Inspect.exe,
            which comes with the Windows SDK version 7.1 </p>
        <p><image><img source="working-examples/silverlight/screenshot_uia_objecttree.png" height="595" width="737"/><alt>Image:Screenshot_uia_objecttree.png</alt></image> </p>
        <p>The screenshot is representative of the kind of tree structure that
          a UI Automation client such as a given assistive technology is able
          to program against, when a Silverlight application exists as an embedded
          plug-in inside the surrounding browser host. </p>
    				</div5>
    			</div4>
    		</div3>
    		<div3 id="silverlight_notes_input-multimedia">
        <head> Input and Multimedia </head>
        <p>Silverlight implements UI controls that support keyboard input methods
          for users who do not use a mouse. Also, Silverlight provides the input
          system framework such that application authors and control authors
          can provide similar mouse-keyboard equivalence from their own UI, by
          using the Silverlight event system and sending each event to the same
          or similar handling logic. Silverlight application authors can control
          the tab order of content within Silverlight content, as is demonstrated
          in the WCAG 2.0 techniques for Silverlight. </p>
        <p>Silverlight is often used to display video. Silverlight and the media
          formats it supports can include embedded text tracks with timing markers.
          The text tracks and timing markers enable a Silverlight technique that
          can provide closed captions or subtitles in any language. Silverlight
          and its media formats also support multiple tracks of audio, thereby
          enabling support for video description. </p>
    		</div3>
    		<div3 id="silverlight_notes_text-color">
        <head> Text and Color Preferences </head>
        <p>Silverlight supports text resize through browser zoom, as described
          in <loc href="http://www.w3.org/TR/WCAG20-TECHS/G142.html">G142:
          Using a technology that has commonly-available user agents that support
          zoom</loc>. The effects of invoking browser zoom apply any resize to
          the entirely of the hosted HTML (including Silverlight content). Silverlight
          interaction with browser zoom is further discussed in the Silverlight
          WCAG technique <specref ref="SL22"/>. </p>
        <p>However, not all browser hosts that are supported by Silverlight provide
          browser zoom as a feature, and in the Firefox implementation the text
          within the Silverlight content area is not affected if the user has
          checked Zoom Text Only. As an alternative or additional technique for
          text resize, the Silverlight WCAG technique <specref ref="SL23"/> describes
          how to use Silverlight APIs to resize text elements that are specifically
          within the Silverlight content area. </p>
        <p>Silverlight supports a high-contrast detection mode at the platform
          level. If the user has already selected a high-contrast mode at the
          platform/OS level, the Silverlight application can use various styling
          and appearance techniques to select a color scheme that is appropriate
          for high contrast. This concept is shown in the Silverlight WCAG technique <specref ref="SL13"/>. Silverlight and its
          API do not account for any color settings that are made for default
          HTML by a browser host application (settings under General / Appearance
          in Internet Explorer; settings under Content / Fonts &amp; Color in
          Firefox). This information is not made available to plug-ins such as
          Silverlight. </p>
    		</div3>
    		<div3 id="silverlight_ua_support">
        <head> User Agents Supported </head>
        <p>Silverlight documents its official list of supported user agents on
          the Microsoft.com web site. The list is dynamic, because the vendors
          that produce browsers are constantly updating versions. Also, Silverlight
          might announce support for a browser in a time period that falls after
          the release date of the latest Silverlight runtime; sometimes this
          means that the Silverlight product team performed new testing for acceptance
          of that specific user agent and can now vouch for an official level
          of Microsoft support. </p>
        <p>For convenience, a snapshot of the official Microsoft browser/user
          agent support matrix from the date 13 January 2011 is reproduced here: </p>
        <ulist><item><p> Windows Vista: IE 8, IE 7, Firefox 3, Chrome 4 </p></item><item><p> Windows 7: IE 8, Firefox 3, Chrome 4 </p></item><item><p> Windows Server 2008: IE 8, IE 7, Firefox 3, Chrome 4 </p></item><item><p> Windows Server 2008 R2: IE 8, Chrome 4 </p></item><item><p> Windows Server 2003, Windows XP SP2, SP3: IE 8, IE 7, IE 6, Firefox
            3, Chrome 4 </p></item><item><p> Windows 2000 SP4 + KB 891861: IE 6 </p></item><item><p> Macintosh OS 10.4.11+ (Intel-based): Firefox 3, Safari 3, Safari
            4 </p></item></ulist>
        <p>For the official list of supported user agents for Silverlight, see <loc href="http://www.microsoft.com/getsilverlight/get-started/install/default.aspx">http://www.microsoft.com/getsilverlight/get-started/install/default.aspx</loc> (System
          Requirements tab). </p>
        <ulist><item><p> As of 13 January 2011 Silverlight does not work in 64-bit browser
            hosts (64-bit platform users should use a 32-bit browser application
            on their system). </p></item><item><p> Silverlight and Novell have a technical collaboration, and Novell
            sponsors an open-source initiative known as the Mono Project. Part
            of the Mono Project is Moonlight, which is a port of Silverlight
            technology for Linux and other Unix/X11 based operating systems.
            For more information, see <loc href="http://www.mono-project.com/Main_Page">Mono</loc> and <loc href="http://mono-project.com/MoonlightSupportedPlatforms">Moonlight Supported Platforms</loc>. </p></item></ulist>
    		</div3>
    		<div3 id="silverlight_notes_platform">
        <head> Browser Host Platform Considerations </head>
        <p>Depending on the browser host being targeted, Silverlight is implemented
          as an ActiveX control or as an NPAPI plugin. When a user installs Silverlight,
          they are installing both of these implementations, such that the same
          Silverlight installation could be accessed by an Internet Explorer
          browser host and a Firefox browser host, and could even be accessed
          simultaneously by both. Differences between the program access layers
          of ActiveX versus NPAPI, and also browser-specific differences in program
          access layers, produce some platform differences that occasionally
          relate to accessibility support. For example, there can be slight differences
          in whether the program access layer will correctly forward certain
          keys or key combinations, which might impact keyboard-mouse equivalence
          implementations. </p>
        <p>Silverlight also supports modes that do not rely on a browser host
          at all. In previous releases of Silverlight, Silverlight was defined
          as a platform for producing rich Internet applications. This is still
          true, but in the current Silverlight release the deployment options
          are expanded such that a Silverlight application is not necessarily
          a web-based application, and Silverlight is not exclusively a Web content
          technology. </p>
        <p>Silverlight supports an out of browser deployment mode. Through UI
          in an initial Web-based Silverlight application, the user is asked
          to conform whether they wish to install the out-browser application.
          If the user approves the installation, the Web-based Silverlight application
          shuts down and the installation begins. Typically, the application
          restarts itself immediately after the installation. Once installed
          on the user's hard disk, a Silverlight out-of-browser functions more
          as an application window under the control of the current platform
          operating system. This is manifested through technical aspects such
          as a change in programming security boundaries, and addition of operating-system-specific
          application model features for the Silverlight out-of-browser application.
          Examples of the latter include icons and presence in running-application
          UI metaphors such as task bars. Out-of-browser mode is not specifically
          mentioned in the Silverlight WCAG techniques, because in this mode
          Silverlight is no longer a Web application. However, an out-of-browser
          Silverlight application can include an embedded control that is itself
          capable of displaying HTML. In this situation, Silverlight accesses
          basic HTML browser frameworks provided by the platform, and any techniques
          that would normally apply to HTML content and Web content could also
          apply to the HTML as viewed within a Silverlight out-of-browser application.
          For more information, see <loc href="http://msdn.microsoft.com/en-us/library/dd550721%28VS.95%29.aspx">MSDN</loc>. </p>
        <p>Silverlight is also a development platform that can be used to create
          applications for Windows Phone. While these applications often rely
          on Internet connectivity, these applications are run in the context
          of an application directly under the Windows Phone operating system,
          rather than being run in an intermediate Web host that serves as a
          generalized Web browser for Windows Phone. Therefore the typical considerations
          of Silverlight acting as a part of a larger definition of Web content
          do not apply. For more information on Silverlight for Windows Phone
          development, see <loc href="http://msdn.microsoft.com/en-us/library/ff402528%28VS.92%29.aspx">The
          Silverlight and XNA Frameworks for Windows Phone on MSDN</loc>. </p>
    		</div3>
    		<div3 id="silverlight_notes_xaml">
        <head> The XAML Language </head>
        <p>XAML is an abbreviation for eXtensible Application Markup Language.
          In the Silverlight application model, XAML is generally used for defining
          the elements that make up an application's user interface (UI). XAML
          markup for UI resembles markup paradigms for HTML in that it uses angle
          brackets in its syntax, has concepts of elements and attributes, and
          uses a predominately text-based file editing and storage format such
          that XAML is human-readable in a text editor. The UI design role typically
          designs an application user interface by interacting with graphical
          user interface tools such as Microsoft Expression Blend. In this case,
          Expression Blend produces XAML as its output, and XAML becomes the
          interchange format between the Expression Blend tool and the Visual
          Studio tools. Visual Studio is more typically used by code-oriented
          Web developers for Silverlight. Web developers in Visual Studio might
          work with XAML at the text level, and write or change the XAML markup,
          and more than one interchange between tools and/or roles of a given
          XAML file might occur by the time the application is finished. The
          Silverlight techniques are written from the perspective of the code-oriented
          Web developer who is possibly adjusting post-design phase XAML. </p>
        <p>One key difference between HTML and XAML is that XAML is always interpreted
          by the Silverlight runtime, or preparsed at compile time within Silverlight
          tools. XAML is NOT parsed by potentially different engines per browser
          host. Because XAML provides UI definition, the Silverlight techniques
          often include procedures or concepts that adjust the elements and attributes
          of XAML markup for an application. Some of the techniques show procedures
          or concepts for code-behind, scripting, deployment steps, or other
          aspects of Silverlight programming in addition to or instead of XAML
          examples. The runtime parsing characteristics of XAML for Silverlight
          is discussed further in the Silverlight WCAG technique <specref ref="SL33"/>. </p>
        <p>XAML attributes sometimes specify strings that are visible in UI and
          reported to assistive technologies. The Silverlight WCAG techniques
          typically hard-code such UI strings in XAML, so that the example code
          can be kept simple and can concentrate on the immediate concept being
          illustrated. However, hard-coding UI strings in XAML is not a best
          practice for production code, because of localizion considerations.
          To learn more about producing XAML that is localization-ready, or about
          refactoring XAML to support better designer-coder-localizer workflows,
          see <loc href="http://msdn.microsoft.com/en-us/library/cc838238%28VS.95%29.aspx">Localizing
          Silverlight-based Applications</loc> on MSDN. </p>
    		</div3>
    		<div3 id="silverlight_notes_text-methodology">
        <head> Test-based Methodology for Accessibility Support </head>
        <p>Some of the Silverlight WCAG techniques mention a concept of   "test-based
          methodology" - this section describes what is meant by that concept. </p>
        <p>In typical Web application development, there are phases that are
          a natural part of the workflow. First there is a specification phase,
          where the basic planning is performed. The next two phases are user
          interface design (often interweaved with user experience design) and
          code development. For larger applications or applications that are
          built on frameworks, the human role of designer is often separate from
          the human role of code developer/script developer. For this reason
          the UI design phase and code phase might be going on concurrently,
          and/or might be iterative. At the point where the efforts of UI design
          and code development are combined into a working application, many
          Web developers now introduce a testing phase. It is at this point that
          a test-based methodology for accessibility support becomes an appropriate
          and useful strategy. </p>
        <p>Testers for Web applications sometimes rely largely on ad hoc or experiential
          tests, but increasingly there are tools available that assist with
          the job of testing a Web site. Many of these tools focus on specific
          aspects of testing: sub-areas such as testing under specific browser
          hosts; testing with stored state or data vs. initial experience; testing
          for different form factors; etc. One such sub-area of testing is testing
          the existing accessibility support. </p>
        <p>Because Silverlight supports the UI Automation accessibility framework,
          the best tools for testing accessibility support in a Silverlight application
          are the tools that work with UI Automation as their basis. Some of
          these tools are available from Microsoft, and other such tools are
          available from third parties. </p>
        <p>In a test-based methodology, a tester should view the application
          in its UIA representation. Using tools, testers can write tests for
          certain conditions and determine whether the application as a whole
          passes or fails. For example, a scripted test could determine whether
          all the controls in a UIA view have a valid string for <prop>Name</prop>.
          No <prop>Name</prop> string would potentially cause an assistive
          technology to misrepresent that element, and could cause confusion
          for user groups that rely on a particular assistive technology view
          of an application. In cases where an application failed these kinds
          of tests, the application might be sent back to the human role of developer/script
          writer, so that the missing accessibility information can be committed
          to the application code base. Then the application can be re-tested. </p>
        <p>A test-based methodology for accessibility support works best because
          Silverlight is such an extensive development platform. Sometimes it
          is not immediately obvious to a developer that a certain property required
          for accessibility remained unset. Or perhaps that developer was expecting
          that the human design role would have introduced that information as
          part of UI definition. Only when the integration of UI design and code
          is complete is it possible to see that there is still information or
          functionality missing. When the development process includes a testing
          step wherein dedicated tests for accessibility support are committed
          in a systematic way, it is much more likely that issues can be detected
          prior to application deployment. </p>
    		</div3>
    		<div3 id="silverlight_notes_test-files">
        <head> Running Silverlight Test Files Provided with Techniques </head>
        <p>Most Silverlight WCAG Techniques reference one or more ZIP files from
          the Test Files section of the technique. These ZIP files are linked
          from the techniques and can be uploaded for testing. </p>
        <p>To run the test files, you must have Microsoft Silverlight (the client
          run-time version) installed on your computer. To install Microsoft
          Silverlight, open the following URL: <loc href="http://www.microsoft.com/getsilverlight/">http://www.microsoft.com/getsilverlight/</loc> .
          Follow the instruction steps on the Web page. When you install Silverlight,
          you are installing the plug-in for use by all supported browser user
          agents on that computer. In order to test techniques that rely on UIA,
          you should install Silverlight on a computer that is running Microsoft
          Windows (XP SP2; Vista; Windows 7) as the operating system. Note that
          you must be running as adminstrator in order to install Microsoft Silverlight
          on the computer. </p>
        <p>Each ZIP file contains two items: an HTML file, and a Silverlight
          package file (always has a file extension of XAP). You can run any
          given test file through the following procedure: </p>
        <olist><item><p> Click the link from the technique to download the ZIP file. </p></item><item><p> Extract all files within the ZIP file to a temporary location,
            but use a tangible location such as C:\temp rather than temporary
            Internet files. Do not attempt to open the HTML file from within
            the unextracted archive; the test will only run correctly when the
            test components are extracted from ZIP. </p></item><item><p> Go to the folder location where you extracted the files. To run
            the test based on the current system's file associations for HTML,
            open the HTML with the associated browser. Otherwise, you must open
            the specific browser you want to test under, and type or copy either
            a file:/// URL or a Windows folder path into that browser's address
            bar. </p></item><item><p> This should open the HTML page. When the HTML page opens, it instantiates
            a Silverlight plug-in within the page content, which in turn references
            the other extracted file (the XAP) as local content. </p></item><item><p> Once the content is in view, follow the remaining steps that are
            indicated in the specific test procedure. </p></item></olist>
    		</div3>
    		<div3 id="silverlight_notes_sample-code">
        <head> Using Sample Code in Techniques to Create a New Silverlight Application </head>
        <p>The Silverlight techniques offer pre-built test files so that you
          can observe the basic operation of a technique without having to write
          the code yourself, or create your own application. The salient parts
          of Silverlight code or Silverlight XAML for the technique are provided
          as code blocks under the Examples section. In order to experiment more
          with the technique beyond running the test file, you might want to
          define your own Silverlight application project, and then import the
          code and XAML from the technique into your own project. This section
          describes the basic information that is necessary to create a project
          that incorporates sample code from a Silverlight technique. </p>
    			<div4 id="silverlight_notes_sample-code_prerequisites">
        <head> Prerequisites </head>
        <p>Creating a Silverlight application project requires that you have
          a full Silverlight application development environment installed. Although
          Silverlight applications run cross-platform, the actual development
          of Silverlight applications is done on Microsoft Windows computers.
          The computer must have Microsoft Visual Studio 2008 or Microsoft Visual
          Studio 2010 installed. With some limitations, the Express SKUs of Visual
          Studio are adequate for basic Silverlight application development.
          The Express SKUs are available for 30-day evaluation from the following
          URL: <loc href="http://www.microsoft.com/visualstudio/en-us/products/2010-editions/express" diff="chg">http://www.microsoft.com/visualstudio/en-us/products/2010-editions/express</loc> .
          In addition to Visual Studio, you also should install the Silverlight
          Tools, which includes the Silverlight SDK. Get Silverlight Tools from <loc href="http://go.microsoft.com/fwlink/?LinkID=177428">http://go.microsoft.com/fwlink/?LinkID=177428</loc>.
          What to install for Silverlight development is also linked to and explained
          at <loc href="http://www.silverlight.net/getting-started" diff="chg">Silverlight.net</loc>. </p>
    			</div4>
    			<div4 id="silverlight_notes_sample-code_project">
        <head> Creating the Project </head>
        <p>For general instructions, see <loc href="http://msdn.microsoft.com/en-us/library/cc838164%28VS.95%29.aspx">How
            to: Create a New Silverlight Project</loc>. This creates a new project
            based on a default template. </p>
        <p>The C# code or XAML shown in the Silverlight techniques is a usually
          a fragment that you should integrate into an existing code file or
          XAML page from the default project template. For code, you generally
          open the file page.xaml.cs from Solution Explorer, and paste the entirety
          of the example code into the body of the C# public partial class that
          you start with (this class comes from a template). For XAML, you generally
          open page.xaml from Solution Explorer and paste the entirety of the
          XAML into the &lt;Grid&gt; element. In some cases the example XAML
          is the entire XAML (you can identify this case if the example XAML
          contains one or more xmlns attributes). In this case, replace the entirety
          of the XAML. However, you may have to adjust the value of the x:Class
          attribute to properly reference your own partial class; this name is
          influenced by your own project naming in your local project and thus
          cannot be anticipated by the example code. Descibing Silverlight application
          development in its entirety is well beyond the scope of this document.
          Use resources available from <loc href="http://www.silverlight.net/getting-started" diff="chg">Silverlight.net</loc> or <loc href="http://msdn.microsoft.com/en-us/library/cc838158%28VS.95%29.aspx">MSDN
          Silverlight documentation</loc> to learn more about Silverlight application
          development. </p>
    			</div4>
    		</div3>
    		<div3 id="silverlight_notes_considerations">
        <head> Special Considerations for WCAG 2.0 Compliance </head>
        <p>2.4.2 Page Titled - In order to meet 2.4.2, Silverlight content must
          be embedded within an HTML page that has a page title in the HTML title
          element. </p>
        <p>3.1.1 Language of Page - The language of an HTML page is established
          by the <att>Lang</att> attribute of the containing object element in HTML. However,
          Silverlight's own logic generally interprets language/culture information
          using a Microsoft .NET Framework concept of the CultureInfo object.
          This makes it important to align the HTML-level lang with any CultureInfo
          as used by Silverlight. The reason for this is that assistive technologies
          are likely to respect the top-level declaration of the <att>Lang</att> attribute
          and to not be aware of the CultureInfo considerations of embedded Silverlight
          content. Application authors can delibrately override language settings
          of a client by specifying a discrete CultureInfo in the Silverlight &lt;object&gt; parameters;
          this can be useful if the application has real-time language switching,
          if users store language preferences either locally or based on server
          information or cookies, etc. Aligning html-lang with CultureInfo and
          adjusting the CultureInfo through various means are both discussed
          in Silverlight techniques. </p>
    		</div3>
    	</div2>
    	<technique id="SL1">
    		<short-name>Accessing Alternate Audio Tracks in Silverlight Media</short-name>
    		<applicability>
    			<ulist id="silverlight.applicability.general"><item><p> Microsoft Silverlight, versions 3 and greater </p></item><item><p> Silverlight managed programming model and Silverlight XAML </p></item></ulist>
    		</applicability>
    		<applies-to>
    			<success-criterion idref="media-equiv-audio-desc"/>
    			<success-criterion idref="media-equiv-audio-desc-only"/>
    		</applies-to>
    		<ua-issues>
    			<ua-issue id="silverlight.ua-issue.general"><p>See <specref ref="silverlight_ua_support"/> for general information on user agent support.</p></ua-issue>
    		</ua-issues>
    		<description>
    			<p>The objective of this technique is to show how to access an alternate
    				audio channel in a prepared media file that is played in a Silverlight <obj>MediaElement</obj>. </p>
    			<p>Silverlight supports media file formats that contains additional audio
    				channels in synchronization, beyond the two tracks for stereo audio
    				that are used by typical media player defaults. Silverlight provides
    				a dedicated <prop>AudioStreamIndex</prop> API on <obj>MediaElement</obj>,
    				so that the Silverlight application author can use Silverlight programming
    				techniques to select which audio channel to play for the user. Silverlight
    				control authors might label a UI control with text such as "Activate
    				this button to listen to an audio-only version of the media presentation" so
    				that the purpose of the media element control interface is clear to
    				the user. That way the same media control can be used to present the
    				media either as audio-video or as audio-only with alternate track depending
    				on user preference at run time. </p>
    			<p>The media formats that are supported by Silverlight are documented
    				on <loc href="http://msdn.microsoft.com/en-us/library/cc189080%28VS.95%29.aspx">MSDN</loc>. </p>
    			<section id="SL1_media_encoding">
    				<head>Media encoding</head>
    				<p>The process of encoding the media with additional audio channels is
    					not described in this technique because configuring and encoding audio
    					channels for media formats is a technique for any usage of media in
    					a computer application, not just a Silverlight-specific technique or
    					a Web technology technique. For more information on one possible procedure
    					for encoding the media in WMV format, see <loc href="http://www.microsoft.com/expression/products/EncoderPro_Overview.aspx">Microsoft Expression Encoder Overview</loc>.
    					Often, Silverlight authors will receive the media from a third party,
    					such as a video production facility, and are not directly involved
    					with the encoding process. Silverlight authors should verify that the
    					media they are using has alternate audio tracks encoded in it. If such
    					tracks exist, Silverlight authors will need a track listing from the
    					media producer to know which of the audio tracks is intended as the
    					alternate audio. Other tracks might exist in the encoded media that
    					provide language translations of the default audio, or that serve other
    					purposes. </p>
    			</section>
    		</description>
    		<examples>
    			<eg-group>
    				<head>Changing AudioStreamIndex </head>
    				<description>
    					<p>This example has a UI definition in XAML and interaction logic in
    						C#. In addition to the typical Play/Pause/Stop controls, this interface
    						includes a Play Full-Description Audio button. Activating the button
    						invokes a function that swaps the audio channels and plays an alternative
    						synchronized audio channel that contains a composite full-description audio track. </p>
    					<p>The following is the basic UI in XAML. This example is deliberately
    						simple and does not include <obj>AutomationProperties</obj>.
    						Audio streams are identified by an index in a collection. </p>
    				<codeblock><![CDATA[      <Grid x:Name="LayoutRoot" Background="White">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="20" />
        </Grid.RowDefinitions>
        <MediaElement x:Name="media" Source="/combined.wmv"
           Width="300" Height="300" 
           Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="3"
           AutoPlay="false"
        />
        <Button Click="StopMedia" 
     Grid.Column="0" Grid.Row="1" Content="Stop" />
        <Button Click="PauseMedia" 
     Grid.Column="1" Grid.Row="1" Content="Pause" />
        <Button Click="PlayMedia" 
     Grid.Column="2" Grid.Row="1" Content="Play" />
        <Button Name="AltAudioBtn" Grid.Row="2" HorizontalAlignment="Left" Grid.ColumnSpan="2" 
        Click="AltAudioBtn_Click">Play Full-Description Audio</Button>
    </Grid>
]]></codeblock>
    					<p>The following is the C# logic. </p>
    				<codeblock><![CDATA[        private void AltAudioBtn_Click(object sender, RoutedEventArgs e)
        {
            if (media.AudioStreamCount > 1)
            {
                if (media.AudioStreamIndex == 1)
                {
                    media.AudioStreamIndex = 0;
                    (sender as Button).Content = "Play full-description audio";
                } else {
                    media.AudioStreamIndex = 1;
                   (sender as Button).Content = "Play default audio";
                }
            }
            else
            {
                (sender as Control).IsEnabled = false;
            }
        }
        private void StopMedia(object sender, RoutedEventArgs e)
        {
            media.Stop();
        }
        private void PauseMedia(object sender, RoutedEventArgs e)
        {
            media.Pause();
        }
        private void PlayMedia(object sender, RoutedEventArgs e)
        {
            media.Play();
        }]]></codeblock>
    					<p>This example is shown in operation in the <loc href="AlternativeAudioChannelTestPage.html" linktype="examples">working example of Alternative Audio Channel</loc>. If using the test file, the test contains test audio tones rather than actual audio description, but the pitch of the tones is indicative of which of the channels is selected and played. </p>
    				</description>
    			</eg-group>
    		</examples>
    		<resources>
    			<see-also>
    				<ulist>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc189078%28VS.95%29.aspx">Audio
    						and Video Overview</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.mediaelement%28VS.95%29.aspx">MediaElement
    						Class</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.mediaelement.audiostreamindex%28VS.95%29.aspx">AudioStreamIndex
    						Property</loc> </p></item>
    				</ulist>
    				
    			</see-also>
    		</resources>
    		<tests>
    			<procedure>
    				<olist><item><p> Open the HTML page for a Silverlight application, where that application
    					plays media and the media is expected to support an alternate audio
    					track for the video. </p></item><item><p> Verify that the application user interface presents a control
    						that enables the user to cause the media to play with an alternate
    						audio track. </p></item><item><p> Activate that control. Verify that the audio portion of the media
    							player output as played through the computer's audio system is now
    							playing the alternate audio track. </p></item></olist>
    				
    			</procedure>
    			<expected-results>
    				<p>#2 and #3 are true. </p>
    				
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href="http://trace.wisc.edu/wcag_wiki/index.php?title=Accessing_Alternate_Audio_Tracks_in_Silverlight_Media"></loc></source>
    		</admin>
    	</technique>
    	<technique id="SL2">
    		<short-name>Changing The Visual Focus Indicator in Silverlight</short-name>
    		<applicability>
    			<p use-id="silverlight.applicability.general"/>
    		</applicability>
    		<applies-to>
    			<success-criterion idref="navigation-mechanisms-focus-visible"/>
    		</applies-to>
    		<ua-issues>
    			<ua-issue use-id="silverlight.ua-issue.general"/>
    		</ua-issues>
    		<description>
    			<p>The objective of this technique is to use the Silverlight "control
    				skinning" scenario and feature set to change the visible focus
    				indication of a control. In particular, the intent is to increase the
    				visibility of focus indication versus the appearance of a default-styled
    				control. This technique is useful both for the control sets that are
    				included in the Silverlight run time or SDK assemblies, as well as
    				for Toolkit or any third party distributed control. </p>
    			<p>The default Silverlight core controls all indicate some type of visible
    				focus indication, through their default templates. However, Silverlight
    				application authors can still use the skinning techniques to augment
    				or replace the visible focus indications for controls as used in their
    				applications. For more information on how Silverlight controls will
    				generally supply a default visual focus indicator, see <loc href="http://msdn.microsoft.com/en-us/library/cc903954%28VS.95%29.aspx">Focus
    					Overview on MSDN</loc>. </p>
    			<p>Silverlight control skinning is enabled through a deliberate separation
    				of UI and logic in the Silverlight control model. Appearance of a control
    				is largely written in XAML. The logic is largely written in code (for
    				example C#) and is left unaffected when a Silverlight application author
    				provides a new control template "skin". The hooks that connect
    				the appearance and the logic are a <prop>Style</prop> property of the control (which
    				the author changes the value of, to refer to their new XAML resource)
    				and a contract of expected named entities in the XAML. The control
    				logic invokes the names of the entities/parts whenever control state
    				changes, and the expectation is that the named part provides the necessary
    				appearance as defined in XAML. Design tools such as Visual Studio or
    				Expression Blend generate copies of the default templates and parts,
    				such that Silverlight authors can modify the parts that they want to
    				change the appearance of, and still preserve the remainder of default
    				appearance and behavior of the control. </p>
    			<p>For the visible focus indicator technique, the author typically modifies
    				a single visual element that renders in layout as an overlay on top
    				of the control when it is focused, and switches the overlay to nonvisible
    				when the control is not focused. This element is a named element that
    				is typically referred to from within the XAML named state Focused,
    				which in turn is hooked up to changes in the visual state. </p>
    			<p>Note that this technique assumes that the original control author
    				provided the necessary logic event hookup, and exposed a named state
    				associated with keyboard focus to work with. If this is not the case,
    				or if the scenario is that a Silverlight author is defining their own
    				control, a different technique is needed. See <specref ref="SL7"/>. </p>
    			<section id="SL2_focus_in_silverlight">
    				<head> Focus in Silverlight </head>
    				<p>Focus in Silverlight is equivalent to the larger user interface and
    					application concept of keyboard focus. The element that has focus is
    					the element within the Silverlight object tree and programming model
    					that has first chance to process the Silverlight key events. As a more
    					tangible example that is user-centric, if a <obj>TextBox</obj> has
    					keyboard focus, then when the user presses keys on the keyboard, the
    					characters associated with the user's pressed keys will appear in the
    					TextBox. A user interface element in Silverlight can obtain keyboard
    					focus in one of three ways: </p>
    				<olist><item><p> The user uses the Silverlight tab sequence to traverse into the
    					Silverlight content and to focus a specific control. </p></item><item><p> The Silverlight application's logic calls the <function>Focus</function> method
    						programmatically to force focus to a control. </p></item><item><p> The user performs some other action, for example uses the mouse
    							to click on a control. That control's specific logic handles the
    							Silverlight input event and uses that event as stimulus to call <function>Focus</function> on
    							that control. The difference between this case and the above case
    							is that the behavior is typically built-in to that control's runtime
    							behavior, and does not require each application author to call <function>Focus</function> in
    							application code. </p></item></olist>
    			</section>
    			
    		</description>
		<examples>
			<eg-group>
				<head>Two Button elements, one reskinned to provide new visible
					focus indicator </head>
				<description>
				<p>XAML templates can be verbose; for clarity, only the parts of the
					template that were changed or useful for showing the structure are
					shown. Omitted portions are shown as ellipsis (...). </p>
					<codeblock><![CDATA[<UserControl x:Class="VisibleFocusTemplate.MainPage"
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
 <UserControl.Resources>
   <Style x:Key="StrongFocusIndicator" TargetType="Button">
...
     <Setter Property="Template">
       <Setter.Value>
         <ControlTemplate TargetType="Button">
...
             <VisualStateManager.VisualStateGroups>
               <VisualStateGroup x:Name="FocusStates">
                 <VisualState x:Name="Focused">
                   <Storyboard>
                     <DoubleAnimation Duration="0" To="1"
 Storyboard.TargetProperty="Opacity"
 Storyboard.TargetName="FocusVisualElement"/>
                     <DoubleAnimation Duration="0" To="0.5"
 Storyboard.TargetProperty="(UIElement.Opacity)"
 Storyboard.TargetName="rectangle" d:IsOptimized="True"/>
                   </Storyboard>
                 </VisualState>
                 <VisualState x:Name="Unfocused"/>
               </VisualStateGroup>
             </VisualStateManager.VisualStateGroups>
...
             <Border x:Name="FocusVisualElement"
 IsHitTestVisible="false" Opacity="0"
 CornerRadius="2" BorderBrush="#D0FF0000"
 BorderThickness="4">
               <Rectangle x:Name="rectangle"
 IsHitTestVisible="false" Margin="2"
 Opacity="0" RadiusY="2" RadiusX="2"
 Fill="#A0FF0000"/>
             </Border>
          </ControlTemplate>
       </Setter.Value>
     </Setter>
   </Style>
 </UserControl.Resources>
 <StackPanel x:Name="LayoutRoot">
   <Button Width="275">Default button</Button>
   <Button Width="275"
 Style="{StaticResource StrongFocusIndicator}"
 >Button with re-templated focus visible indicator</Button>
 </StackPanel>
</UserControl>
]]></codeblock>
					<p>The most interesting aspect of this example is the change made to
						the FocusVisualElement part. Here is the original (default template)
						FocusVisualElement: </p>
					<codeblock><![CDATA[<Rectangle x:Name="FocusVisualElement" RadiusX="2" RadiusY="2" Margin="1" Stroke="#FF6DBDD1" StrokeThickness="1" 
 Opacity="0" IsHitTestVisible="false" />
]]></codeblock>
					<p>Here is the changed FocusVisualElement: </p>
					<codeblock><![CDATA[<Border x:Name="FocusVisualElement" IsHitTestVisible="false"
 Opacity="0" CornerRadius="2"
 BorderBrush="#D0FF0000" BorderThickness="4">
 <Rectangle x:Name="rectangle" IsHitTestVisible="false"
 Margin="2" Opacity="0"
 RadiusY="2" RadiusX="2" Fill="#A0FF0000"/>
</Border>
]]></codeblock>
					<p>The following images show how each of the two buttons (default and
						reskinned) appear when focused. </p>
					<p><image><img source="working-examples/SL2/default_button_focus.png" height="57" width="291"/><alt>Default button focus</alt></image> </p>
					<p><image><img source="working-examples/SL2/reskinned_button_focus.png" height="55" width="294"/><alt>Reskinned button focus</alt></image> </p>
					<p>This example is shown in operation in the <loc href="VisibleFocusTemplateTestPage.html" linktype="examples">working example of Visible Focus Template</loc>.</p>
					
				</description>
			</eg-group>
		</examples>
    		<resources>
    			<see-also>
    				<ulist>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc278069%28VS.95%29.aspx">Button
    						Styles and Templates</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc189093%28VS.95%29.aspx">Customizing
    					the Appearance of an Existing Control by Using a ControlTemplate</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc903954%28VS.95%29.aspx">Focus
    						Overview</loc> </p></item>
    				</ulist>
    			</see-also>
    		</resources>
    		<related-techniques>
    			<relatedtech idref="SCR31"></relatedtech>
    		</related-techniques>
    		<tests>
    			<procedure>
    				<p>Note that not all Silverlight applications necessarily will start
    					with the keyboard focus being somewhere within the Silverlight content
    					area for purpose of Step #2. It may be necessary to press TAB several
    					times to traverse the browser's framing user interface. Also, within
    					the browser's display area that displays the HTML document, there might
    					also be other HTML elements that are keyboard focusable, which are
    					representative of HTML that falls lexically before the &lt;object&gt;   tag
    					that instantiates the Silverlight plug-in. So it may also be necessary
    					to press TAB several times until these HTML elements are traversed. </p>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. </p></item><item><p> Using a keyboard, tab to the element where focus characteristics
    						are being examined. </p></item><item><p> Check that the background, border, or other noticable visual indicator
    							of the element changes color. </p></item><item><p> Check that the changes in color for the background, border, or
    								other noticable visual indicator are removed when the element loses
    								focus. </p></item></olist>
    				
    			</procedure>
    			<expected-results>
    				<p>#3 and #4 are true. </p>
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href="http://trace.wisc.edu/wcag_wiki/index.php?title=Changing_The_Visual_Focus_Indicator_in_Silverlight"/></source>
    		</admin>
    	</technique>
    	<technique id="SL3">
    		<short-name>Controlling Silverlight MediaElement Audio Volume</short-name>
    		<applicability>
    			<p use-id="silverlight.applicability.general"/>
    		</applicability>
    		<applies-to>
    			<success-criterion idref="visual-audio-contrast-dis-audio"/>
    		</applies-to>
    		<ua-issues>
    			<ua-issue use-id="silverlight.ua-issue.general"/>
    		</ua-issues>
    		<description>
    			<p>The objective of this technique is to adjust the volume for media
    				that is played in Silverlight applications, as implemented through
    				incorporating the Silverlight <obj>MediaElement</obj> object.
    				By default, a <obj>MediaElement</obj> will start playing its
    				media as soon as the UI loads completely AND the media source file
    				is downloaded. For details, see <specref ref="SL24"/>. </p>
    			<p>At any given time, a Silverlight <obj>MediaElement</obj> is associated
    				with exactly one media source as specified by the <prop>Source</prop> property
    				URI value. That source might be audio-only, or audio-video. The <loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.mediaelement.volume%28VS.95%29.aspx">Volume</loc> property
    				of <obj>MediaElement</obj> affects the audio playback volume
    				of that particular source when it is playing. The Silverlight plug-in
    				does not have a user option that adjusts the volume of ALL Silverlight
    				applications as run within it, or a standardized user interface that
    				is always present for all uses of <obj>MediaElement</obj>. Therefore
    				it is the responsibility of Silverlight application authors to provide
    				an adequate set of user interface controls, including volume adjustment,
    				whenever the Silverlight application plays media that has an audio
    				component. </p>
    			
    		</description>
    		<examples>
    			<eg-group>
    				<head>Providing a volume control and a Mute control as part
    					of a set of user interface controls that go with a MediaElement</head>
    				<description>
    					<p>In addition to the Play Pause Stop controls, application authors can
    						also provide a dedicated control that changes the <prop>Volume</prop> property
    						of the <obj>MediaElement</obj>. The typical control for setting
    						a discrete volume is <obj>Slider</obj>, because <obj>Slider</obj> is
    						designed for input of discrete values from a range. Adjusting <prop>Volume</prop> with
    						a data bound <obj>Slider</obj> changes the volume of any actively
    						playing media, independent of the system volume or of any other audio
    						source controlled by Silverlight. For <prop>Volume</prop> as set with the <obj>Slider</obj>,
    						the <obj>Binding</obj> in XAML declares the interaction between
    						the control and the <obj>MediaElement</obj>, without requiring
    						an event handler. However, not all users will be able to interact quickly
    						with a <obj>Slider</obj>, particularly if they are not using
    						a mouse. To help these users, application authors should also include
    						a "Mute" control. Rather than setting <prop>Volume</prop> to
    						0, application authors should instead set <prop>IsMuted</prop> to
    						true. Note that <prop>Volume</prop> and <prop>IsMuted</prop> values
    						are not directly related; if <prop>IsMuted</prop> is set to true,
    						that does not set <prop>Volume</prop> to 0, nor does setting <prop>Volume</prop> to
    						zero cause <prop>IsMuted</prop> to be set true. </p>
    					<codeblock><![CDATA[<UserControl x:Class="MediaElementControls.MainPage"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  >
   <Grid x:Name="LayoutRoot">
       <StackPanel>
           <MediaElement x:Name="media" Source="/xbox.wmv"
          Width="300" Height="300" 
          AutomationProperties.Name="Video of new Fable game for XBox"           
       />
           <Grid Name="UIControls">
               <Grid.ColumnDefinitions>
                   <ColumnDefinition Width="*" />
                   <ColumnDefinition Width="*" />
                   <ColumnDefinition Width="*"/>
               </Grid.ColumnDefinitions>
               <Grid.RowDefinitions>
                   <RowDefinition Height="*" />
                   <RowDefinition Height="Auto" />
                   <RowDefinition Height="20" />
               </Grid.RowDefinitions>
               <Button Click="StopMedia" 
    Grid.Column="0" Grid.Row="1" Content="Stop" />
               <Button Click="PauseMedia" 
    Grid.Column="1" Grid.Row="1" Content="Pause" />
               <Button Click="PlayMedia" 
    Grid.Column="2" Grid.Row="1" Content="Play" />
               <Button Click="MuteMedia" 
   Grid.Row="2" Grid.Column="0" Content="Mute" />
               <TextBlock Name="VolumeLabel" Grid.Row="2" Grid.Column="1" HorizontalAlignment="Right">Volume</TextBlock>
               <Slider Height="20"
           Value="{Binding Volume, Mode=TwoWay, ElementName=media}"
           Minimum="0" Maximum="1"
           Grid.Row="2" Grid.Column="2" Grid.ColumnSpan="2"
               AutomationProperties.LabeledBy="{Binding ElementName=VolumeLabel}"/>
           </Grid>
       </StackPanel>
   </Grid>
</UserControl>
]]></codeblock>
    					<p>The following is the C# logic. </p>
    					<codeblock><![CDATA[ private void StopMedia(object sender, RoutedEventArgs e)
 {
     media.Stop();
 }
 private void PauseMedia(object sender, RoutedEventArgs e)
 {
     media.Pause();
 }
 private void PlayMedia(object sender, RoutedEventArgs e)
 {
     media.Play();
 }
 private void MuteMedia(object sender, RoutedEventArgs e)
 {
    Button target = sender as Button;
    // mute if not muted, unmute if already muted, in either case make sure the button content for text and accessibility info is updated
    if (!media.IsMuted)
    {
       media.IsMuted = true;
       target.Content = "Unmute";
    }
    else
    {
        media.IsMuted = false;
        target.Content = "Mute";
    }
 }
]]></codeblock>
    					<p>This example is shown in operation in the <loc href="MediaElementControlsTestPage.html" linktype="examples">working example of Media Element Controls</loc>.</p>
    				</description>
    			</eg-group>
    		</examples>
    		<resources>
    			<see-also>
    				<ulist>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.mediaelement.volume%28VS.95%29.aspx">Volume</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc189078%28VS.95%29.aspx">Audio
    						and Video Overview</loc> </p></item>
    					<item><p><loc href="http://smf.codeplex.com/">Silverlight
    						Media Framework</loc> - a framework and a media player control implementation
    						that incorporates many of the Silverlight techniques related to <obj>MediaElement</obj> </p></item>
    				</ulist>
    			</see-also>
    		</resources>
    		<related-techniques>
    			<relatedtech idref="SL17"/>
    			<relatedtech idref="SL24"/>
    		</related-techniques>
    		<tests>
    			<procedure>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. It is
    					expected that the application incorporates a <obj>MediaElement</obj>. </p></item><item><p> Check that a control is available for controlling volume and that
    						the Volume control controls the volume of the playing media, independently
    						from system volume. </p></item><item><p> Check that control is available for muting, and that the Mute
    							control mutes the volume of the playing media, independently from
    							system volume. </p></item></olist>
    				
    			</procedure>
    			<expected-results>
    				<p>#2 OR #3 is true. </p>
    				
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href="http://trace.wisc.edu/wcag_wiki/index.php?title=Controlling_Silverlight_MediaElement_Audio_Volume"/></source>
    		</admin>
    	</technique>
    	<technique id="SL4">
    		<short-name>Declaring Discrete Silverlight Objects to Specify Language Parts
    			in the HTML DOM</short-name>
    		<applicability>
    			<p use-id="silverlight.applicability.general"/>
    		</applicability>
    		<applies-to>
    			<success-criterion idref="meaning-other-lang-id"/>
    		</applies-to>
    		<ua-issues>
    			<ua-issue use-id="silverlight.ua-issue.general"/>
    		</ua-issues>
    		<description>
    			<p>The objective of this technique is use the HTML <att>Lang</att> attribute on
    				the object tag to describe each Silverlight plug-in instance on the
    				HTML hosting page as a "part" that has a different language.
    				Assistive technologies that use HTML Lang as a determinant of language
    				of parts can thus treat all Silverlight content as using that HTML
    				Lang-declared language. </p>
    			<p>Most assistive technologies that are capable of determining Language
    				for Web content will use the HTML Lang tag value as the determinant
    				of the language of the page. Assistive technologies would also use
    				HTML Lang tag values for the language of parts. HTML Lang is not specifically
    				reported in accessibility frameworks. Assistive technologies would
    				typically access the HTML DOM to get this information. This technique
    				specifically addresses this known situation regarding how ATs obtain
    				Language information from HTML rather than from accessibility frameworks
    				that otherwise report other aspects of HTML content. </p>
    			<p>In order to support different language parts that each contain Silverlight
    				content, authors declare one Silverlight object tag per continuous
    				language part region in the HTML. For example, the following HTML is
    				a simplication of HTML markup for a page that contains two Silverlight
    				content areas, the first declaring Lang as English (en), the second
    				declaring Lang as German (de): </p>
    			<codeblock><![CDATA[     <body>
       <object type="application/x-silverlight-2" lang="en">
       </object>
       <object type="application/x-silverlight-2" lang="de">
       </object>
     </body>
     ]]></codeblock>
    			<p>To support communication between different Silverlight plug-in instances
    				that are hosted on the same HTML page, application authors can use
    				various techniques, including the following </p>
    			<ulist><item><p> System.Windows.Messaging APIs: this is the simplest technique,
    				and this is shown in Example 1 </p></item><item><p> Using a shared business object, and exchanging information by
    					having each Silverlight instance reference two-way data binding to
    					that business object's properties. </p></item><item><p> Exchanging information through the HTML DOM and declaring properties
    					of one or both instances as Scriptable by the DOM. </p></item></ulist>
    			<section id="SL4_silverlight_runtime_language_determination">
    				<head>Silverlight runtime language determination</head>
    				<p>Regardless of how HTML Lang is declared on the defining object tags,
    					many aspects of how Silverlight works with language and culture information
    					at run time are not determined by HTML Lang, and are instead determined
    					by the operating system and which culture that operating system is
    					running. For more information, see <loc href="SL27" linktype="techniques">Understanding
    						Language/Culture Properties as Used by Silverlight Applications and
    						Assistive Technologies</loc>. </p>
    			</section>
    			
    		</description>
    		<examples>
    			<eg-group>
    				<head>Two Silverlight object tags, each with different HTML
    					Lang, to support a simple language-translator application as a Web
    					page</head>
    				<description>
    					<p>The Visual Studio solution for this example has a total of 4 project
    						components: </p>
    					<ulist><item><p> The Web project that declares the HTML or ASP page that shows
    						the framework of how the two Silverlight object tags exist on a page.
    						This is where the HTML Lang is actually set. </p></item><item><p> A project for the English user control, a simple <obj>TextBox</obj>. </p></item><item><p> A project for a German user control, also a simple <obj>TextBox</obj>. </p></item><item><p> A library with a static translation function </p></item></ulist>
    					<p>In this example, the English user control implements a LocalMessageSender,
    						which sends asynchronous messages to the German user control. The German
    						user control has a LocalMessageReceiver, which is set to listen as
    						soon as the control is instantiated. When a message is received, the
    						German control calls a function of the translation library, and displays
    						translated text. </p>
    					<p>The following is the HTML page (some infrastructure and parameters
    					omitted for clarity): </p>
    					<codeblock><![CDATA[<html xmlns="http://www.w3.org/1999/xhtml" >
<body>

    <object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="25px" lang="en">
      <param name="source" value="ClientBin/SilverFish.xap"/>
    </object>

    <object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="25px" lang="de">
      <param name="source" value="ClientBin/SilverFish_DE.xap"/>
    </object>

</body>
</html>
]]></codeblock>
    					<p>The following is the XAML for the English user control: </p>
					<codeblock><![CDATA[<UserControl x:Class="SilverFish.MainPage"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Height="20" 
>
   <Grid x:Name="LayoutRoot" Background="White">
       <TextBox AcceptsReturn="False" Language="en-us"
       Name="EnglishTranslationBox" 
       LostFocus="EnglishTranslationBox_LostFocus"/>
   </Grid>
</UserControl>
]]></codeblock>
    					<p>The following is the code-behind for the English user control: </p>
    					<codeblock><![CDATA[   public partial class MainPage : UserControl
   {
       private LocalMessageSender messagesender;
       public MainPage()
       {
           InitializeComponent();
       }
       private void EnglishTranslationBox_LostFocus(object sender, RoutedEventArgs e)
       {
           messagesender = new LocalMessageSender("receiver");
           messagesender.SendAsync((sender as TextBox).Text);
       }
   }
   ]]></codeblock>
    					<p>The following is the code-behind for the German user control (the
    						XAML is minimal; the main relevant point is that it contains a <obj>TextBox</obj> target
    						named GermanTranslationBox). The code invokes the translation function
    						found in a separate library. The translation function is not shown,
    						it simply takes an English string and returns a German translation. </p>
    					<codeblock><![CDATA[   public partial class MainPage : UserControl
   {
       public MainPage()
       {
           InitializeComponent();
           LocalMessageReceiver lmr = new LocalMessageReceiver("receiver");
           lmr.MessageReceived += new EventHandler<MessageReceivedEventArgs>(lmr_MessageReceived);
           try
           {
               lmr.Listen();
           }
           catch (ListenFailedException) {}
       }
       void lmr_MessageReceived(object sender, MessageReceivedEventArgs e)
       {
           if (e.Message!="") {
               String translated;
               translated = Translator.TranslateThat(e.Message);
               GermanTranslationBox.Text = translated;
               GermanTranslationBox.Focus();
           }
       }
   }
]]></codeblock>
    					<p>This example is shown in operation in the <loc href="SilverFishTestPage.html" linktype="examples">working example of SilverFish</loc>.</p>
    				</description>
    			</eg-group>
    		</examples>
    		<resources>
    			<see-also>
    				<ulist>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc838238%28VS.95%29.aspx">Localizing
    					Silverlight-based Applications</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/dd833075%28VS.95%29.aspx">How
    						to: Implement Communication Between Local Silverlight-Based Applications</loc> </p></item>
    				</ulist>
    			</see-also>
    		</resources>
    		<related-techniques>
    			<relatedtech idref="SL27"/>
    			<relatedtech idref="H58"/>
    		</related-techniques>
    		<tests>
    			<procedure>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references multiple Silverlight object tags, each with different
    					HTML Lang values. </p></item><item><p> Verify that language settings through HTML Lang on object tags
    						are respected by assistive technologies that can use HTML Lang values
    						for language of parts determination. </p></item></olist>
    			</procedure>
    			<expected-results>
    				<p>#2 gives expected results. </p>
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href="http://trace.wisc.edu/wcag_wiki/index.php?title=Declaring_Discrete_Silverlight_Objects_to_Specify_Language_Parts_in_the_HTML_DOM"/></source>
    		</admin>
    	</technique>
    	<technique id="SL5">
    		<short-name>Defining a Focusable Image Class for Silverlight</short-name>
    		<applicability>
    			<p use-id="silverlight.applicability.general"/>
    		</applicability>
    		<applies-to>
    			<success-criterion idref="text-equiv-all"/>
    		</applies-to>
    		<ua-issues>
    			<ua-issue use-id="silverlight.ua-issue.general"/>
    		</ua-issues>
    		<description>
    			<p>The objective of this technique is to wrap the Silverlight <obj>Image</obj> class
    				inside a UI container class that is focusable. If the image is focusable,
    				users who use the TAB sequence to navigate content while the assistive
    				technology is active, and/or assistive technologies that construct
    				navigation structures that are based on the TAB sequence, can both
    				detect the image in navigation. The assistive technology can then associate
    				alternative text for that image within the navigation structure, and
    				report the information to the user. </p>
    			<p>Many existing assistive technologies do not construct initial navigation
    				views that are derived from UI Automation information if it is coming
    				from a non-focusable element in a Silverlight user interface. This
    				is particularly true if the assistive technology is in a navigation
    				mode that is specifically intended to help users enter information
    				into a form or similar interactive interface element; an example of
    				this situation is the Forms Mode of the JAWS screen reader. </p>
    			<p><loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.image%28VS.95%29.aspx">Image</loc> is
    				an example of a Silverlight element that is not focusable. This technique
    				and the example therein are intended to circumvent the possible omission
    				of a nonfocusable Silverlight <obj>Image</obj> element from certain
    				navigation views in existing assistive technology implementations.
    				The Silverlight <obj>Image</obj> is wrapped with a display/viewer
    				control class that is focusable. This image-wrapping control is initially
    				presented in assistive technology representations of a Silverlight
    				user interface that use only focusable elements when constructing the
    				assistive technology's representation of the application. </p>
    			<p>The image wrapper class uses the <prop>AutomationProperties.Name</prop> property
    				to provide a short text alternative for the contained <obj>Image</obj>,
    				so that the alternative text can be read or otherwise presented by
    				assistive technologies. The Silverlight API <prop>AutomationProperties.Name</prop> directly
    				sets <prop>Name</prop> in the UI Automation tree. The properties
    				in the UI Automation tree are reported to assistive technologies, when
    				the assistive technology implements behavior that acts as a UI Automation
    				client. <prop>Name</prop> is one of the accessibility framework
    				properties that most assistive technologies present in some way, for
    				purposes of both name and value information, and setting <prop>Name</prop> is
    				the common technique for exposing text alternatives for any other <obj>Control</obj> class
    				(for example, for a button with an image, as shown in the technique <specref ref="SL18"/>). </p>
    			<p>This technique is intended for cases where application authors deliberately
    				do not want a visible image caption for the image to be part of the
    				user interface, and the image is a part of a larger interactive user
    				interface control or page. Otherwise, if there is a visible caption,
    				authors can use <specref ref="SL26"/>. </p>
    			
    		</description>
    		<examples>
    			<p>The two examples are intended to be used together, if an application
    				is both defining and consuming the focusable image control. </p>
    			<eg-group>
    				<head>Defining the FocusableImage XAML template and C# code
    					behavior</head>
    				<description>
    					<p>Silverlight supports a control development model whereby the visual
    						appearance of a control is largely defined in XAML, and the behavior
    						of a control (such as its event handling and hookups to services) are
    						implemented in a managed code language such as C#. The following is
    						the XAML template, which includes a visual state that shows visually
    						when the control is focused in UI. </p>
    					<codeblock><![CDATA[<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ImageEquivalent">
 <Style TargetType="local:FocusableImage">
   <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="local:FocusableImage">
        <Grid>
          <VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="FocusStates">
              <VisualState x:Name="Focused">
                <Storyboard>
                  <ColorAnimation  
 Storyboard.TargetName="focusborder"
 Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)"
 Duration="0" To="Blue"/>
                </Storyboard>
              </VisualState>
              <VisualState x:Name="Unfocused"/>
            </VisualStateGroup>
          </VisualStateManager.VisualStateGroups>
          <Border
            x:Name="focusborder"
            BorderThickness="4"
            BorderBrush="Transparent">
            <Image
             Margin="2" Opacity="10"
             Source="{TemplateBinding Source}"/>
         </Border>
       </Grid>
    </ControlTemplate>
    </Setter.Value>
   </Setter>
 </Style>
</ResourceDictionary>
]]></codeblock>
    					<p>The following is the C# class definition and logic. The logic includes
    						invoking a default automation peer on creation, and loading the template
    						as defined in the previous XAML example through the Silverlight "generic.xaml" resource
    						convention for custom controls. </p>
    					<codeblock><![CDATA[namespace ImageEquivalent
{
   public class FocusableImage : Control
   {
       protected override System.Windows.Automation.Peers.AutomationPeer OnCreateAutomationPeer()
       {
           return new FrameworkElementAutomationPeer(this);
       }
       public FocusableImage()
       {
           this.DefaultStyleKey = typeof(FocusableImage);
       }
       public ImageSource Source
       {
           get { return (ImageSource)this.GetValue(SourceProperty); }
           set { this.SetValue(SourceProperty,value); }
       }
       public static DependencyProperty SourceProperty = DependencyProperty.Register(
         "Source",
         typeof(ImageSource),
         typeof(FocusableImage),
         null);
       Boolean _Focused;
       void ChangeState()
       {
           if (_Focused)
           {
               VisualStateManager.GoToState(this,"Focused",false);
           }
           else
           {
               VisualStateManager.GoToState(this,"Unfocused",false);
           }
       }
       protected override void OnGotFocus(RoutedEventArgs e)
       {
           base.OnGotFocus(e);
           this._Focused = true;
           ChangeState();
       }
       protected override void OnLostFocus(RoutedEventArgs e)
       {
           base.OnGotFocus(e);
           this._Focused = false;
           ChangeState();
       }
   }
}
]]></codeblock>
    					<p>This example is shown in operation in the <loc href="ImageEquivalentTestPage.html" linktype="examples">working example of Focusable Image</loc>.</p>
    				</description>
    			</eg-group>
    			<eg-group>
    				<head>Using the FocusableImage class in UI and applying AutomationProperties.Name</head>
    				<description>
    					<p>Now that the image is wrapped by a focusable control, you can instantiate
    						an instance of the wrapper UI inside a Silverlight layout container,
    						specify <prop>AutomationProperties.Name</prop> at the level of
    						the wrapper control’s tag, and have that text serve as the alternative
    						text for the referenced source image file. </p>
    					<codeblock><![CDATA[   <StackPanel
   xmlns:local="clr-namespace:ImageEquivalent;assembly=FocusableImage"
   >
   <local:FocusableImage
     Height="300" Width="400
     AutomationProperties.Name="Diagram of secret lair"
     Source="/diagram_lair.png" />
   </StackPanel>
]]></codeblock>
    				</description>
    			</eg-group>
    		</examples>
    		<resources>
    			<see-also>
    				<ulist>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/ff400332%28VS.95%29.aspx">Automation
    						Properties for Accessibility Support in UI</loc> </p>
    					</item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/system.windows.automation.automationproperties.name%28VS.95%29.aspx">AutomationProperties.Name
    					Attached Property</loc> </p></item>
    					<item><p>Tools: <loc href="http://firstfloorsoftware.com/silverlightspy/">SilverlightSpy</loc> or <loc href="http://uiautomationverify.codeplex.com/">UIAVerify</loc> </p></item>
    				</ulist>
    				
    			</see-also>
    		</resources>
    		<related-techniques>
    			<relatedtech idref="H37"/>
    		</related-techniques>
    		<tests>
    			<head>Automation Tree</head>
    			<procedure>
    				<olist><item><p> Open the test HTML page in a Silverlight-supported useragent host;
    					to use UI Automation, use Microsoft Windows as platform. </p></item><item><p> Use the tab sequence inside the Silverlight content area to focus
    						the control. </p></item><item><p> Using an accessibility framework verification tool, check that
    							the string content is promoted as the default <prop>Name</prop> applied
    							to the control. </p></item></olist>
    				<note><p>Accessibility framework verification tools typically show the
    					entirety of an automation tree for a given application, and in fact
    					will show the tree for all applications running on the Windows client
    					machine. Focusing the control as in #2 is thus not strictly speaking
    					necessary. However, manually focusing using the application interface
    					is often a faster way to step into the automation tree as opposed to
    					having to open an extensive series of nested nodes starting from the
    					browser host application root. Whether this functionality exists depends
    					on which accessibility framework verification tool is being used for
    					testing. </p></note>
    			</procedure>
    			<expected-results>
    				<p>#3 is true. </p>
    			</expected-results>
    		</tests>
    		<tests>
    			<head>Screen Reader</head>
    			<procedure>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. To use
    					UI Automation, use Microsoft Windows as platform. </p></item><item><p> Engage the screen reader. Move focus to the control (for example,
    						use the tab sequence). </p></item><item><p> Check that the <prop>Name</prop> applied to the image is read
    							by the screen reader. </p></item></olist>
    			</procedure>
    			<expected-results>
    				<p>#3 is true. </p>
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href="http://trace.wisc.edu/wcag_wiki/index.php?title=Defining_a_Focusable_Image_Class_for_Silverlight"/></source>
    		</admin>
    	</technique>
    	<technique id="SL6">
    		<short-name>Defining a UI Automation Peer for a Custom Silverlight Control</short-name>
    		<applicability>
    			<p use-id="silverlight.applicability.general"/>
    		</applicability>
    		<applies-to>
    			<success-criterion idref="ensure-compat-rsv"/>
    		</applies-to>
    		<ua-issues>
    			<ua-issue use-id="silverlight.ua-issue.general"/>
    		</ua-issues>
    		<description>
    			<p>The objective of this technique is to create an <obj>AutomationPeer</obj> class
    				for a custom Silverlight control. The <obj>AutomationPeer</obj> exposes
    				accessibility properties of the control in a way that abstracts the
    				Silverlight technology specifics of the control model and maps information
    				to UI Automation concepts, so that these properties can be consumed
    				by the UI Automation accessibility framework. </p>
    			<p>The AutomationPeer concept is part of the overall architecture design
    				of the UI Automation system. The peer represents a deliberate abstraction
    				of the control, such that a client can obtain pattern-based information
    				about the specific purpose and capability of a control without knowing
    				its implementation-specific object model or having to resort to using
    				a framework-specific object model API. Also, the peers run in a different
    				process than the controls they represent, which has performance and
    				security advantages. For more information on UI Automation architecture,
    				see <loc href="http://msdn.microsoft.com/en-us/library/ms747327.aspx">UI
    					Automation Overview on MSDN</loc>. </p>
    			<p>Creating a custom Silverlight control is one way that Silverlight
    				application authors can create user interface components either for
    				their own application, or as a packaged redistributable that provides
    				the control UI for third parties. Creating an automation peer for a
    				custom control reports control-specific information to the UI Automation
    				accessibility framework, and enables a custom control to participate
    				in all of the same techniques involving UI Automation that can be used
    				for a control that is distributed in the core Silverlight run time.
    				Assistive technologies can use the UI Automation accessibility framework
    				to discover the name and role of the user interface component, and
    				can get and set values by accessing UI Automation patterns. UI Automation
    				thus supports extensibility, while maintaining a discovery system for
    				names, roles and values of UI components. </p>
    			<p>Control authors associate a peer with a class by implementing a method
    				override for the class implementation. Control authors declare name
    				and role through properties that are general to any UI Automation peer.
    				Control authors expose the means to get and set values by choosing
    				to support one or more patterns that are usually associated with a
    				role. For example, a control in the role of "Button" would
    				typically support an "Invoke" pattern. A consumer of UI Automation
    				could check whether the pattern was supported and then call the pattern-based
    				method <function>Invoke</function>, which would activate the button without
    				any device input events being produced or required. </p>
    			<p>By convention, controls and their automation peers share a naming
    				pattern. For example, if a control is named <obj>Spinner</obj>, its automation
    				peer is named <obj>SpinnerPeer</obj>. However, the actual wiring for the class-peer
    				association is made in the control code by overriding <function>OnCreateAutomationPeer</function>.
    				Thus it is necessary to have access to the control code in order to
    				associate a new peer class implementation with that control. </p>
    			<p>In addition to properties, automation peers can also expose methods
    				as part of the implemented UI Automation control pattern. For example,
    				a peer implementing the Value pattern can provide an implementation
    				of the <function>SetValue</function> method. The <function>SetValue</function> method
    				can be called by a UI Automation client in order to programmatically
    				set the value of the owner control. The functionality exposed by the
    				implementation of a control pattern can be accessed either by automation-based
    				testing, or by assistive technologies. </p>
    			
    		</description>
    		<examples>
    			<eg-group>
    				<head>SimpleNumericUpDown control and its peer</head>
    				<description>
    					<p>The example implements a very simple Silverlight custom control named
    						SimpleNumericUpDown. The control is a templateable control, meaning
    						that the UI is defined in a XAML file that serves as the default UI,
    						but any consumer of the control can change the visual appearance by
    						applying a new template. Nevertheless, the basic accessibility characteristics
    						of the control can be shaped by the control author, and can apply even
    						for cases where the visible UI is noticably different. This separation
    						between design-implementation and code-behavior is one reason for the
    						peer-owner design in UI Automation. The majority of the example shows
    						the C# code, including the following : </p>
    					<ulist><item><p> Associating the peer with the class. </p></item><item><p> Defining the peer, and basic information such as the class name. </p></item><item><p> Reporting which patterns the peer supports. In this case the peer
    						supports a Value pattern. </p></item></ulist>
    					<p>Control definition class: </p>
    					<codeblock><![CDATA[   public class SimpleNumericUpDown : Control
   {
       public SimpleNumericUpDown()
       {
           this.DefaultStyleKey = typeof(SimpleNumericUpDown);
       protected override System.Windows.Automation.Peers.AutomationPeer OnCreateAutomationPeer()
       {
           return new SimpleNumericUpDownAutomationPeer(this);
       }
 // templating and event handlers omitted
       public static DependencyProperty NumericValueProperty = DependencyProperty.Register(
           "NumericValue",
           typeof(Int32),
           typeof(SimpleNumericUpDown),
           new PropertyMetadata(0)
           );
       public Int32 NumericValue
       {
           get { return (Int32)this.GetValue(NumericValueProperty); }
           set {this.SetValue(NumericValueProperty,value);}
       }
   }
   ]]></codeblock>
    					<p>Automation peer definition: </p>
    					<codeblock><![CDATA[   public class SimpleNumericUpDownAutomationPeer : FrameworkElementAutomationPeer, IValueProvider
   {
       private SimpleNumericUpDown OwnerControl { get { return (SimpleNumericUpDown)Owner; } }
       public SimpleNumericUpDownAutomationPeer(SimpleNumericUpDown owner)
           : base(owner) {}
       //peer overrides
       protected override string GetClassNameCore()
       {
           return "SimpleNumericUpDown";
       }
       protected override AutomationControlType GetAutomationControlTypeCore()
       {
           return AutomationControlType.Spinner;
       }
       public override object GetPattern(PatternInterface patternInterface) {
           if (patternInterface == PatternInterface.Value)
           {
               return this;
           }
           return base.GetPattern(patternInterface);
       }
       // Value pattern implementation
       String IValueProvider.Value
       {
           get { return OwnerControl.NumericValue.ToString(); }
       }
       bool IValueProvider.IsReadOnly {get{return false;}}
       void IValueProvider.SetValue(string value)
       {
           OwnerControl.NumericValue = Convert.ToInt32(value);
       }
]]></codeblock>
    					<p>This example is shown in operation in the <loc href="SimpleNumericUpDownTestPage.html" linktype="examples">working example of Simple Numeric UpDown control</loc>.</p>
    				</description>
    			</eg-group>
    		</examples>
    		<resources>
    			<see-also>
    				<ulist>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc645045%28VS.95%29.aspx">UI
    						Automation of a Silverlight Custom Control</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/system.windows.automation.peers.frameworkelementautomationpeer%28VS.95%29.aspx">FrameworkElementAutomationPeer</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/ms753388.aspx">Accessibility</loc> </p></item>
    					<item><p>Tools: <loc href="http://firstfloorsoftware.com/silverlightspy/">SilverlightSpy</loc> or <loc href="http://uiautomationverify.codeplex.com/">UIAVerify</loc> </p></item>
    				</ulist>
    				
    			</see-also>
    		</resources>
    		<related-techniques>
    			<relatedtech idref="G10"/>
    		</related-techniques>
    		<tests>
    			<procedure>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. To see
    					UI Automation, use Microsoft Windows as platform. </p></item><item><p> Use a verification tool that is capable of showing the full automation
    						tree, and an object’s UI Automation properties and patterns as part
    						of the tree. (For example, use UIAVerify or Silverlight Spy; see
    						Resources links.) Select the item in the automation tree that is
    						accessing the relevant custom automation peer implementation. </p></item><item><p> Examine the set of properties exposed in the tree. Check that
    							name is reported by Name, that the class name is reported as ClassName,
    							and that there is a role as reported by the value of ControlType. </p></item><item><p> If the control is expected to report a value, check that the value
    								is reported in the tree somehow. (Exactly which property reports
    								the value varies depending on the control function and pattern; for
    								more information, see <loc href="http://msdn.microsoft.com/en-us/library/ff486375%28VS.85%29.aspx">Windows
    									Automation API</loc>). </p></item><item><p> Check whether a control pattern is reported in the tree. If a
    										control pattern is reported, test the methods of that pattern using
    										facilities in the verification tool. Verify that invoking the methods
    										has changed the corresponding read only property values in the tree. </p></item></olist>
    			</procedure>
    			<expected-results>
    				<p>#3, #4, and #5 (if applicable) are true. </p>
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href="http://trace.wisc.edu/wcag_wiki/index.php?title=Defining_a_UI_Automation_Peer_for_a_Custom_Silverlight_Control"/></source>
    		</admin>
    	</technique>
    	<technique id="SL7">
    		<short-name>Designing a Focused Visual State for Custom Silverlight Controls</short-name>
    		<applicability>
    			<p use-id="silverlight.applicability.general"/>
    		</applicability>
    		<applies-to>
    			<success-criterion idref="navigation-mechanisms-focus-visible"/>
    		</applies-to>
    		<ua-issues>
    			<ua-issue use-id="silverlight.ua-issue.general"/>
    		</ua-issues>
    		<description>
    			<p>The objective of this technique is to build custom visual states for
    				custom controls that include visible focus indicators in the templates
    				and parts. </p>
    			<p>The default Silverlight core controls all indicate some type of visible
    				focus indication, through their default templates. For more information
    				on how Silverlight controls will generally supply a default visual
    				focus indicator, see <loc href="http://msdn.microsoft.com/en-us/library/cc903954%28VS.95%29.aspx">Focus
    					Overview on MSDN</loc>. </p>
    			<p>Silverlight control skinning is enabled through a deliberate separation
    				of visible user interface design and control logic in the Silverlight
    				control model. Control authors expect that application authors might
    				reskin their control. But control authors should provide an initial
    				default set of states, templates, etc. so that application authors
    				have a good baseline of functionality to compare with their customization.
    				Defining visible focus states for all control parts is an example of
    				such baseline functionality. In order to make the visual focus state
    				customizable, the visual state should be associated with a name. Ideally
    				that name should have a human-readable meaning that hints at its purpose,
    				but the real reason for the name is that it connects the XAML-defined
    				template (which control consumers can change) with the control logic
    				defined by the control author (which control consumers cannot change).
    				Also, the visual names and groups in the XAML should be attributed
    				on the control class, to assist design tools. The best resource for
    				general information about Silverlight control customization is <loc href="http://msdn.microsoft.com/en-us/library/cc278064%28v=VS.95%29.aspx">Silverlight
    					documentation on MSDN</loc>. </p>
    			<section id="SL7_component_parts">
    				<head>Component Parts</head>
    				<p>Some controls are created by assembling various component parts that
    					are already defined as controls either by the Silverlight run time
    					libraries or by third parties. That scenario is not really what this
    					technique is about, because in that case the focus behavior is already
    					defined by the component's template, and the control author can re-use
    					that behavior as-is or reskin it but still through the same named state
    					definition. This technique specifically addresses how to define a control
    					where the interactive surface has mouse and keyboard handling defined
    					at a lower level for the control as a whole. The actual focus region
    					is defined by the control author in that case, and the focus indicator
    					is also defined to match the behavior visually and functionally. </p>
    				
    			</section>
    			<section id="SL7_focus_indicator_design">
    				<head>Design for Focus Indicators</head>
    				<p>The general design principles for visual focus indicators are that
    					the indicators should apply a visual change to the focus region's exterior
    					margin. A common pattern is to deliberately define the visuals for
    					the control with a pre-existing blank margin for its layout slot; that
    					way when the focus indicator is applied, the focus indicator can fill
    					that margin. </p>
    				<p>The actual graphic for the visual focus indicator is typically a border
    					or shaped frame of a solid color brush with at least 1 pixel line thickness.
    					The color used for the border stands out visually from the underlying
    					control background or other elements of the control. The contrast between
    					brush for visual focus and the remainder of control should be a contrast
    					difference that is visible to users who do not distinguish the hue
    					of colors, but can distinguish the lightness/value. In many cases the
    					border is rectangular, to go along with the control's layout slot.
    					However, if the control's basic shape is a non-rectangular shape, sometimes
    					the focus indicator is designed to make a border around that shape.
    					An example of a default Silverlight control that is round and applies
    					an exterior round border as a focus indicator is a <loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.radiobutton%28VS.95%29.aspx">RadioButton</loc>. </p>
    				<p>Most focus indicator designs change only the border and do not change
    					the main area of the control. One reason for this is that changes to
    					the main control are typically reserved for other interactive states
    					that also have a visual indicator. Specifically, controls need a visual
    					state that indicates that the mouse is over the control (this is termed
    					either MouseOver or Hover state). Controls that support activation
    					also have a visual state that provides feedback for activation. For
    					example, the default Silverlight <obj>RepeatButton</obj> changes
    					its <prop>Background</prop> gradient on the button field to be
    					darker blue value when the mouse is over the button, and changes to
    					an even darker value blue when the button is activated (either by clicking
    					the mouse or by pressing SPACE or ENTER with keyboard focus on the <obj>RepeatButton</obj>).
    					To see this behavior in a live sample, see <loc href="http://samples.msdn.microsoft.com/Silverlight/SampleBrowser/index.htm#/?sref=System.Windows.Controls.RepeatButtonEx">RepeatButton
    						sample on MSDN</loc>. </p>
    			</section>
    			<section id="SL7_focus_indicator_logic">
    				<head>Logic for Focus Indicators</head>
    				<p>Typical logic is that the border to indicate focus is present in the
    					default template design, but with an initial value of Visibility=Collapsed.
    					Then, a visual state for focus is defined with a name that properly
    					indicates its purpose as text (example: "Focused"). In addition,
    					a state is needed that undoes whatever changes were applied for focus,
    					once focus moves to another element (for example,   "Unfocused").
    					For example, if the "Focused" state sets the value Visibility=Visible
    					on some element, the "Unfocused" state sets that value to
    					Collapsed again. Silverlight's visual state system also provides a
    					way to group related states with a factoring name (for example, "FocusStates").
    					For more information on state names and state groups in Silverlight
    					visual states, as well as learning how these states define a control
    					contract that any control consumers should follow if they reskin that
    					control, see <loc href="http://msdn.microsoft.com/en-us/library/cc189093%28VS.95%29.aspx">Customizing
    						the Appearance of an Existing Control by Using a ControlTemplate on
    						MSDN</loc>. </p>
    				<p>The visual state system is designed to support visual transitions
    					to states, and for that reason the visual state system is closely coupled
    					with the Silverlight animation system. By animating the transition,
    					the visual appearance changes over a time interval. Typically, if transitions
    					are used, the time interval is short, one second or less. In the case
    					of focus indicators, it is typical to not use transitions and to instead
    					make a discrete change; otherwise, the state change might be interpreted
    					by users as a lag in interface response from their system. </p>
    				<p>The states themselves are designed in XAML, but are loaded and unloaded
    					through logic that the control author defines as part of their control
    					code. The control author does this by handling the appropriate events
    					that occur while the event scope applies to their control. For example,
    					to apply the "Focused" state, the control author handles
    					the <loc href="http://msdn.microsoft.com/en-us/library/system.windows.uielement.gotfocus%28VS.95%29.aspx">GotFocus
    						event</loc>. Rather than handle the event directly, the more common pattern
    					is to override a virtual method that acts as a prewired event handler, <loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.control.ongotfocus%28v=VS.95%29.aspx">OnGotFocus</loc>.
    					The centralized logic for visual state changes is the method <loc href="http://msdn.microsoft.com/en-us/library/system.windows.visualstatemanager.gotostate%28VS.95%29.aspx">GoToState</loc>,
    					with one of the parameters to pass representing the XAML name of the
    					correct state to load from the XAML templates. Examples for all of
    					the APIs discussed here are available in the MSDN topic <loc href="http://msdn.microsoft.com/en-us/library/cc278064%28VS.95%29.aspx">Creating
    						a New Control by Creating a ControlTemplate</loc>. </p>
    			</section>
    			<section id="SL7_silverlight_focus">
    				<head>Focus in Silverlight</head>
    				<p>Focus in Silverlight is equivalent to the larger user interface and
    					application concept of keyboard focus. The element that has focus is
    					the element within the Silverlight object tree and programming model
    					that has first chance to process the Silverlight key events. As a more
    					tangible example that is user-centric, if a <obj>TextBox</obj> has
    					keyboard focus, then when the user presses keys on the keyboard, the
    					characters associated with the user's pressed keys (or possibly input
    					that is enabled by an assistive technology that can substitute for
    					key strokes) will appear in the <obj>TextBox</obj>. A user interface
    					element in Silverlight can obtain keyboard focus in one of three ways: </p>
    				<olist><item><p> The user uses the Silverlight tab sequence to traverse into the
    					Silverlight content and to focus a specific control. </p></item><item><p> The Silverlight application's logic calls the Focus() method programmatically
    						to force focus to a control. </p></item><item><p> The user performs some other action, for example uses the mouse
    							to click on a control. That control's specific logic handles the
    							Silverlight input event and uses that event as stimulus to call Focus()
    							on that control. The difference between this case and the above case
    							is that the behavior is typically built-in to that control's runtime
    							behavior, and does not require each application author to call Focus()
    							in application code. </p></item></olist>
    			</section>
    		</description>
    		<examples>
    			<eg-group>
    				<head>Visible focus indicator as a style and state</head>
    				<description>
    					<p>The following is the XAML that defines the basic (normal) control
    						template. This control is simple: it has a yellow circle graphic, which
    						overlays a red circle edge when the control is focused. The circle
    						edge is defined by the "FocusVisual" element in the composition,
    						and is initially Visibility=Collapsed (the expected visual state prior
    						to being focused). </p>
    					<codeblock><![CDATA[<ResourceDictionary
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   xmlns:local="clr-namespace:FocusVisualCustomControl"
>
   <Style TargetType="local:SampleControl">
       <Setter Property="Template">
           <Setter.Value>
               <ControlTemplate TargetType="local:SampleControl">
                   <Grid x:Name="ControlRoot">
                       <Ellipse x:Name="CoinGraphic"
                         Fill="Orange"
                         Width="{TemplateBinding Width}"
                         Height="{TemplateBinding Height}"
                       />
                       <Ellipse x:Name="FocusVisual"
                         Visibility="Collapsed"
                         Stroke="Red"
                         StrokeThickness="1"
                         Width="{TemplateBinding FrameworkElement.Width}"
                         Height="{TemplateBinding FrameworkElement.Height}"
                       />
                   </Grid>
               </ControlTemplate>
           </Setter.Value>
       </Setter>
   </Style>
</ResourceDictionary>
]]></codeblock>
    					<p>The following is the specific visual state portion. Note how the
    						visual state includes an <obj>ObjectAnimation</obj> with discrete
    						keyframes for hard transition between Visible and Collapsed, targeting
    						the element "FocusVisual" in the composition shown in the
    						previous XAML. </p>
    					<codeblock><![CDATA[                       <VisualStateManager.VisualStateGroups>
                           <VisualStateGroup x:Name="FocusStates">
                               <VisualState x:Name="Unfocused"/>
                               <VisualState x:Name="Focused">
                                   <Storyboard>
                                       <ObjectAnimationUsingKeyFrames
                                         Storyboard.TargetName="FocusVisual" 
                                         Storyboard.TargetProperty="Visibility" Duration="0">
                                           <DiscreteObjectKeyFrame KeyTime="0">
                                               <DiscreteObjectKeyFrame.Value>
                                                   <Visibility>Visible</Visibility>
                                               </DiscreteObjectKeyFrame.Value>
                                           </DiscreteObjectKeyFrame>
                                       </ObjectAnimationUsingKeyFrames>
                                   </Storyboard>
                               </VisualState>
                           </VisualStateGroup>
                       </VisualStateManager.VisualStateGroups>
                       ]]></codeblock>
    					<p>The following is control logic in the control class that responds
    						to the focus-related events and switches visual states in response.
    						In this particular example, "Unfocused" is a state without
    						a definition. Switching to the definitionless state has the effect
    						of reverting to the default state, which in the case of this design
    						is intentional. Alternatively, authors could make specific template
    						changes that revert any animation that applied to the focused state. </p>
    					<codeblock><![CDATA[       protected override void OnGotFocus(RoutedEventArgs e)
       {
           base.OnGotFocus(e);
           VisualStateManager.GoToState(this, "Focused", false);
       }
       protected override void OnLostFocus(RoutedEventArgs e)
       {
           base.OnLostFocus(e);
           VisualStateManager.GoToState(this, "Unfocused", false);
       }
]]></codeblock>
    					<p>This example is shown in operation in the <loc href="FocusVisualCustomControlTestPage.html" linktype="examples">working example of Visual Focus Indicator</loc>.</p>
    				</description>
    			</eg-group>
    		</examples>
    		<resources>
    			<see-also>
    				<ulist>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc189093%28VS.95%29.aspx">Customizing
    					the Appearance of an Existing Control by Using a ControlTemplate</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc903954%28VS.95%29.aspx">Focus
    						Overview</loc> </p></item>
    				</ulist>
    				
    			</see-also>
    		</resources>
    		<related-techniques>
    			<relatedtech idref="SCR31"/>
    		</related-techniques>
    		<tests>
    			<procedure>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. </p></item><item><p> Using a keyboard, tab to the element where focus characteristics
    						are being examined. </p></item><item><p> Check that the background, border, or other noticable visual indicator
    							of the element changes color. </p></item><item><p> Check that the changes in color for the background, border, or
    								other noticable visual indicator are removed when the element loses
    								focus. </p></item></olist>
    			</procedure>
    			<expected-results>
    				<p>#3 and #4 are true. </p>
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href="http://trace.wisc.edu/wcag_wiki/index.php?title=Designing_a_Focused_Visual_State_for_Custom_Silverlight_Controls"/></source>
    		</admin>
    	</technique>
    	<technique id="SL8">
    		<short-name>Displaying HelpText in Silverlight User Interfaces</short-name>
    		<applicability>
    			<p use-id="silverlight.applicability.general"/>
    		</applicability>
    		<applies-to>
    			<success-criterion idref="text-equiv-all"/>
    			<success-criterion idref="minimize-error-cues"/>
    		</applies-to>
    		<ua-issues>
    			<ua-issue use-id="silverlight.ua-issue.general"/>
    		</ua-issues>
    		<description>
    			<p>The objective of this technique is to provide a long text alternative
    				that replaces content when a short text alternative is not sufficient
    				for a given user, and the user specifically requests that the application
    				should provide more context or more information through the application
    				user interface. The technique could also apply for providing a long
    				text alternative for a nontext object, for example for an image that
    				contains a level of detail that is difficult to capture in a standard
    				visible-in-UI image caption. </p>
    			<p>Silverlight supports a UI Automation property named <prop>HelpText</prop>,
    				to connote its possible usage to provide imperative instructions for
    				interactive elements. <prop>HelpText</prop> is not always forwarded
    				to users by existing assistive technologies, which is an issue discussed
    				in the technique <specref ref="SL19"/>.
    				Rather than relying on a particular assistive technology's support
    				for enabling users to access the UIA <prop>HelpText</prop>, application
    				authors can introduce user interface elements into their design that
    				databind directly to the <prop>HelpText</prop> property, but where
    				the interface element is not necessarily displayed by default. An interface
    				update might be designed to occur if the application user specifically
    				activates a "Get Help" action that is presented in the initial
    				user interface. </p>
    			<p>This technique emphasises a "HelpText" model as a factoring
    				practice. Silverlight application authors can use the <prop>HelpText</prop> as
    				a data source that centralizes such information, because it already
    				exists and has that intended purpose in accessibility frameworks. For
    				example, the <prop>HelpText</prop> could be shown in a tooltip,
    				a popup, a separate user interface element that is deliberately rendered
    				in close proximity, etc. For accessibility support, a recommended display
    				option for <prop>HelpText</prop> is to add or dynamically alter
    				a Silverlight text element in the primary user interface. Silverlight
    				supports an adaptive layout metaphor. Adding text to the runtime elements
    				in the application generally causes an interface redraw, which in turn
    				informs assistive technologies (through UIA properties and events)
    				that content might have changed. </p>
    			<p>To set the UIA <prop>HelpText</prop> in Silverlight, you set the
    				attached property <prop>AutomationProperties.HelpText</prop>. <prop>AutomationProperties.HelpText</prop> can
    				be set in code, but is typically set in XAML that defines a Silverlight
    				UI. </p>
    			<section id="SL8_helptext_tooltip">
    				<head>HelpText and Tooltip</head>
    				<p>The same information that is used for <prop>AutomationProperties.HelpText</prop> long
    					text alternatives could also be useful to sighted users. In this case,
    					the same text could be displayed in a Silverlight <loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.tooltip%28VS.95%29.aspx">ToolTip</loc> control.
    					The reason that application authors should use both <prop>AutomationProperties.HelpText</prop> AND <obj>Tooltip</obj> in
    					conjunction is because the <obj>Tooltip</obj> information is
    					not introduced into the runtime accessibility framework information
    					set by UI Automation, because that information set does not anticipate
    					the mouse action triggers that cause tooltips to display. In Silverlight
    					programming, a useful technique for sharing the same resource is to
    					combine the Silverlight data binding feature with the .NET Framework
    					embedded resource feature. For more information on combining Silverlight
    					data binding and resources for common string sources, see <loc href="http://msdn.microsoft.com/en-us/library/dd882554%28VS.95%29.aspx">How
    						to Make XAML Content Localizable</loc>. </p>
    				
    			</section>
    			
    		</description>
    		<examples>
    			<eg-group>
    				<head>Displaying a long text alternative for an Image with
    					XAML</head>
    				<description>
    					<p>Application authors can specify the <prop>AutomationProperties.HelpText</prop> attribute
    						on the <obj>Image</obj> element. The value provided for the attribute
    						should be a meaningful long text alternative for the image content.
    						The value of <prop>AutomationProperties.HelpText</prop> should
    						augment rather than duplicate any <prop>AutomationProperties.Name</prop> or
    						an associated <obj>Label</obj> or <prop>LabeledBy</prop> caption.
    						One or both of these is also typically specified to provide the basic
    						(short-text) accessibility support for an image. </p>
    					<codeblock><![CDATA[<StackPanel x:Name="imgContainer">
 <Image
   Height="400" Width="600"
   Source="/office.png"
   x:Name="imgOffice"
   AutomationProperties.HelpText=”The standard office layout
includes one corner desk unit in the corner farthest from the
door, and one file cabinet against the same wall as the door.”/>
 <sdk:Label x:Name="lblimgOffice" Target="{Binding ElementName=imgOffice}">Diagram of standard office layout</sdk:Label>
 <Button x:Name="HelpButton" Click="HelpButton_Click">Provide text-only alternative description of the previous image</Button>
</StackPanel>
]]></codeblock>
    					<p>The following event handler removes the Help button and replaces
    						it in UI with a <obj>TextBox</obj> that displays the long text
    						alternative. </p>
    					<codeblock><![CDATA[       private void HelpButton_Click(object sender, RoutedEventArgs e)
       {
           imgContainer.Children.Remove(HelpButton);
           TextBox tb = new TextBox();
           tb.IsReadOnly=true;
           tb.Text = AutomationProperties.GetHelpText(imgOffice);
           imgContainer.Children.Add(tb);
           tb.Focus();
       }
]]></codeblock>
    				</description>
    			</eg-group>
    			<eg-group>
    				<head>Using HelpText to augment existing form labels, to provide
    				long text instructions</head>
    				<description>
    					<p>This example provides instructions for two form fields. The same text
    						is also displayed for mouse users as a <obj>Tooltip</obj> and
    						the <prop>AutomationProperties.HelpText</prop> string is used as
    						a common source for both display options. In this example, the form
    						submission does not perform client-side validation (although server-side
    						validation following a data round trip might still exist, or validation
    						could be added similar to the technique shown in <specref ref="SL35"/>). </p>
    					<p>The following is the XAML UI: </p>
    					<codeblock><![CDATA[<UserControl xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" 
   x:Class="HelpTextAndToolTip.MainPage"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
       <Grid x:Name="LayoutRoot" Background="White" Margin="10">
           <Grid.RowDefinitions>
               <RowDefinition Height="Auto"/>
               <RowDefinition Height="Auto"/>
               <RowDefinition Height="Auto"/>
               <RowDefinition Height="Auto"/>
               <RowDefinition Height="Auto"/>
           </Grid.RowDefinitions>
           <Grid.ColumnDefinitions>
               <ColumnDefinition Width="Auto"/>
               <ColumnDefinition Width="200"/>
               <ColumnDefinition Width="Auto"/>
           </Grid.ColumnDefinitions>
           <TextBlock Text="Form With Tooltips" FontSize="16" FontWeight="Bold"
     Grid.Column="1" HorizontalAlignment="Center" />
           <sdk:Label x:Name="NameLabel" Target="{Binding ElementName=NameTextBox}"
     Grid.Row="2" Margin="3"/>
           <TextBox x:Name="NameTextBox" 
     AutomationProperties.Name="{Binding Content, ElementName=NameLabel}"
     Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=Explicit}"
     Grid.Column="1" Grid.Row="2" Margin="3"
                    AutomationProperties.HelpText="{Binding NameTextBoxToolTipString,Source={StaticResource TooltipStrings}}">
           <ToolTipService.ToolTip>
               <ToolTip Content="{Binding NameTextBoxToolTipString,Source={StaticResource TooltipStrings}}" />
           </ToolTipService.ToolTip>
           </TextBox>
           <sdk:Label x:Name="AgeLabel" Target="{Binding ElementName=AgeTextBox}"
     Grid.Row="3" Margin="3" HorizontalAlignment="Right"/>
           <TextBox x:Name="AgeTextBox" 
     AutomationProperties.Name="{Binding Content, ElementName=AgeLabel}" 
     Text="{Binding Age, Mode=TwoWay, UpdateSourceTrigger=Explicit}"  
     Grid.Column="1" Grid.Row="3" Margin="3"
    AutomationProperties.HelpText="{Binding AgeTextBoxToolTipString,Source={StaticResource TooltipStrings}}">
           <ToolTipService.ToolTip>
               <ToolTip Content="{Binding AgeTextBoxToolTipString,Source={StaticResource TooltipStrings}}" />
           </ToolTipService.ToolTip>
       </TextBox>
       <StackPanel Orientation="Horizontal">
           <Button x:Name="SubmitButton" Content="Submit" Click="SubmitButton_Click" Grid.Column="1" Grid.Row="4" Width="50" Margin="3" />
           <Button x:Name="HelpButton" Click="HelpButton_Click">Get Help</Button>
       </StackPanel>
       </Grid>
</UserControl>
]]></codeblock>
    					<p>The following is the resource definition in app.xaml: </p>
    					<codeblock><![CDATA[       <ResourceDictionary>
           <resources:Resource1 x:Key="TooltipStrings"/>
       </ResourceDictionary>
       ]]></codeblock>
    					<p>The generated resource code that defines the "Resource1" class
    						is not shown here because it is mostly infrastructure that is produced
    						by a generation task in Visual Studio. For more information about
    						embedded resources in Silverlight, see <loc href="http://msdn.microsoft.com/en-us/library/cc903945%28VS.95%29.aspx">Resources
    							Overview on MSDN</loc>. The resources here contain just two strings: </p>
    					<ulist><item><p> NameTextBoxToolTipString: Must be 10 characters or less. Required. </p></item><item><p> AgeTextBoxToolTipString Must be a value between 0 and 120. Required. </p></item></ulist>
    					<p>The following is the event handler code, which changes the interface. </p>
    					<codeblock><![CDATA[       private void HelpButton_Click(object sender, RoutedEventArgs e)
       {
           AgeLabel.Content = AgeLabel.Content + ": " + AutomationProperties.GetHelpText(AgeTextBox);
           NameLabel.Content = NameLabel.Content + ": " + AutomationProperties.GetHelpText(NameTextBox);
           NameTextBox.Focus();
       }
       ]]></codeblock>
    					<p>Note the call to Focus() - this puts the screen reader focus on
    						the first form element so that the added text can be read. The very
    						same text source as used for the <obj>Tooltip</obj> is added
    						programmatically to the existing <obj>Label</obj> controls. </p>
    					<p>After the Get Help button is clicked, the visual appearance of the
    						application is modified: </p>
    					<p><emph role="strong">Before activating Get Help</emph> </p>
    					<p><image><img source="working-examples/SL8/BeforeTooltipForm.png" height="321" width="342"/><alt>Image:BeforeTooltipForm.png</alt></image> </p>
    					<p><emph role="strong">After activating Get Help</emph> </p>
    					<p><image><img source="working-examples/SL8/AfterTooltipForm.png" height="321" width="609"/><alt>Image:AfterTooltipForm.png</alt></image> </p>
    					<p>This example is shown in operation in the <loc href="HelpTextAndToolTipTestPage.html" linktype="examples">working example of HelpText and Tooltip</loc>.</p>
    				</description>
    			</eg-group>
    		</examples>
    		<resources>
    			<see-also>
    				<ulist>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/ff400332%28VS.95%29.aspx">Automation
    					Properties for Accessibility Support in UI</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/system.windows.automation.automationproperties.helptext%28VS.95%29.aspx">AutomationProperties.HelpText
    						Attached Property</loc> </p></item>
    				</ulist>
    				
    			</see-also>
    		</resources>
    		<related-techniques>
    			<relatedtech idref="SL19"/> 
    		</related-techniques>
    		<tests>
    			<procedure>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. To see
    					UI Automation, use Microsoft Windows as platform. </p></item><item><p> For a control where this technique is used to provide a long text
    						alternative, verify that an identifiable and usable "Get Help"   control
    						is present in the initial user interface or assistive technology
    						representation of that interface. </p></item><item><p> Verify that activating the "Get Help" control changes
    							the user interface, and the changed user interface now displays or
    							reports long text alternatives that better address the user's information
    							needs. </p></item><item><p> If using a screen reader, verify that the long text alternative
    								can be read aloud. </p></item></olist>
    				
    			</procedure>
    			<expected-results>
    				<p>#2 and #3 are true. If testing with a screen reader, #4 is true. </p>
    				
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href="http://trace.wisc.edu/wcag_wiki/index.php?title=Displaying_HelpText_in_Silverlight_User_Interfaces"/></source>
    		</admin>
    	</technique>
    	<technique id="SL9">
    		<short-name>Handling Key Events to Enable Keyboard Functionality in Silverlight</short-name>
    		<applicability>
    			<p use-id="silverlight.applicability.general"/>
    		</applicability>
    		<applies-to>
    			<success-criterion idref="keyboard-operation-keyboard-operable"/>
    			<success-criterion idref="keyboard-operation-all-funcs"/>
    		</applies-to>
    		<ua-issues>
    			<ua-issue use-id="silverlight.ua-issue.general"/>
    		</ua-issues>
    		<description>
    			<p>The objective of this technique is to handle key events in a Silverlight
    				application and enable application-specific keyboard functionality
    				in a Silverlight application. The keyboard functionality might relate
    				to a particular element of the Silverlight application user interface,
    				or might be a handler for global key events within the application,
    				such as an application-wide access key. </p>
    			<p>In Silverlight, application authors handle user input by attaching
    				event handlers for input events. The input events are implemented on
    				a class that is a base element in the Silverlight class hierarchy,
    				such that all Silverlight UI elements can be the source of an input
    				event if the user interacts with them. Typically, the event handler
    				names are specified in XAML, although it is also possible to wire events
    				in code. The implementation of the handlers for the Silverlight managed
    				code programming model is always done in C# or Visual Basic code. </p>
    			<p>The most commonly used input events are the following: </p>
    			<ulist><item><p> <event>KeyUp</event>, <event>KeyDown</event> - these are the
    				key events. Which key is pressed is determined by event parameters
    				passed to the handler. </p></item><item><p> <event>MouseEnter</event>, <event>MouseOver</event>, <event>MouseLeave</event> </p></item><item><p> <event>MouseLeftButtonDown</event>, <event>MouseLeftButtonUp</event>, <event>MouseRightButtonDown</event>, <event>MouseRightButtonUp</event> </p></item></ulist>
    			<p>Other forms of input that Silverlight supports include touch devices
    				(with mouse promotion for cases where the application runs on devices
    				that do not have touch input modes) and a related inking mode. For
    				any UI interaction that uses mouse input or these other input modes,
    				Silverlight application authors can write a parallel key event handler
    				to provide users the keyboard equivalent. </p>
    			<p>Also, the Silverlight event system and control model combine to enable
    				behavior whereby a mouse event and a keyboard event can be treated
    				as the same event and can be handled by a common event handler. Using
    				this technique, Silverlight authors can facilitate keyboard functionality
    				in custom controls or as override behavior to existing Silverlight-supplied
    				controls, and provide equivalence for mouse events or events that are
    				specific to other input devices. Silverlight authors can also use controls
    				that already have a keyboard equivalence as a built-in behavior. </p>
    			<p>The parallel key event handler case, and the built-in behavior case,
    				are each shown in one of the examples. </p>
    			<p>All input events report a specific source that is communicated to
    				handler code as an event parameter, so that the application author
    				can identify which element in their Silverlight UI was being interacted
    				with, and the application can perform an action that is relevant to
    				that user input. In the case of mouse events, the event source is the
    				element that the mouse pointer is over at the time. In the case of
    				key events, the event source is the element that has focus. The element
    				that has focus is visually indicated so that the user knows which element
    				they are interacting with (see <specref ref="SL2"/>). Assistive technologies
    				often have parallel conventions whereby the user is made aware of which
    				element is visually focused and is the current input scope presented
    				by the assistive technology, </p>
    			<section id="SL9_core_events">
    				<head>Silverlight core control built-in keyboard functionality</head>
    				<p>The following is a list of the Silverlight-supplied controls that
    					have some level of key equivalence as a built-in behavior. In these
    					cases, it is not necessary to add a specific Key event handler; you
    					can handle the event and/or rely on the built-in key handling as listed. </p>
    				<ulist><item><p> <obj>Button</obj> (SPACE and ENTER) - raises <event>Click</event> event. </p></item><item><p> Other <obj>ButtonBase</obj> classes eg <obj>RepeatButton</obj>, <obj>HyperlinkButton</obj> (SPACE
    					and ENTER) - raises <event>Click</event> event. </p></item><item><p> <obj>TextBox</obj> (ENTER, unless in a mode where the <obj>TextBox</obj> 
    						accepts multiple lines) - moves focus to next control, treated like
    						a TAB </p></item><item><p> <obj>ListBox</obj> (various keys) - see <loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.listbox.onkeydown%28VS.95%29.aspx">OnKeyDown
    							Method</loc>. </p></item><item><p> <obj>ComboBox</obj> (arrow keys ) - traverse list choices
    								as control UI if popup area displayed. </p></item><item><p> <obj>RichTextBox</obj> (various keys ) - enable edit mode
    									operations; see <loc href="http://msdn.microsoft.com/en-us/library/ee681613%28VS.95%29.aspx">RichTextBox
    										Overview</loc>. </p></item><item><p> <obj>Slider</obj> (arrow keys ) - increment/decrement values. </p></item></ulist>
    			</section>
    			<section id="SL9_host_events">
    				<head>Browser hosts and keyboard events</head>
    				<p>Silverlight is hosted as a plug-in inside a browser host. The Silverlight
    					run-time only receives the input events that the browser host forwards
    					to hosted plug-ins through a browser-specific program access layer.
    					Occasionally the browser host receives input that the browser host
    					itself handles in some way, and does not forward the keyboard event.
    					An example is that a Silverlight application hosted by an Internet
    					Explorer browser host on Windows operating system cannot detect a press
    					of the ALT key, because Internet Explorer processes this input and
    					performs the action of bringing keyboard focus to the Internet Explorer
    					menu bar. Silverlight authors might need to be aware of browser-specific
    					input handling models and not rely on key events for keys that are
    					essentially reserved for use by a browser host. For more information,
    					see <loc href="http://msdn.microsoft.com/en-us/library/cc189015%28VS.95%29.aspx">Keyboard
    						Support</loc>. </p>
    			</section>
    			<section id="SL9_other_events">
    				<head>Other event models</head>
    				<p>This technique specifically discusses event handling for the Silverlight
    					managed programming model. However, Silverlight also supports parallel
    					models for event handling, either through a Silverlight run-time feature
    					or due to Silverlight's role as a plug-in within a script-capable browser
    					host. For example, events from the HTML DOM can be handled by JavaScript
    					at HTML scope for the overall Silverlight plug-in; this uses the browser
    					host as script processor and the Silverlight run-time is not directly
    					involved. Or, HTML DOM events can be handled through an HTML bridge
    					that calls into Silverlight application code. These event models can
    					potentially be used to provide keyboard equivalence, but it is generally
    					more convenient to use the managed code model as described in this
    					technique. For more information on other event models in Silverlight,
    					see <loc href="http://msdn.microsoft.com/en-us/library/cc189018%28VS.95%29.aspx">Events
    						Overview for Silverlight</loc>. </p>
    			</section>
    		</description>
    		<examples>
    			<p>Two examples are given. The first example is for the scenario of a
    				Silverlight application author that is simply incorporating an existing
    				control into their application design, and is taking advantage of mouse-keyboard
    				equivalence that is already defined by certain Silverlight core controls.
    				The second example is from the perspective of a control author, or
    				at least that of a Silverlight application author that intends to encapsulate
    				behavior in a custom Silverlight control and use it in their own application.
    				For this second example, the control will handle the general Silverlight
    				input event <event>KeyUp</event>, in order to check for input from
    				key(s) that are designated to have a specific input meaning for that
    				control. </p>
    			<eg-group>
    				<head>Built-in keyboard equivalence for core Silverlight controls</head>
    				<description>
    					<p>This example pertains to cases where the control that handles key
    						events is focusable (through the tab sequence, etc.) and where an existing
    						Silverlight control behavior provides the keyboard equivalence In this
    						example, a Silverlight UI includes a <obj>Button</obj> element.
    						For sighted users, or users that generally use the mouse to interact
    						with UI, a typical way to interact with the button is to position the
    						mouse pointer over the element, and click the left mouse button. However,
    						the <obj>Button</obj> also supports a built-in key handling behavior,
    						whereby either the SPACE or ENTER keys are treated as an equivalent
    						action to clicking the button with a mouse. The requirement for this
    						interaction is that the <obj>Button</obj> must have keyboard
    						focus at the point in time that SPACE or ENTER are pressed. The <obj>Button</obj> might
    						gain focus because the user pressed the TAB key to move through the
    						tab sequence, or some equivalent action enabled by assistive technology.
    						In terms of the programming experience, the Silverlight application
    						author does not have to separately handle <event>KeyDown</event> for
    						this case. Within the <obj>Button</obj> control built-in code,
    						the special case of SPACE or ENTER keys pressed while a <obj>Button</obj> has
    						focus invokes the button’s <event>Click</event> event. Then the Silverlight
    						application author can simply handle <event>Click</event> without
    						differentiating whether the input action was a mouse click or a keyboard
    						equivalent. The following is the entire XAML UI. </p>
    					<codeblock><![CDATA[<UserControl x:Class="BuiltInKeyEquivalence.MainPage"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
   <Grid x:Name="LayoutRoot" Background="White" Loaded="LayoutRoot_Loaded">
       <Button Name="button1"
   AutomationProperties.Name="Equivalence test"
   Height="20" Width="150"
   Click="button1_Click">Click me, or press SPACE!</Button>
   </Grid>
</UserControl>
]]></codeblock>
    					<p>The following is the C# logic. </p>
    					<codeblock><![CDATA[   private void button1_Click(object sender, RoutedEventArgs e)
   {
       MessageBox.Show("You clicked a button ... or maybe you hit the space bar ... or ENTER ... it's all the same to me.");
   }
   private void LayoutRoot_Loaded(object sender, RoutedEventArgs e)
   {
       System.Windows.Browser.HtmlPage.Plugin.Focus();
    }
]]></codeblock>
    					<p>This example is shown in operation in the <loc href="BuiltInKeyEquivalenceTestPage.html" linktype="examples">working example of built-in keyboard equivalents</loc>.</p>
    				</description>
    			</eg-group>
    			<eg-group>
    				<head>Keyboard events for a custom control, keyboard equivalence</head>
    				<description>
    					<p>In this example, a new Silverlight custom control named SimpleNumericUpDown
    						uses a control template that includes two buttons. To provide keyboard
    						equivalence for the buttons, an event handler is defined by the control
    						class code. The event handler invokes the action in response to certain
    						accelerator keys, where these actions are equivalent to clicking the
    						button composition parts of the control with a mouse. The following
    						is the default XAML template. </p>
    					<codeblock><![CDATA[<ControlTemplate TargetType="local:SimpleNumericUpDown">
  <Border Background="{TemplateBinding Background}"
          BorderBrush="{TemplateBinding BorderBrush}"
          BorderThickness="{TemplateBinding BorderThickness}" Name="controlFrame">
      <Grid>
          <Grid.ColumnDefinitions>
              <ColumnDefinition Width="*"/>
              <ColumnDefinition Width="30"/>
          </Grid.ColumnDefinitions>
          <TextBox x:Name="valueBox" Text="{Binding NumericValue, RelativeSource={RelativeSource TemplatedParent}}"/>
          <StackPanel Grid.Column="1">
              <Button Name="minusButton">-</Button>
              <Button Name="plusButton">+</Button>
          </StackPanel>
      </Grid>
  </Border>
</ControlTemplate>
]]></codeblock>
    					<p>The following C# code shows the event handlers. Also, the code includes
    						the event-wiring technique that is used whenever a Silverlight control
    						author implements a templateable control. This technique enables
    						the separation of UI appearance (which can be overridden) from the
    						input event-handling behavior (which is implemented by the control
    						author). </p>
    					<codeblock><![CDATA[   public class SimpleNumericUpDown : Control
   {
       public SimpleNumericUpDown()
       {
           this.DefaultStyleKey = typeof(SimpleNumericUpDown);
       }
       
       public override void OnApplyTemplate()
       {
           base.OnApplyTemplate();
           Button plusButton = GetTemplateChild("plusButton") as Button;
           Button minusButton = GetTemplateChild("minusButton") as Button;
           Border controlFrame = GetTemplateChild("controlFrame") as Border;
           plusButton.Click += new RoutedEventHandler(Increment);
           minusButton.Click += new RoutedEventHandler(Decrement);
           controlFrame.KeyUp += new KeyEventHandler(Handle_Accelerators);
       }
       private void Increment(object sender, RoutedEventArgs e)
       {
           this.NumericValue += 1;
       }
       private void Decrement(object sender, RoutedEventArgs e)
       {
           this.NumericValue -= 1;
       }
       private void Handle_Accelerators(object sender, KeyEventArgs e)
       {
           switch (e.Key)
           {
               case (Key.Left):
                   this.NumericValue -= 1; 
                   e.Handled=true;
                   break;
               case (Key.Right):
                   this.NumericValue += 1; 
                   e.Handled=true;
                   break;
               default: break;
           }
       }
       public Int32 NumericValue //definition omitted in this example
   }
]]></codeblock>
    					<p>This example is shown in operation in the <loc href="working-examples/SL6/SimpleNumericUpDownTestPage.html">working example of custom keyboard events</loc>.</p>
    				</description>
    			</eg-group>
    		</examples>
    		<resources>
    			<see-also>
    				<ulist>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/system.windows.uielement.keyup%28VS.95%29.aspx">KeyUp</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc189015%28VS.95%29.aspx">Keyboard
    					Support</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc903954%28VS.95%29.aspx">Focus
    					Overview</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc278064%28VS.95%29.aspx">Creating
    					a New Control by Creating a ControlTemplate</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc189018%28VS.95%29.aspx">Events
    						Overview for Silverlight</loc> </p></item>
    				</ulist>
    				
    			</see-also>
    		</resources>
    		<related-techniques>
    			<relatedtech idref="G90"/>
    		</related-techniques>
    		<tests>
    			<procedure>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. </p></item><item><p> Press TAB key to move keyboard focus to various element parts
    						of the user interface. </p></item><item><p> Verify that any user interface actions that exist for a given
    							element part each have a keyboard equivalent. </p></item></olist>
    			</procedure>
    			<expected-results>
    				<p>#3 is true. </p>
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href="http://trace.wisc.edu/wcag_wiki/index.php?title=Handling_Key_Events_to_Enable_Keyboard_Functionality_in_Silverlight"/></source>
    		</admin>
    	</technique>
    	<technique id="SL10">
    		<short-name>Implementing a Submit-Form Pattern in Silverlight</short-name>
    		<applicability>
    			<p use-id="silverlight.applicability.general"/>
    		</applicability>
    		<applies-to>
    			<success-criterion idref="consistent-behavior-unpredictable-change"/>
    		</applies-to>
    		<ua-issues>
    			<ua-issue use-id="silverlight.ua-issue.general"/>
    		</ua-issues>
    		<description>
    			<p>The objective of this technique is to declare Silverlight user interface
    				elements related to user input and use the Silverlight two-way data
    				binding techniques to provide a Submit button and opt-in forms submission
    				logic pattern for forms. The Submit button serves as the final deliberate
    				step of a form submission scenario. Silverlight programming techniques
    				do not provide a "Submit button as a distinct object. Rather,
    				application authors design their user input workflow such that it is
    				a single user action that initiates change of context that is related
    				to a data input scenario. The key to doing this in Silverlight is to
    				use a data binding mode that sets <loc href="http://msdn.microsoft.com/en-us/library/system.windows.data.binding.updatesourcetrigger%28VS.95%29.aspx">UpdateSourceTrigger</loc> of
    				all individual databound fields in that form or transaction. For any
    				data binding where the <loc href="http://msdn.microsoft.com/en-us/library/system.windows.data.binding.updatesourcetrigger%28VS.95%29.aspx">UpdateSourceTrigger</loc> is <prop>Explicit</prop>,
    				no real-time change is made to the data, until the <loc href="http://msdn.microsoft.com/en-us/library/system.windows.data.bindingexpression.updatesource%28VS.95%29.aspx">UpdateSource</loc> method
    				is called on each of these bindings. The application-specific Submit
    				button is connected to an event handler that calls <loc href="http://msdn.microsoft.com/en-us/library/system.windows.data.bindingexpression.updatesource%28VS.95%29.aspx">UpdateSource</loc> on
    				all of the databound UI elements that comprise that form. </p>
    			<section id="SL10_validation">
    				<head> Validation of data </head>
    				<p>The Submit button itself can also be the UI element that provides
    					warnings, instructions, etc. in a way that assistive technologies can
    					report to users, through the <obj>AutomationProperties</obj> techniques.
    					Using a Submit model for Silverlight form input to databound data sources
    					relies on a particular data binding mode. The Submit model can be used
    					either along with client-side or server-side validation techniques.
    					The example does not explicitly include either validation technique. </p>
    			</section>
    			
    		</description>
    		<examples>
    			<eg-group>
    				<head>Two form fields with Submit</head>
    				<description>
    					<p>In this example, the form fields correspond to a data object that
    						implements a view model. Silverlight uses the view model and data annotations
    						to generate some of its UI, notably the names of the fields are bound
    						to the original view model names from the data. This example has a
    						UI defined in XAML and logic defined in C#. The following is the XAML
    						UI , which also includes the binding definitions. Note the Mode=TwoWay,
    						UpdateSourceTrigger=Explicit attributes in the bindings. This is the
    						binding mode to use for the Submit button scenario. </p>
    					<codeblock><![CDATA[<UserControl x:Class="BasicSubmitButton.MainPage"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk">
 <StackPanel x:Name="LayoutRoot" Background="White" Margin="10">
   <Grid>
   <Grid.RowDefinitions>
       <RowDefinition Height="Auto"/>
       <RowDefinition Height="Auto"/>
       <RowDefinition Height="Auto"/>
       <RowDefinition Height="Auto"/>
       <RowDefinition Height="Auto"/>
   </Grid.RowDefinitions>
   <Grid.ColumnDefinitions>
       <ColumnDefinition Width="Auto"/>
       <ColumnDefinition Width="200"/>
       <ColumnDefinition Width="Auto"/>
   </Grid.ColumnDefinitions>
   <TextBlock Text="Form Input" FontSize="16" FontWeight="Bold"
     Grid.Column="1" HorizontalAlignment="Center" />
       <sdk:Label x:Name="NameLabel" Grid.Row="2" Margin="3"
   HorizontalAlignment="Right"
   Target="{Binding ElementName=NameTextBox}"/>
   <TextBox x:Name="NameTextBox" 
     AutomationProperties.Name="{Binding Content, ElementName=NameLabel}"
     Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=Explicit}"
     Grid.Column="1" Grid.Row="2" Margin="3" />
       <sdk:Label x:Name="AgeLabel" Grid.Row="3" Margin="3"
   HorizontalAlignment="Right"
   Target="{Binding ElementName=AgeTextBox}"/>
   <TextBox x:Name="AgeTextBox" 
     AutomationProperties.Name="{Binding Content, ElementName=AgeLabel}" 
     Text="{Binding Age, Mode=TwoWay, UpdateSourceTrigger=Explicit}"  
     Grid.Column="1" Grid.Row="3" Margin="3" />
   <Button x:Name="SubmitButton" Content="Submit" Click="SubmitButton_Click"
     Grid.Column="1" Grid.Row="4" Width="50" Margin="3"
   AutomationProperties.HelpText="Activate this button to submit form."/>
   </Grid>
 </StackPanel>
</UserControl>
]]></codeblock>
    					<p>The following is the C# logic for the page. Note the <function>SubmitButton_Click</function> handler.
    						This implementation disables the Submit button (representative of
    						a change of context, because now the form cannot be submitted again)
    						and provides user feedback without performing any validation. The
    						test file included in this technique sets up its data object as a
    						purely client side entity and does no validation, so that no service/server
    						is necessary to use the test file. Each element with a binding calls
    						the <function>UpdateSource</function> method, such that the act of pressing
    						the Submit button commits all the form's information all at once.
    						A full implementation might replace this with a server side data
    						object infrastructure. A full implementation might also provide a "Reset" or "Edit" button
    						to enable form submission again if there were issues. </p>
    					<codeblock><![CDATA[private void SubmitButton_Click(object sender, RoutedEventArgs e)
{
   (sender as Button).IsEnabled = false;
   NameTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource();
   AgeTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource();
   TextBlock tb = new TextBlock();
   tb.Text="Thank you, your form information was submitted.";
   LayoutRoot.Children.Add(tb);
}
]]></codeblock>
    					<p>This example is shown in operation in the <loc href="BasicSubmitButtonTestPage.html" linktype="examples">working example of Basic Submit Button</loc>.</p>
    				</description>
    			</eg-group>
    		</examples>
    		<resources>
    			<see-also>
    				<ulist>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc278072%28VS.95%29.aspx">Data
    						Binding</loc> </p></item>
    				</ulist>
    				
    			</see-also>
    		</resources>
    		<related-techniques>
    			<relatedtech idref="G80"/>
    		</related-techniques>
    		<tests>
    			<procedure>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. To test
    					UI Automation based behavior such as reading AutomationProperties.HelpText,
    					use Microsoft Windows as platform. </p></item><item><p> Verify that the user interface design of the form includes a clearly
    						indicated Submit button (a control that adequately communicates to
    						users that activating it will cause input to be submitted and might
    						cause a change of context). </p></item><item><p> Provide values for the various input fields of the form, and verify
    							that doing so does not in and of itself change the context. </p></item><item><p> Verify that if change of context occurs at all, that action is
    								delayed until after the Submit button is activated. </p></item></olist>
    			</procedure>
    			<expected-results>
    				<p>#2, #3, and #4 are true. </p>
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href="http://trace.wisc.edu/wcag_wiki/index.php?title=Implementing_a_Submit-Form_Pattern_in_Silverlight"/></source>
    		</admin>
    	</technique>
    	<technique id="SL11">
    		<short-name>Pausing or Stopping A Decorative Silverlight Animation</short-name>
    		<applicability>
    			<p use-id="silverlight.applicability.general"/>
    		</applicability>
    		<applies-to>
    			<success-criterion idref="time-limits-pause"/>
    		</applies-to>
    		<ua-issues>
    			<ua-issue use-id="silverlight.ua-issue.general"/>
    		</ua-issues>
    		<description>
    			<p>The objective of this technique is to associate a "Pause" or "Stop"   action
    				for a Silverlight animation with a user interface control. This enables
    				a user to pause or stop an animation in Silverlight content. </p>
    			<p>The Silverlight animation system is generalized such that nearly any
    				Silverlight property of type <obj>Double</obj>, <obj>Point</obj> or <obj>Color</obj> can
    				be animated, or a property can cycle through discrete object values.
    				Thus the possibilities for which properties in the user interface can
    				be animated are quite broad. The general technique shown can be used
    				to pause or stop any Silverlight animation, including those that are
    				purely decorative. </p>
    			<section id="SL11_pause_stop">
    				<head> Pause versus Stop </head>
    				<p>Silverlight has two discrete methods for animation control: a <function>Pause</function> method
    					and a <function>Stop</function> method. The difference in behavior is that <function>Pause</function> uses
    					whatever the last value was while the animation was still running,
    					and holds that value permanenently (unless the animation is restarted). <function>Stop</function> sets
    					the value to be whatever value existed before the animation was started.
    					However, calling <function>Stop</function> on an animation often results
    					in a behavior that looks like a "reset"   to the user; this
    					is particularly true if the animation is animating an element's position
    					on screen. In many cases, what might be a conceptual   "stop" for
    					the user is better accomplished by a "permanent Pause" in
    					the Silverlight animation API. Whether to call <function>Pause</function> or <function>Stop</function> is
    					an aesthetic decision and application authors can experiment to see
    					which behavior has the best appearance. If application authors choose
    					to use <function>Stop</function>, authors can simply replace the call to
    					.Pause() with a call to .Stop() for any code that is based on this
    					technique's example. </p>
    			</section>
    			
    		</description>
    		<examples>
    			<eg-group>
    				<head>Pausing a decorative animation</head>
    				<description>
    					<p>The following is the XAML UI. The animated object and the animation
    						behavior are both described in XAML, as is the control that users can
    						activate to pause the animation. </p>
    					<codeblock><![CDATA[<UserControl x:Class="PauseBouncyBall.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
 <UserControl.Resources>
   <Storyboard x:Key="anim" RepeatBehavior="Forever" >
       <DoubleAnimationUsingKeyFrames Storyboard.TargetName="Ball"
          Storyboard.TargetProperty="(Canvas.Top)"
        FillBehavior="HoldEnd" AutoReverse="True">
               <EasingDoubleKeyFrame Value="100" KeyTime="00:00:01">
                   <EasingDoubleKeyFrame.EasingFunction>
                       <BounceEase Bounces="-1" EasingMode="EaseIn"/>
                   </EasingDoubleKeyFrame.EasingFunction>
               </EasingDoubleKeyFrame>
           </DoubleAnimationUsingKeyFrames>
   </Storyboard>
 </UserControl.Resources>
 <Canvas x:Name="LayoutRoot" Background="White" Height="600" Width="800">
   <Ellipse Name="Ball" Fill="Red" Width="20" Height="20" Canvas.Top="200">
       <Ellipse.RenderTransform>
           <TransformGroup>
               <TranslateTransform/>
           </TransformGroup>
       </Ellipse.RenderTransform>
   </Ellipse>
   <Button HorizontalAlignment="Left" Width="200" Click="Button_Click">Stop the bouncy ball please!</Button>
 </Canvas>
</UserControl>
]]></codeblock>
    					<p>The following is the C# logic. One function is the "page"   constructor,
    						which is what starts and loops the animation. The other function
    						is the event handler for the UI control (a button). The event handler
    						retrieves the animation definition from the page resources, and calls
    						the <function>Pause</function> method on the animation. </p>
    					<codeblock><![CDATA[       public MainPage()
       {
           InitializeComponent();
           (this.Resources["anim"] as Storyboard).Begin();
       }
       private void Button_Click(object sender, RoutedEventArgs e)
       {
           (this.Resources["anim"] as Storyboard).Pause();
       }
]]></codeblock>
    					<p>This example is shown in operation in the <loc href="PauseBouncyBall.html" linktype="examples">working example of Pause Bouncy Ball</loc>.</p>
    				</description>
    			</eg-group>
    		</examples>
    		<resources>
    			<see-also>
    				<ulist>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc189019%28VS.95%29.aspx">Animation
    					Overview</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc189069%28VS.95%29.aspx">Working
    						with Animations Programmatically</loc> </p></item>
    				</ulist>
    				
    			</see-also>
    		</resources>
    		<tests>
    			<procedure>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. For Silverlight
    					content with moving, blinking, scrolling or auto-updating content
    					that is the result of a running Silverlight animation: </p></item><item><p> Check for a mechanism to stop the movement, blinking, scrolling
    						or auto-updating. </p></item><item><p> Check that the movement, blinking, scrolling or auto-updating
    							stops when the mechanism is activated and does not restart by itself. </p></item><item><p> For pause, check that the animation can be restarted using a start
    								mechanism. </p></item></olist>
    			</procedure>
    			<expected-results>
    				<p>#3 is true. </p>
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href="http://trace.wisc.edu/wcag_wiki/index.php?title=Pausing_or_Stopping_A_Decorative_Silverlight_Animation"/></source>
    		</admin>
    	</technique>
    	<technique id="SL12">
    		<short-name>Pausing, Stopping, or Playing Media in Silverlight MediaElements</short-name>
    		<applicability>
    			<p use-id="silverlight.applicability.general"/>
    		</applicability>
    		<applies-to>
    			<success-criterion idref="time-limits-pause"/>
    		</applies-to>
    		<ua-issues>
    			<ua-issue use-id="silverlight.ua-issue.general"/>
    		</ua-issues>
    		<description>
    			<p>The objective of this technique is to create a control user interface
    				for the Silverlight <obj>MediaElement</obj> object. The controls
    				enable users to pause or stop the video to prevent the video images
    				on the <obj>MediaElement</obj> surface from moving, and stop
    				video-associated audio. These UI controls enable an interaction defined
    				in code event handlers. Each handler calls one of the following <obj>MediaElement</obj> methods: </p>
    			<ulist><item><p> <loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.mediaelement.pause%28VS.95%29.aspx">Pause</loc> </p></item><item><p> <loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.mediaelement.play%28VS.95%29.aspx">Play</loc> </p></item><item><p> <loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.mediaelement.stop%28VS.95%29.aspx">Stop</loc> </p></item></ulist>
    			<p>Note that by default, a <obj>MediaElement</obj> will start playing
    				its media as soon as the UI loads completely AND the media source file
    				is downloaded (or a certain buffer size is reached, in the case of
    				streaming media). Use the <prop>AutoPlay</prop> property to change
    				this default. </p>
    		</description>
    		<examples>
    			<eg-group>
    				<head>Providing MediaElement controls in the UI</head>
    				<description>
    					<p>This example has a UI definition in XAML and interaction logic in
    					C#. </p>
    					<codeblock><![CDATA[<UserControl x:Class="MediaElementControls.MainPage"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 >
  <Grid x:Name="LayoutRoot">
      <StackPanel>
          <MediaElement x:Name="media" Source="/xbox.wmv"
         Width="300" Height="300" 
         AutomationProperties.Name="Video of new Fable game for XBox"           
      />
          <Grid Name="UIControls">
              <Grid.ColumnDefinitions>
                  <ColumnDefinition Width="*" />
                  <ColumnDefinition Width="*" />
                  <ColumnDefinition Width="*"/>
              </Grid.ColumnDefinitions>
              <Grid.RowDefinitions>
                  <RowDefinition Height="*" />
                  <RowDefinition Height="Auto" />
                  <RowDefinition Height="20" />
              </Grid.RowDefinitions>
              <Button Click="StopMedia" 
   Grid.Column="0" Grid.Row="1" Content="Stop" />
              <Button Click="PauseMedia" 
   Grid.Column="1" Grid.Row="1" Content="Pause" />
              <Button Click="PlayMedia" 
   Grid.Column="2" Grid.Row="1" Content="Play" />
              <Button Click="MuteMedia" 
  Grid.Row="2" Grid.Column="0" Content="Mute" />
              <TextBlock Name="VolumeLabel" Grid.Row="2" Grid.Column="1" HorizontalAlignment="Right">Volume</TextBlock>
              <Slider Height="20"
          Value="{Binding Volume, Mode=TwoWay, ElementName=media}"
          Minimum="0" Maximum="1"
          Grid.Row="2" Grid.Column="2" Grid.ColumnSpan="2"
              AutomationProperties.LabeledBy="{Binding ElementName=VolumeLabel}"/>
          </Grid>
      </StackPanel>
  </Grid>
</UserControl>

private void StopMedia(object sender, RoutedEventArgs e)
{
    media.Stop();
}
private void PauseMedia(object sender, RoutedEventArgs e)
{
    media.Pause();
}
private void PlayMedia(object sender, RoutedEventArgs e)
{
    media.Play();
}
private void MuteMedia(object sender, RoutedEventArgs e)
{
    Button target = sender as Button;
    // mute if not muted, unmute if already muted, in either case make sure the button content for text and accessibility info is updated
    if (!media.IsMuted)
    {
        media.IsMuted = true;
        target.Content = "Unmute";
    }
    else
    {
         media.IsMuted = false;
         target.Content = "Mute";
     }
}
]]></codeblock>
    					<p>This example is shown in operation in the <loc href="working-examples/SL3/MediaElementControlsTestPage.html">working example of Media Element Controls</loc>.</p>
    				</description>
    			</eg-group>
    		</examples>
    		<resources>
    			<see-also>
    				<ulist>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc189078%28VS.95%29.aspx">Audio
    					and Video Overview</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.mediaelement%28VS.95%29.aspx">MediaElement
    					Class</loc> </p></item>
    					<item><p><loc href="http://smf.codeplex.com/">Silverlight
    						Media Framework</loc> - a framework and a media player control implementation
    						that incorporates many of the Silverlight techniques related to <obj>MediaElement</obj> </p></item>
    				</ulist>
    				
    			</see-also>
    		</resources>
    		<related-techniques>
    			<relatedtech idref="SL17"/>
    			<relatedtech idref="SL24"/>
    		</related-techniques>
    		<tests>
    			<procedure>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. The application
    					is expected to incorporate a <obj>MediaElement</obj> in the
    					user interface. </p></item><item><p> Check that interactive controls are available so that users can
    						pause or stop the media. </p></item><item><p> Check that when activated, the controls stop or pause the media. </p></item></olist>
    			</procedure>
    			<expected-results>
    				<p>#2 and #3 are true. </p>
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href="http://trace.wisc.edu/wcag_wiki/index.php?title=Pausing,_Stopping,_or_Playing_Media_in_Silverlight_MediaElements"/></source>
    		</admin>
    	</technique>
    	<technique id="SL13">
    		<short-name>Providing A Style Switcher To Switch To High Contrast</short-name>
    		<applicability>
    			<p use-id="silverlight.applicability.general"/>
    		</applicability>
    		<applies-to>
    			<success-criterion idref="visual-audio-contrast-contrast"/>
    			<success-criterion idref="visual-audio-contrast7"/>
    		</applies-to>
    		<ua-issues>
    			<ua-issue use-id="silverlight.ua-issue.general"/>
    		</ua-issues>
    		<description>
    			<p>The objective of this technique is to incorporate high contrast color
    				choices into a user interface visual design for Silverlight, by changing
    				the values of styles or templates, or changing values of individual
    				resources such as brushes or colors. </p>
    			<p>Silverlight styles and templates are produced in XAML. Silverlight
    				event handlers (such as the ones that engage the style switch) are
    				written in code, but are often wired through a method name reference
    				in the XAML. For more information on how to use templates, styles and
    				resources to change the appearance of Silverlight controls, see <loc href="http://msdn.microsoft.com/en-us/library/cc278068%28VS.95%29.aspx">Control
    					Customization topic on MSDN</loc>. </p>
    			<p>Silverlight provides a built-in property that can determine whether
    				the hosting operating system is using a high contrast theme. This is
    				a Boolean value only; Silverlight API cannot determine any further
    				specifics about the theme choice, such as the colors being used or
    				the contrast ratio between the colors. Querying this property at application
    				startup is one possible trigger mechanism for applying high contrast
    				themes to Silverlight content. Another mechanism is to expose a control
    				(such as a button or text link) to the user, so that the user can engage
    				high contrast for a Silverlight application's content by activating
    				a control within the Silverlight application. </p>
    			<section id="SL13_themes">
    				<head> Silverlight Toolkit themes and System Colors </head>
    				<p>An extension to the Silverlight core deliverables known as the Silverlight
    					Toolkit provides theming APIs and various themed styles for Silverlight
    					controls, including the core controls. Most of these themes are intended
    					for design purposes, but the Silverlight Toolkit also provides a System
    					Colors theme. The System Colors theme aligns the Silverlight theme
    					brushes or colors with those of the settings applied to the Microsoft
    					Windows operating system display options. When the user switches the
    					system themes to use a theme that is typically used for high contrast,
    					the underlying system brushes are redefined. A Silverlight application
    					that uses the System Colors theme also uses the now-redefined colors
    					in its UI, and will effectively use the same High Contrast colors that
    					are user-selected for all other display. How to use the Silverlight
    					Toolkit system themes is not described in this technique. However,
    					the Silverlight Toolkit theme system is a viable option for providing
    					high contrast as well as other more aesthetics-oriented UI experiences.
    					For more information about the Silverlight Toolkit, see <loc href="http://silverlight.codeplex.com/">Toolkit
    						site</loc>. The themes feature of Silverlight Toolkit is best explained
    					by <loc href="http://blogs.msdn.com/b/delay/archive/2010/04/15/alive-and-kickin-new-silverlight-4-toolkit-released-with-today-s-silverlight-4-rtw.aspx">Silverlight
    						Toolkit release notes (from a Microsoft-related blog)</loc>. </p>
    			</section>
    			<section id="SL13_realtime">
    				<head> Real-time changes not supported </head>
    				<p><prop>SystemParameters.HighContrast</prop> is an adequate trigger
    					for cases where high contrast is already engaged before the Silverlight
    					plugin is loaded into a host. However, a limitation of using <prop>SystemParameters.HighContrast</prop> as
    					a trigger mechanism is that Silverlight does not detect the change
    					if it happens after the Silverlight plugin is loaded by the host HTML.
    					If Silverlight authors want to support real-time changes, they should provide a user-initiated
    					control option for changing to high contrast in Silverlight UI rather
    					than solely relying on <prop>SystemParameters.HighContrast</prop>. </p>
    			</section>
    			<section id="SL13_css">
    				<head> Silverlight and CSS </head>
    				<p>Silverlight content does not use information that comes from a CSS
    					style as applied to the hosting HTML page. Therefore, techniques as
    					implemented by browser user agents and described by <loc href="G148" linktype="techniques">G148:
    						Not specifying background color, not specifying text color, and not
    						using technology features that change those defaults</loc> or <loc href="G156" linktype="techniques">G156:
    							Using a technology that has commonly-available user agents that can
    							change the foreground and background of blocks of text</loc> do not work
    					for Silverlight content, and <loc href="C29" linktype="techniques">C29</loc> does
    					not directly apply. For example, the Internet Explorer settings under
    					Options / Appearance do not affect the fonts or contrast in the Silverlight
    					content area. </p>
    			</section>
    		</description>
    		<examples>
    			<eg-group>
    				<head>Silverlight application designed with brush resources
    					and template resources that enable a high contrast switch</head>
    				<description>
    					<p>The example "application" for illustration is just text,
    						a button and border. The concepts shown in the example can scale to
    						any complexity of UI, including to applications that have thousands
    						of lines of XAML. Note that the visual appearance of the button is
    						already using a high contrast theme choice for its default state, to
    						assure that the control is visible to anyone that requires a high contrast
    						theme to see parts of the user interface per <loc href="G174" linktype="techniques">G174</loc>.
    						To keep the example simple, the visual states (behaviors) associated
    						with mouse-over, click, etc. have not been restyled for high contrast.
    						Only the base appearance is changed. The example also shows a technique
    						of storing original theme information and restoring it in response
    						to user request. </p>
    					<codeblock><![CDATA[<UserControl x:Class="HighContrast.MainPage"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
   xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
   mc:Ignorable="d"
   d:DesignHeight="300" d:DesignWidth="400">
   <UserControl.Resources>
       <SolidColorBrush x:Key="ArtsyBrush1" Color="Salmon"/>
       <SolidColorBrush x:Key="ArtsyBrush2" Color="Bisque"/>
       <SolidColorBrush x:Key="ArtsyBrush3" Color="DarkSalmon"/>
       <SolidColorBrush x:Key="ArtsyBrush4" Color="Blue"/>
       <Color x:Key="ArtsyBrush1Restore">Salmon</Color>
       <Color x:Key="ArtsyBrush2Restore">Bisque</Color>
       <Color x:Key="ArtsyBrush3Restore">DarkSalmon</Color>
       <Color x:Key="ArtsyBrush4Restore">Blue</Color>
       <RadialGradientBrush x:Key="ArtsyGradient">
           <GradientStop Color="AliceBlue" Offset="0"/>
           <GradientStop Color="LightBlue" Offset="0.4"/>
           <GradientStop Color="#D00000EE" Offset="1"/>
       </RadialGradientBrush>
       <Style x:Key="ArtsyButton" TargetType="Button">
           <Setter Property="Template">
               <Setter.Value>
                   <ControlTemplate TargetType="Button">
                       <Border CornerRadius="4"
                          BorderBrush="{StaticResource ArtsyBrush4}" BorderThickness="4">
                           <Grid>
                               <Rectangle Fill="{StaticResource ArtsyGradient}"
                                 RadiusX="2" RadiusY="2"/>
                               <ContentPresenter Content="{TemplateBinding Content}"
                               ContentTemplate="{TemplateBinding ContentTemplate}"/>
                           </Grid>
                           
                       </Border>
                   </ControlTemplate>
               </Setter.Value>
           </Setter>
       </Style>
       <Style x:Key="HighConButton" TargetType="Button">
           <Setter Property="Control.Background" Value="White"/>
           <Setter Property="BorderBrush" Value="Black"/>
           <Setter Property="Foreground" Value="Black"/>
       </Style>
   </UserControl.Resources>
   <Border BorderBrush="{StaticResource ArtsyBrush1}" BorderThickness="4">
       <StackPanel x:Name="LayoutRoot" Background="{StaticResource ArtsyBrush2}">
           <TextBlock
             Foreground="{StaticResource ArtsyBrush3}">High contrast demo</TextBlock>
           <Button Name="Switcher" Click="Switcher_Click"
             Width="160" Style="{StaticResource HighConButton}">
              <TextBlock Text="Switch to high contrast"/>
           </Button>
           <Button Name="Switchback" Click="Switchback_Click"
             Width="160" Style="{StaticResource HighConButton}" IsEnabled="False">
               <TextBlock Text="Switch to regular theme"/>
           </Button>
       </StackPanel>
   </Border>
</UserControl>
]]></codeblock>
    					<p>The second listing is the C# code for the event handlers. </p>
					<codeblock><![CDATA[       private void Switcher_Click(object sender, RoutedEventArgs e)
       {
           ChangeToHighCon();
       }
       private void ChangeToHighCon()
       {
           (this.Resources["ArtsyBrush1"] as SolidColorBrush).Color = Colors.Black;
           (this.Resources["ArtsyBrush2"] as SolidColorBrush).Color = Colors.White;
           (this.Resources["ArtsyBrush3"] as SolidColorBrush).Color = Colors.Black;
           (this.Resources["ArtsyBrush4"] as SolidColorBrush).Color = Colors.Black;
           Switcher.IsEnabled = false;
           Switchback.IsEnabled = true;
       }
       private void RestoreRegularCon()
       {
           (this.Resources["ArtsyBrush1"] as SolidColorBrush).Color =
             (Color)this.Resources["ArtsyBrush1Restore"];
           (this.Resources["ArtsyBrush2"] as SolidColorBrush).Color =
             (Color)this.Resources["ArtsyBrush2Restore"];
           (this.Resources["ArtsyBrush3"] as SolidColorBrush).Color =
           (Color)this.Resources["ArtsyBrush3Restore"];
           (this.Resources["ArtsyBrush4"] as SolidColorBrush).Color =
             (Color)this.Resources["ArtsyBrush4Restore"];
           Switcher.IsEnabled = true;
           Switchback.IsEnabled = false;
       }
       private void Switchback_Click(object sender, RoutedEventArgs e)
       {
           RestoreRegularCon();
       }
   }
]]></codeblock>
    					<p>The following images show the original, and the applied high contrast
    						settings. </p>
    					<p><image><img source="working-examples/SL13/highconbefore.png" height="148" width="309"/><alt>Low contrast image with "switch to high contrast" button enabled</alt></image> </p>
    					<p><image><img source="working-examples/SL13/highconafter.png" height="148" width="309"/><alt>High contrast image with "switch to regular theme" button enabled</alt></image> </p>
    					<p>This example is shown in operation in the <loc href="HighContrastTestPage.html" linktype="examples">working example of High Contrast</loc>.</p>
    				</description>
    			</eg-group>
    			<eg-group>
    				<head>Use SystemParameters.HighContrast to detect system high
    				contrast settings at application startup</head>
    				<description>
    					<p>This example uses the same UI and style definitions as the previous
    						example. The sole addition a case statement that is added to the primary
    						page constructor of the UI (defined in C#). The added code is everything
    						other than the InitializeComponent() call (which is part of Silverlight
    						infrastructure). Note that the added code calls a user-defined function
    						ChangeToHighCon(), which is the same function and behavior as shown
    						in Example 1 for the user-initiated high contrast switch. </p>
    					<codeblock><![CDATA[       public MainPage()
       {
           InitializeComponent();
           if (SystemParameters.HighContrast)
           {
               ChangeToHighCon();
           }
       }
]]></codeblock>
    				</description>
    			</eg-group>
    		</examples>
    		<resources>
    			<see-also>
    				<ulist>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc707824%28VS.95%29.aspx">Silverlight
    						Accessibility Overview</loc> </p>
    					</item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc645030%28VS.95%29.aspx">Getting
    					Started with Controls</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/system.windows.systemparameters.highcontrast%28VS.95%29.aspx">SystemParameters.HighContrast</loc> </p></item>
    				</ulist>
    			</see-also>
    		</resources>
    		<related-techniques>
    			<relatedtech idref="G174"/>
    		</related-techniques>
    		<tests>
    			<head>UI option for style switching</head>
    			<procedure>
    				<p>To test a Silverlight UI option for style switching (Example 1): </p>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. </p></item><item><p> Check for a control that indicates it will change the application's
    						appearance to use a high-contrast theme. </p></item><item><p> Activate the control. Check that the Silverlight application's
    							user interface color themes change to an appearance that uses at
    							least a 4.5:1 contrast ratio per <loc href="visual-audio-contrast-contrast" linktype="understanding">Success
    								Criterion 1.4.3 (Contrast (Minimum))</loc>. </p></item></olist>
    			</procedure>
    			<expected-results>
    				<p>#3 is true. </p>
    			</expected-results>
    		</tests>
    		<tests>
    			<head>HighContrast API</head>
    			<procedure>
    				<p>To test the HighContrast API (Example 2): </p>
    				<olist><item><p> Use operating system settings (such as Ctrl+LeftShift+PrtScn shortcut
    					on Windows 7) to enter high contrast mode prior to opening the test
    					page. </p></item><item><p> Using a browser that supports Silverlight, open an HTML page that
    						references a Silverlight application through an object tag. </p></item><item><p> Check that the Silverlight application's user interface color
    							themes change to an appearance that uses at least a 4.5:1 contrast
    							ratio per <loc href="visual-audio-contrast-contrast" linktype="understanding">Success
    								Criterion 1.4.3 (Contrast (Minimum))</loc>. </p></item></olist>
    			</procedure>
    			<expected-results>
    				<p>#3 is true. </p>
    			</expected-results>
    		</tests>
    		<tests>
    			<head>UI option for enhanced contrast</head>
    			<procedure>
    				<p>To test a Silverlight UI option for style switching for enhanced contrast: </p>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. </p></item><item><p> Check for a control that indicates it will change the application's
    						appearance to use an enhanced contrast theme. </p></item><item><p> Activate the control. Check that the Silverlight application's
    							user interface color themes change to an appearance that uses at
    							least a 7:1 contrast ratio per <loc href="visual-audio-contrast7" linktype="understanding">Success
    								Criterion 1.4.6 Contrast (Enhanced)</loc>. </p></item></olist>
    			</procedure>
    			<expected-results>
    				<p>#3 is true. </p>
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href="http://trace.wisc.edu/wcag_wiki/index.php?title=Providing_A_Style_Switcher_To_Switch_To_High_Contrast"/></source>
    		</admin>
    	</technique>
    	<technique id="SL14">
    		<short-name>Providing Custom Control Key Handling for Keyboard Functionality
    			in Silverlight</short-name>
    		<applicability>
    			<p use-id="silverlight.applicability.general"/>
    		</applicability>
    		<applies-to>
    			<success-criterion idref="keyboard-operation-keyboard-operable"/>
    			<success-criterion idref="keyboard-operation-all-funcs"/>
    		</applies-to>
    		<ua-issues>
    			<ua-issue use-id="silverlight.ua-issue.general"/>
    		</ua-issues>
    		<description>
    			<p>The objective of this technique is to implement built-in handling
    				of key events in a custom control. If a custom control is correctly
    				implemented, then any Silverlight applications that include the control
    				can rely on the built-in key handling for some or all of the desired
    				keyboard equivalence of a control's functionality. </p>
    			<p>Defining a custom control requires that the control author write a
    				default template for the control and also the initialization logic,
    				including the default implementations for built-in keyboard equivalence.
    				Typically, control authors provide keyboard equivalence for any actions
    				that can be activated by a mouse click on the control surface, and
    				that are not already providing a keyboard equivalence through the implementation
    				of a composite part. </p>
    			<p>All input events report a specific source that is communicated to
    				handler code as an event parameter, so that the application author
    				can identify which element in their Silverlight UI was being interacted
    				with, and the application can perform an action that is relevant to
    				that user input. In the case of mouse events, the event source is the
    				element that the mouse pointer is over at the time. In the case of
    				key events, the event source is the element that has focus. The element
    				that has focus is visually indicated so that the user knows which element
    				they are interacting with (see <specref ref="SL2"/>). Assistive technologies
    				often have parallel conventions whereby the user is made aware of which
    				element is visually focused and is the current input scope presented
    				by the assistive technology. </p>
    			<section id="SL14_hosts">
    				<head> Browser hosts and keyboard events </head>
    				<p>Silverlight is hosted as a plug-in inside a browser host. The Silverlight
    					runtime only receives the input events that the browser host forwards
    					to hosted plug-ins through a browser-specific program access layer.
    					Occasionally the browser host receives input that the browser host
    					itself handles in some way, and does not forward the keyboard event.
    					An example is that a Silverlight application hosted by an Internet
    					Explorer browser host on Windows operating system cannot detect a press
    					of the ALT key, because Internet Explorer processes this input and
    					performs the action of bringing keyboard focus to the Internet Explorer
    					menu bar. Silverlight authors might need to be aware of browser-specific
    					input handling models and not rely on key events for keys that are
    					essentially reserved for use by a browser host. For more information,
    					see <loc href="http://msdn.microsoft.com/en-us/library/cc189015%28VS.95%29.aspx">Keyboard
    						Support</loc>. </p>
    				<p>Application authors should choose keys that avoid browser conflicts,
    					but still are a natural choice for an accelerator. Using the CTRL key
    					as a modifier is a convention that is frequently used in existing Silverlight
    					applications. </p>
    			</section>
    			<section id="SL14_which-keys">
    				<head> Informing users of which keys to use for keyboard equivalence </head>
    				<p>If a control supports user interaction, which key to use to engage
    					the keyboard equivalent behavior is not always obvious. One way to
    					inform users of the possible key options that a control supports is
    					to author an <prop>AutomationProperties.HelpText</prop> value in
    					the application UI that gives instructions such as "Press the
    					plus key to increment value". This is up to the application author
    					to do; the control definitions do not provide a means to set HelpText
    					by default, because any display technique for end user help is potentially
    					too application-specific to be encapsulated in control definitions.
    					Application authors might also consider using tooltips, providing a
    					menu framework that visually indicates the key associations (perhaps
    					with the Windows key-underlined convention), providing a generalized
    					application Help, or displaying plain text in the user interface. </p>
    			</section>
    			<section id="SL14_on-methods">
    				<head> The On* method pattern in Silverlight </head>
    				<p>Silverlight classes often have methods that follow the naming pattern <function>On*</function> where
    					the star is a string that also identifies an event. These <function>On*</function> methods
    					are prewired event handlers, defined as virtual methods so that subclasses
    					can override them. A consumer of a control class can change or augment
    					the default behavior associated with that event by overriding the method,
    					and typically also calls the base implementation so that the base functionality
    					is preserved. This principle is illustrated in Example 1 by the overrides
    					of <function>OnGotFocus</function> and <function>OnLostFocus</function>. Controls that introduce new events should
    					consider also exposing a virtual <function>On*</function> method that pairs with the event,
    					so that consumers of the custom control can use the same pattern. </p>
    			</section>
    		</description>
    		<examples>
    			<eg-group>
    				<head>KeyNumericUpDown Control That Handles Arrow Key Equivalence
    					for + and - Buttons</head>
    				<description>
    					<p>This example implements a custom Silverlight control that displays
    						an integer value, and can increment or decrement the integer value
    						based on user actions. When a user interacts with the control, the
    						user can click the "+" and "-" buttons that are
    						component parts of the control. The "+" and "-" button
    						parts are deliberately not in the Silverlight tab sequence, because
    						this is intended to be a complete control, where only the control itself
    						(and not its constituent parts) are focusable and are reported as an
    						element to the accessibility framework. To provide keyboard equivalence,
    						the control defines a <event>KeyUp</event> handler. The design of
    						the control treats an Up Arrow key press as equivalent to activating
    						the "+" button, and the Down Arrow key as equivalent to activating
    						the "-" button. The control implementation reinforces this
    						behavior by having the button <event>Click</event> event handlers
    						and the cases of the <event>KeyUp</event> handler call the same underlying
    						helper functions (Increment() and Decrement()). </p>
    					<p>Handling the + and - keys as alternate or additional keyboard equivalents
    						for the actions is also possible (if that is desired, handler would
    						check for <prop>Key.Add</prop> or <prop>Key.Subtract</prop> values). </p>
    					<p>The following is the XAML-defined control template for this control.</p>
    					<codeblock><![CDATA[   <Style TargetType="local:KeysNumericUpDown">
       <Setter Property="BorderThickness" Value="1"/>
       <Setter Property="Height" Value="22"/>
       <Setter Property="BorderBrush">
           <Setter.Value>
               <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                   <GradientStop Color="#FFA3AEB9" Offset="0"/>
                   <GradientStop Color="#FF8399A9" Offset="0.375"/>
                   <GradientStop Color="#FF718597" Offset="0.375"/>
                   <GradientStop Color="#FF617584" Offset="1"/>
               </LinearGradientBrush>
           </Setter.Value>
       </Setter>
       <Setter Property="Template">
           <Setter.Value>
               <ControlTemplate TargetType="local:KeysNumericUpDown">
                   <Grid x:Name="CompositionRoot">
                       <Grid.ColumnDefinitions>
                           <ColumnDefinition/>
                           <ColumnDefinition/>
                       </Grid.ColumnDefinitions>
                       <TextBox x:Name="Text" IsTabStop="False" AcceptsReturn="False"
 BorderThickness="0" Foreground="{TemplateBinding Foreground}" FontWeight="{TemplateBinding FontWeight}"
 FontStyle="{TemplateBinding FontStyle}" FontStretch="{TemplateBinding FontStretch}"
 FontSize="{TemplateBinding FontSize}" FontFamily="{TemplateBinding FontFamily}" MinWidth="20"
 TextAlignment="Right" VerticalAlignment="Center"  TextWrapping="NoWrap" Text="{TemplateBinding Value}">
                               <TextBox.Style>
                                   <Style TargetType="TextBox">
                                       <Setter Property="Template">
                                           <Setter.Value>
                                               <ControlTemplate TargetType="TextBox">
                                                   <ScrollViewer x:Name="ContentElement" BorderThickness="0" Padding="0"/>
                                               </ControlTemplate>
                                           </Setter.Value>
                                       </Setter>
                                   </Style>
                               </TextBox.Style>
                           </TextBox>
                       <StackPanel Orientation="Vertical" Grid.Column="1">
                       <Button Width="18" Height="18" IsTabStop="False" x:Name="plusButton">+</Button>
                       <Button Width="18" Height="18" IsTabStop="False" x:Name="minusButton">-</Button>
                       </StackPanel>
                       <Border x:Name="FocusVisualElement" BorderBrush="#FF45D6FA" BorderThickness="{TemplateBinding BorderThickness}" 
                       CornerRadius="1,1,1,1" IsHitTestVisible="False" Opacity="0"/>
                   </Grid>
               </ControlTemplate>
           </Setter.Value>
       </Setter>
   </Style>
   ]]></codeblock>
    					<p>The following is the implementation of the control class. Overrides
    						of the base class are omitted for clarity, as is automation support.
    						Note the event wiring in <function>OnApplyTemplate</function>; this is
    						a common pattern for custom control definitions. </p>
    					<codeblock><![CDATA[   public class KeysNumericUpDown : UpDownBase<double>
   {
       Grid root;
       Button plusButton;
       Button minusButton;
       Border focusRect;
       public KeysNumericUpDown()
       {
           this.DefaultStyleKey = typeof(KeysNumericUpDown);
       }
       public override void OnApplyTemplate()
       {
           base.OnApplyTemplate();
           root = this.GetTemplateChild("CompositionRoot") as Grid;
           root.KeyUp += new KeyEventHandler(Handle_Accelerators);
           plusButton = this.GetTemplateChild("plusButton") as Button;
           minusButton = this.GetTemplateChild("minusButton") as Button;
           plusButton.Click += new RoutedEventHandler(plusButton_Click);
           minusButton.Click += new RoutedEventHandler(minusButton_Click);
           focusRect = this.GetTemplateChild("FocusVisualElement") as Border;
       }
       void plusButton_Click(object sender, EventArgs e)
       {
           Increment();
       }
       void minusButton_Click(object sender, EventArgs e)
       {
           Decrement();
       }
       private void Increment()
       {
           this.Value += 1;
       }
       private void Decrement()
       {
           this.Value -= 1;
       }
       private void Handle_Accelerators(object sender, KeyEventArgs e)
       {
           switch (e.Key)
           {
               case (Key.Up):
                   this.Value -= 1;
                   e.Handled = true;
                   break;
               case (Key.Down):
                   this.Value += 1;
                   e.Handled = true;
                   break;
               default: break;
           }
       }
       protected override void OnGotFocus(RoutedEventArgs e)
       {
           base.OnGotFocus(e);
           if (focusRect != null)
           {
               focusRect.Opacity = 1;
           }
       }
       protected override void OnLostFocus(RoutedEventArgs e)
       {
           base.OnLostFocus(e);
           focusRect.Opacity = 0;
       }
   }
   ]]></codeblock>
    					<p>When this control is included in application UI, the usage is very
    						simple. Note that there are no key handlers on this instance; the
    						necessary key handling to wire up the increment/decrement logic is
    						already built-in to all instances of the control. </p>
    					<codeblock><![CDATA[<local:KeysNumericUpDown Width="100" Height="45"/>
]]></codeblock>
    					<p>This example is shown in operation in the <loc href="SimpleNumericUpDownTestPage.html" linktype="examples">working example of Numeric Up / Down control</loc>.</p>
    				</description>
    			</eg-group>
    		</examples>
    		<resources>
    			<see-also>
    				<ulist>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc189015%28VS.95%29.aspx">Keyboard
    					Support</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc903954%28VS.95%29.aspx">Focus
    					Overview</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc278064%28VS.95%29.aspx">Creating
    					a New Control by Creating a ControlTemplate</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc189018%28VS.95%29.aspx">Events
    						Overview for Silverlight</loc> </p></item>
    				</ulist>
    			</see-also>
    		</resources>
    		<related-techniques>
    			<relatedtech idref="G90"/>
    			<relatedtech idref="SL9"/>
    			<relatedtech idref="SL19"/>
    		</related-techniques>
    		<tests>
    			<procedure>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. </p></item><item><p> Press TAB key to move keyboard focus to various element parts
    						of the user interface, and in particular to areas that are known
    						to be custom control implementations. </p></item><item><p> Check that custom key commands exist for all these user interface
    							actions and that these key commands are made known to the user. </p></item></olist>
    			</procedure>
    			<expected-results>
    				<p>#3 is true. </p>
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href="http://trace.wisc.edu/wcag_wiki/index.php?title=Providing_Custom_Control_Key_Handling_for_Keyboard_Functionality_in_Silverlight"/></source>
    		</admin>
    	</technique>
    	<technique id="SL15">
    		<short-name>Providing Keyboard Shortcuts that Work Across the Entire Silverlight
    			Application</short-name>
    		<applicability>
    			<p use-id="silverlight.applicability.general"/>
    		</applicability>
    		<applies-to>
    			<success-criterion idref="keyboard-operation-keyboard-operable"/>
    			<success-criterion idref="keyboard-operation-all-funcs"/>
    		</applies-to>
    		<ua-issues>
    			<ua-issue use-id="silverlight.ua-issue.general"/>
    		</ua-issues>
    		<description>
    			<p>The objective of this technique is to introduce key handling that
    				exists at the application root level of a Silverlight application,
    				rather than per-element key handling. Event handling at the application
    				level as opposed to at the element level is one way to address key
    				equivalence. The key events provide key equivalence for particular
    				user interface elements that a user might otherwise interact with using
    				a mouse. This technique is related to events in the Silverlight programming
    				model, as opposed to in the HTML DOM. </p>
    			<p>Handling key events at the root level of an application rather than
    				only on the element that was the "source" of a key event
    				is possible because of a Silverlight programming model feature known
    				as event routing. For more information on event routing and how it
    				works, see <loc href="http://msdn.microsoft.com/en-us/library/cc189018%28VS.95%29.aspx">Events
    					Overview for Silverlight</loc>. </p>
    			<p>This technique demonstrates a "menu" approach to key handling
    				and user interaction. This technique is presented as a companion to <specref ref="SL9"/>, which
    				can be thought of as an "accelerator key/hotkey" approach.
    				The   "menu" approach towards keyboard equivalence is perhaps
    				just as common as the "hotkey" approach. It is often simpler
    				to document a menu's key equivalence in a user interface than it is
    				to document key equivalents of particular regions of an application,
    				or to communicate to users that where the current focus is placed is
    				relevant to how keyboard keys are interpreted by the application, even
    				if the key action is relevant to only one of the controls in an interface.
    				If all keys are handled at the top level, the specific focused element
    				is no longer relevant. </p>
    			<p>In order to originate a key event that Silverlight application code
    				can detect, some element in the Silverlight application must have keyboard
    				focus. One way to assure keyboard focus is to focus the Silverlight
    				plug-in as a whole, as called from within an event handler for <event>Application.Startup</event>.
    				This is shown in the examples. </p>
    			<p>If an application does handle keys at top level, care should be taken
    				to not interfere with specific text entry control behavior, such as
    				typing into a <obj>TextBox</obj>. To avoid interactions, the
    				design of key equivalence at the top level of an application typically
    				relies on combinations with key modifiers. The Control/CTRL key is
    				a key that is often used for this purpose. Application authors should
    				also be aware of the implications of browser hosts that might handle
    				the key event at HTML DOM level without making that event available
    				to the Silverlight programming surface. For more information on this
    				concept, see "Keyboard Events and Browser Hosts" section
    				of <loc href="http://msdn.microsoft.com/en-us/library/cc189015%28VS.95%29.aspx">Keyboard
    					Support Overview for Silverlight on MSDN</loc>. </p>
    			<p>Application authors are responsible for correctly documenting the
    				accelerator keys that are pertinent for their application. There are
    				a variety of techniques for documenting user interface actions that
    				are not described here. One possible suggestion is to include a generalized "Help" button
    				that appears early in the application's reading order, which is focusable
    				and has an <prop>AutomationProperties.Name</prop> value available as the text content
    				or equivalent. Such a button can be activated without knowing any of
    				the application's accelerator keys, and the activation result could
    				be a new text element that enumerates the possible keys. For example,
    				the application could display a Silverlight <obj>Popup</obj> with
    				the following content: </p>
    			<p><image><img source="working-examples/SL15/popup_keys.png" height="101" width="288"/><alt>A screen shot of a sample Popup control that documents specific accelerator keys</alt></image> </p>
    		</description>
    		<examples>
    			<eg-group>
    				<head>Key handling by application root UserControl</head>
    				<description>
    					<p>This example has only one interactive control for simplicity, but
    						with two possible key combinations for that control being handled as
    						actions. The purpose and explanation of the control is reported through
    						a <obj>TextBlock</obj> that is associated with the labeled control
    						through use of <loc href="http://msdn.microsoft.com/en-us/library/system.windows.automation.automationproperties.labeledby%28VS.95%29.aspx">AutomationProperties.LabeledBy</loc> in
    						XAML. The control being illustrated is <obj>MultiScaleImage</obj>,
    						which supports a zoom-in metaphor for examining an image that redraws
    						at increasingly fine resolutions. For more information on <obj>MultiScaleImage</obj>,
    						see <loc href="http://msdn.microsoft.com/en-us/library/cc645050%28VS.95%29.aspx">Deep
    							Zoom on MSDN</loc>. </p>
    					<p>The following is the startup logic at application level that sends
    					focus to Silverlight in the HTML DOM. </p>
    					<codeblock><![CDATA[       private void Application_Startup(object sender, StartupEventArgs e)
       {
           this.RootVisual = new MainPage();
           //bring overall DOM focus to Silverlight area, so that keys are captured by Silverlight
           System.Windows.Browser.HtmlPage.Plugin.Focus();
       }
       ]]></codeblock>
    					<p>The following is XAML UI for the main page. </p>
    					<codeblock><![CDATA[ <UserControl xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
    x:Class="ApplicationLevelKeyHandling.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400" KeyUp="UserControl_KeyUp">

    <StackPanel x:Name="LayoutRoot" Background="White">
        <Button Name="bInstructions" Click="bInstructions_Click">Get Help</Button>
        <Popup Name="p">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition/>
                    <RowDefinition/>
                    <RowDefinition/>
                    <RowDefinition/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <TextBlock FontWeight="Bold">Key</TextBlock>
                <TextBlock FontWeight="Bold" Grid.Column="1">Action</TextBlock>
                <TextBlock Grid.Row="1">Ctrl + Alt + Plus</TextBlock>
                <TextBlock Grid.Row="1" Grid.Column="1">Zooms in on the image</TextBlock>
                <TextBlock Grid.Row="2">Ctrl + Alt + Minus</TextBlock>
                <TextBlock Grid.Row="2" Grid.Column="1">Zooms out of the image</TextBlock>
                <Button Grid.Row="3" Click="button1_Click">Close this Help</Button>
            </Grid>
        </Popup>
        <MultiScaleImage x:Name="deepZoomObject"
         Source="source/dzc_output.xml" 
         MouseLeftButtonDown="DeepZoomObject_MouseLeftButtonDown"
         MouseRightButtonDown="DeepZoomObject_MouseRightButtonDown"
         AutomationProperties.LabeledBy="{Binding ElementName=lblInstructions}"/>
    </StackPanel>
 </UserControl>]]></codeblock>
    					<p>The following is the C# logic. Note how the key handlers and mouse
    					handlers reference the same logic function. </p>
    					<codeblock><![CDATA[        private void UserControl_KeyUp(object sender, KeyEventArgs e)
        {
            if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control &&
                (Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt &&
                e.Key == Key.Add)
            {
                DZIn();
            }
            if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control &&
                (Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt &&
                e.Key == Key.Subtract)
            {
                DZOut();
            }
        }
        private void DeepZoomObject_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            DZIn();
        }
        private void DeepZoomObject_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
        {
            e.Handled = true;
            DZOut();
        }
        private void DZIn()
        {
            this.deepZoomObject.ZoomAboutLogicalPoint(3, .5, .5);
        }
        private void DZOut()
        {
            this.deepZoomObject.ZoomAboutLogicalPoint(.333, .5, .5);
        }
        private void bInstructions_Click(object sender, RoutedEventArgs e)
        {

            // Set where the popup will show up on the screen.
            p.VerticalOffset = 25;
            p.HorizontalOffset = 25;
            // Open the popup.
            p.IsOpen = true;
        }
        void button1_Click(object sender, RoutedEventArgs e)
        {
            // Close the popup.
            p.IsOpen = false;

        }]]></codeblock>
    					<p>This example is shown in operation in the <loc href="ApplicationLevelKeyHandlingTestPage.html" linktype="examples">working example of Application Level Key Handling</loc>.</p>
    				</description>
    			</eg-group>
    		</examples>
    		<resources>
    			<see-also>
    				<ulist>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc189015%28VS.95%29.aspx">Keyboard
    					Support</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc645050%28VS.95%29.aspx">Deep
    					Zoom</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc707824%28VS.95%29.aspx">Silverlight
    						Accessibility Overview</loc> </p></item>
    				</ulist>
    			</see-also>
    		</resources>
    		<related-techniques>
    			<relatedtech idref="SL9"/>
    		</related-techniques>
    		<tests>
    			<procedure>
    				<olist>
    					<item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. </p></item>
    					<item><p> Verify that keyboard focus is somewhere within the Silverlight
    						content area, and not elsewhere in the hosting HTML or hosting browser
    						user interface. If necessary, use TAB key to traverse the overall
    						HTML tab sequence until an interface element within Silverlight displays
    						a visual focus indicator. </p></item>
    					<item><p> Verify that the keys to be used as keyboard equivalent action
    							triggers for the application as a whole are documented for users.
    							For example, text or long text alternative documents key / key combinations
    							and short descriptions of actions. </p></item>
    					<item><p> Verify that pressing the application-specific keys results in
    					the action as expected in the application. </p></item>
    					<item><p> Move keyboard focus throughout other areas of the Silverlight
    					application, and verify that the same keys continue to function application-wide. </p></item>
    				</olist>
    			</procedure>
    			<expected-results>
    				<p>#3, #4 and #5 are true. </p>
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href="http://trace.wisc.edu/wcag_wiki/index.php?title=Providing_Keyboard_Shortcuts_that_Work_Across_the_Entire_Silverlight_Application"/></source>
    		</admin>
    	</technique>
    	<technique id="SL16">
    		<short-name>Providing Script-Embedded Text Captions for MediaElement Content</short-name>
    		<applicability>
    			<p use-id="silverlight.applicability.general"/>
    		</applicability>
    		<applies-to>
    			<success-criterion idref="media-equiv-captions"/>
    		</applies-to>
    		<ua-issues>
    			<ua-issue use-id="silverlight.ua-issue.general"/>
    		</ua-issues>
    		<description>
    			<p>The objective of this technique is to use text captioning that is
    				embedded in the stream with media displayed in a Silverlight <obj>MediaElement</obj>,
    				and present that text captioning in a separate Silverlight control
    				or text element. </p>
    			<p>This particular technique uses scripting files with a <obj>TimelineMarkers</obj> collection
    				that are embedded directly within the media file. When text captioning
    				is embedded directly in the streams, synchonization of the scripting
    				stream versus the video content stream is done automatically by the <obj>MediaElement</obj> component.
    				Each time the <event>MarkerReached</event> event fires, that is an
    				indication that a synch point in the video that corresponds to a script
    				marker entry has been reached. Silverlight application authors can
    				obtain the text from the relevant timeline marker entry through their
    				event handler implementations, and can display captions in the user
    				interface area where the text captions are displayed. Typical Silverlight
    				controls that can be used for displaying text captions include <obj>TextBlock</obj> (nonfocusable), <obj>TextBox</obj>,
    				or <obj>RichTextBox</obj>. A typical interface design would place
    				the caption-display control in close proximity to the <obj>MediaElement</obj> control
    				that is being captioned, for example might place the captions directly
    				underneath the <obj>MediaElement</obj> "screen". </p>
    			<p>Script-embedded captions are captions that are stored directly in
    				the media file as metadata, rather than as a separate file. For information
    				about techniques for captions in separate files, see <specref ref="SL28"/>. </p>
    			<section id="SL16_tools">
    				<head> Tools </head>
    				<p>Producing the media file with <obj>TimelineMarkers</obj> captions
    					directly in embedded scripting can be accomplished using the Microsoft
    					Expression Encoder tool. Online help for the procedure of encoding
    					scripting with text captions in the stream are available in the offline
    					Help file that installs with the Microsoft Expression 4 Encoder products.
    					For more information, see <loc href="http://www.microsoft.com/expression/products/EncoderPro_Overview.aspx">Expression
    						Encoder Pro Overview</loc>.</p>
    				<p>There is a <loc href="http://msdn.microsoft.com/en-us/library/dd743937%28VS.85%29.aspx">public
    					API</loc> for introducing Markers into a WMV file, as part of the Windows
    					Media Format SDK. Using Expression Encoder is the way that the task
    					of directly embedding <obj>TimelineMarkers</obj> is presented
    					and taught in Microsoft's available instructional material on Silverlight.
    					However, because the mechanism is public, it is possible that other
    					tools exist or will exist that can also produce media with script-encoded <obj>TimelineMarkers</obj>. </p>    			</section>
    		</description>
    		<examples>
    			<eg-group>
    				<head>MediaElement handles MarkerReached, displays marker text
    					in existing TextBox</head>
    				<description>
    					<p>This example has a UI definition in XAML and interaction logic in
    						C#. The following is the basic UI in XAML. This example is deliberately
    						simple and does not include <obj>AutomationProperties</obj> for
    						identification or user instructions. The most relevant part of this
    						example is that the Silverlight author declares a handler for the event <event>MarkerReached</event>.
    						This event fires potentially hundreds of times, once for each caption
    						in the stream. Each time the event fires, the event handler runs and
    						adds the text to the dedicated <obj>TextBox</obj> in the user
    						interface. </p>
    					<codeblock><![CDATA[<UserControl x:Class="MediaTimelineMarkers.MainPage"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
   <StackPanel x:Name="LayoutRoot" Background="White">
       <MediaElement MarkerReached="OnMarkerReached"
       HorizontalAlignment="Left"
       Source="/spacetime.wmv"
       Width="300" Height="200" />
       <ScrollViewer>
           <TextBox Name="captionText" Height="40"
           IsReadOnly="true" AcceptsReturn="true"/>
       </ScrollViewer>
   </StackPanel>
 </UserControl>

private void OnMarkerReached(object sender, TimelineMarkerRoutedEventArgs e)
{
   captionText.Focus();
   captionText.SelectedText = e.Marker.Text.ToString() + "\n";
}
]]></codeblock>
    					<p>This example is shown in operation in the <loc href="MediaTimelineMarkersTestPage.html" linktype="examples">working example of Media Timeline Markers</loc>.</p>
    				</description>
    			</eg-group>
    		</examples>
    		<resources>
    			<see-also>
    				<ulist>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc189078%28VS.95%29.aspx">Audio
    					and Video Overview</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.mediaelement%28VS.95%29.aspx">MediaElement
    					Class</loc> </p></item>
    					<item><p><loc href="http://amp.codeplex.com/">Accessible
    						Media Project</loc> - a reference implementation MediaPlayer control
    						from the Silverlight product team that includes several accessibility
    						features including captioning; note that the codebase might not be
    						updated to Silverlight version 4 </p></item>
    				</ulist>
    			</see-also>
    		</resources>
    		<related-techniques>
    			<relatedtech idref="SL17"/>
    			<relatedtech idref="SL28"/>
    		</related-techniques>
    		<tests>
    			<procedure>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. The application
    					plays media that is expected to have text captioning. </p></item><item><p> Check that a text area in the user interface shows captions for
    						the media. </p></item></olist>
    			</procedure>
    			<expected-results>
    				<p># 2 is true. </p>
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href="http://trace.wisc.edu/wcag_wiki/index.php?title=Providing_Script-Embedded_Text_Captions_for_MediaElement_Content"/></source>
    		</admin>
    	</technique>
    	<technique id="SL17">
    		<short-name>Providing Static Alternative Content for Silverlight Media Playing
    			in a MediaElement</short-name>
    		<applicability>
    			<p use-id="silverlight.applicability.general"/>
    		</applicability>
    		<applies-to>
    			<success-criterion idref="media-equiv-av-only-alt"/>
    			<success-criterion idref="media-equiv-audio-desc"/>
    			<success-criterion idref="media-equiv-text-doc"/>
    		</applies-to>
    		<ua-issues>
    			<ua-issue use-id="silverlight.ua-issue.general"/>
    		</ua-issues>
    		<description>
    			<p>The objective of this technique is to replace a Silverlight <obj>MediaElement</obj> with
    				static alternative non-media content that is not time-based. The static
    				alternative content replaces the media in the same or a nearby user
    				interface region of the Silverlight application. </p>
    			<ulist><item><p> If the media being played is audio-only, and the alternative content
    				is a text equivalent such as a transcript, this technique addresses <loc href="media-equiv-av-only-alt" linktype="understanding">Success
    					Criterion 1.2.1 (Audio-only and Video-only, Prerecorded)</loc>. </p></item><item><p> If the media includes content that cannot be adequately described
    						by either alternative audio track or additional text captions, and
    						the best alternative is to provide a full description in text such
    						as a screenplay of the content, this technique addresses <loc href="media-equiv-audio-desc" linktype="understanding">Success
    							Criterion 1.2.3 (Audio Description or Full Text Alternative)</loc> and
    						is similar to <loc href="G69" linktype="techniques">G69:
    							Providing an alternative for time based media</loc>. </p></item></ulist>
    			<p>A Silverlight application user interface can be adjusted at run time
    				by removing elements from the visual tree, and adding new elements
    				to the visual tree. In this case, the user interface is designed to
    				provide a control that the user activates to display the static alternative
    				content, which is often a control that displays text, or a text element. </p>
    		</description>
    		<examples>
    			<eg-group>
    				<head>MediaElement playing audio, replace with transcript</head>
    				<description>
    					<p>This example has a UI definition in XAML and interaction logic in C#. In this case the <obj>MediaElement</obj> 
              has no visual representation itself and is 0x0 size because it plays audio only. As a simple placeholder, this 
              example displays the text "Library of Congress Audio" to represent the media element as something visible in the 
              UI. In addition to Play/Stop controls, this interface includes a Display Transcript button. Activating the 
              button displays static text that represents the transcript of the audio. The following is the basic UI in XAML.</p>
    					<codeblock><![CDATA[<UserControl x:Class="ReplaceAudioWithTranscriptText.MainPage"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   xmlns:sys="clr-namespace:System;assembly=mscorlib">
   <UserControl.Resources>
       <sys:String x:Key="transSpeakerName">Matt Raymond: </sys:String>
       <sys:String x:Key="transText">This is Matt Raymond at the Library of Congress.
Each year thousands of book lovers of all ages visit the nation's capital to celebrate the joys 
of reading and lifelong literacy, at the Library of Congress National Book Festival. 
For the first time in the festival's nine year history, President Barack Obama and 
First Lady Michelle Obama will serve as honorary chairs of this free event. </sys:String>
   </UserControl.Resources>
   <StackPanel x:Name="LayoutRoot" Background="White" >
       <TextBlock FontSize="30" Foreground="Blue">Library of Congress Audio</TextBlock>
       <MediaElement Source="/locintro.wma" AutoPlay="False" Name="player" Height="0" />
       <StackPanel Orientation="Horizontal" Name="ControlBar">
           <Button Name="Play" Click="Play_Click">Play</Button>
           <Button Name="Stop" Click="Stop_Click">Stop</Button>
           <Button Name="TextAlt" Click="TextAlt_Click">Display Transcript</Button>
       </StackPanel>
   </StackPanel>
</UserControl>
]]></codeblock>
    					<p>The following is the C# logic. </p>
    					<codeblock><![CDATA[   public partial class MainPage : UserControl
   {
       RichTextBox rtb;
       bool transDisplayed=false;
       public MainPage()
       {
           InitializeComponent();
           rtb = new RichTextBox();
           rtb.IsReadOnly = true;
           Paragraph p = new Paragraph();
           Run speakerName = new Run();
           speakerName.Text = this.Resources["transSpeakerName"] as String;
           speakerName.FontWeight = FontWeights.Bold;
           Run transText = new Run();
           transText.Text = this.Resources["transText"] as String;
           p.Inlines.Add(speakerName);
           p.Inlines.Add(transText);
           rtb.Blocks.Add(p);
       }
       private void Play_Click(object sender, RoutedEventArgs e)
       {
           player.Play();
           Play.IsEnabled = false;
       }
       private void Stop_Click(object sender, RoutedEventArgs e)
       {
           player.Stop();
           Play.IsEnabled = true;
       }
       private void TextAlt_Click(object sender, RoutedEventArgs e)
       {
           Panel parent = (player.Parent as Panel);
           if (!transDisplayed)
           {
               DisplayTranscript();
               (sender as Button).Content = "Hide Transcript";
               transDisplayed = true;
           }
           else
           {
               parent.Children.Remove(rtb);
               (sender as Button).Content = "Display Transcript";
               transDisplayed = false;
           }
       }
       private void DisplayTranscript()
       {
           Panel parent = (player.Parent as Panel);
           parent.Children.Add(rtb);
       }
]]></codeblock>
    					<p>This example is shown in operation in the <loc href="ReplaceAudioWithTranscriptTextTestPage.html" linktype="examples">working example of Replace Audio With Transcript</loc>.</p>
    				</description>
    			</eg-group>
    		</examples>
    		<resources>
    			<see-also>
    				<ulist>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc189078%28VS.95%29.aspx">Audio
    						and Video Overview</loc> </p></item>
    				</ulist>
    				
    			</see-also>
    		</resources>
    		<tests>
    			<procedure>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. That
    					application has audio-only media content and is expected to supply
    					a text alternative, or has media that is expected to be replaced
    					entirely with a transcript or similar text alternative. </p></item><item><p> Check for a control that indicates that activating it will supply
    						static alternative content for the media. Activate the control. </p></item><item><p> Verify that the media control is replaced with alternate content,
    							and that assistive technologies represent the change to the user
    							interface. </p></item></olist>
    			</procedure>
    			<expected-results>
    				<p>#3 is true. </p>
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href="http://trace.wisc.edu/wcag_wiki/index.php?title=Providing_Static_Alternative_Content_for_Silverlight_Media_Playing_in_a_MediaElement#User_Agent_and_Assistive_Technology_Support_Notes"/></source>
    		</admin>
    	</technique>
    	<technique id="SL18">
    		<short-name>Providing Text Equivalent for Nontext Silverlight Controls With AutomationProperties.Name</short-name>
    		<applicability>
    			<p use-id="silverlight.applicability.general"/>
    		</applicability>
    		<applies-to>
    			<success-criterion idref="text-equiv-all"/>
    			<success-criterion idref="navigation-mechanisms-refs"/>
    			<success-criterion idref="navigation-mechanisms-link"/>
    			<success-criterion idref="ensure-compat-rsv"/>
    		</applies-to>
    		<ua-issues>
    			<ua-issue use-id="silverlight.ua-issue.general"/>
    		</ua-issues>
    		<description>
    			<p>The objective of this technique is to use the Silverlight <prop>AutomationProperties.Name</prop> property
    				to provide a short text alternative for controls that do not otherwise
    				contain text. The text is intended to provide human-readable identifiers
    				and short-descriptions or user instructions for accessibility frameworks,
    				which can then be reported to assistive technologies. </p>
    			<p>"Control" in this technique refers to any element that is
    				based on the Silverlight <obj>Control</obj> class, and is keyboard-focusable
    				either by user action or calling focus to the control programmatically.
    				The non-text control in question might be something like a button that
    				communicates information using only an icon or image. For example,
    				a triangle image rotated 90 degrees clockwise is commonly used in many
    				user interfaces to indicate a "Play"   button control. This "Play" icon
    				mimics interface metaphors from many non-software consumer products,
    				and is often presented in a user interface without any nearby visible
    				text information that explains the purpose of the control. Another
    				example is a "thumbnail" metaphor where a small image serves
    				as a control that can be activated, and where the action results in
    				the display of a larger version of the same image, or enters an editing
    				mode that loads the same image. </p>
    			<p>For cases of controls such as buttons that invoke actions, the text
    				alternative also identifies link purpose. </p>
    			<p>In Silverlight, a text-only identifier for any control can be set
    				specifically as <prop>AutomationProperties.Name</prop> on the parent
    				control. Silverlight control compositing techniques enable either per-control
    				images that are specified by the application author, or a general-purpose
    				image/icon for a control that is part of the control's template and
    				displays that way by default. The Silverlight API <prop>AutomationProperties.Name</prop> directly
    				sets <prop>Name</prop> in the UI Automation tree. The properties
    				in the UI Automation tree are reported to assistive technologies, when
    				the assistive technology implements behavior that acts as a UI Automation
    				client (or as an MSAA client, which relies on the UIA-MSAA bridge). </p>
    		</description>
    		<examples>
    			<eg-group>
    				<head>Applying a text alternative for an icon Button with
    					XAML</head>
    				<description>
    					<p>Application authors can specify the <prop>AutomationProperties.Name</prop> attribute
    						on the <obj>Button</obj> element, and leave accessibility information
    						for the composited <obj>Image</obj> content unspecified. It is
    						the button and its action that is relevant to users, not the non-interactive <obj>Image</obj> component.
    						The value provided for <prop>AutomationProperties.Name</prop> is
    						a meaningful text alternative for the action conveyed by the button's
    						icon/image, but where the functionality is conceptually embodied in
    						the button and not its images or other constituent parts in compositing
    						or visual design. </p>
    					<codeblock><![CDATA[ <Button
   Height="20" Width="50"
   AutomationProperties.Name="Pause Media">
   <Image Height="12" Width="12" Source="/icon_pause.png"/>
 </Button>
]]></codeblock>
    					<p>This example is shown in operation in the <loc href="ButtonNontextTextCompositionTestPage.html" linktype="examples">working example of Button Text Alternative</loc>.</p>
    				</description>
    			</eg-group>
    		</examples>
    		<resources>
    			<see-also>
    				<ulist>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/ff400332%28VS.95%29.aspx">Automation
    					Properties for Accessibility Support in UI</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/system.windows.automation.automationproperties.name%28VS.95%29.aspx">AutomationProperties.Name
    					Attached Property</loc> </p></item>
    					<item><p>Tools: <loc href="http://firstfloorsoftware.com/silverlightspy/">SilverlightSpy</loc> or <loc href="http://uiautomationverify.codeplex.com/">UIAVerify</loc> </p></item>
    				</ulist>
    			</see-also>
    		</resources>
    		<related-techniques>
    			<relatedtech idref="SL30"/>
    		</related-techniques>
    		<tests>
    			<head>Accessibility framework view </head>
    			<procedure>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. </p></item><item><p> Use a verification tool that is capable of showing the full accessibility
    						framework tree, and an object’s "Name" text alternative
    						as part of the tree. Verify that all interactive elements such as
    						buttons without visible text provide a human-readable text identifier "Name" in
    						the automation tree. </p></item></olist>
    			</procedure>
    			<expected-results>
    				<p>#2 is true. </p>
    			</expected-results>
    		</tests>
    		<tests>
    			<head>Screen Reader</head>
    			<procedure>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. </p></item><item><p> Engage the screen reader. Press TAB to traverse the tab sequence
    						inside the Silverlight content area to focus to a composite control
    						that has no visible text, but has an <prop>AutomationProperties.Name</prop> applied. </p></item><item><p> Check that the "Name" as applied to the control instance,
    							along with the class name of the named control, is read by the screen
    							reader. </p></item></olist>
    			</procedure>
    			<expected-results>
    				<p>#3 is true. </p>
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href="http://trace.wisc.edu/wcag_wiki/index.php?title=Providing_Text_Equivalent_for_Nontext_Silverlight_Controls_With_AutomationProperties.Name"/></source>
    		</admin>
    	</technique>
    	<technique id="SL19">
    		<short-name>Providing User Instructions With AutomationProperties.HelpText in
    			Silverlight</short-name>
    		<applicability>
    			<p use-id="silverlight.applicability.general"/>
    		</applicability>
    		<applies-to>
    			<success-criterion idref="text-equiv-all" relationship="advisory"/>
    			<success-criterion idref="minimize-error-cues" relationship="advisory"/>
    		</applies-to>
    		<ua-issues>
    			<ua-issue use-id="silverlight.ua-issue.general"/>
    			<ua-issue><p>Not all assistive technologies choose to read or present information
    				from the UI Automation tree for Silverlight in cases where the corresponding
    				UI object is not focusable in the tab sequence. This technique provides
    				the support for introducing the information into the UI Automation
    				tree for that element, but cannot guarantee that a given assistive
    				technology provides the user with access to the element information
    				from that UIA tree. </p></ua-issue>
    			<ua-issue><p>The <prop>HelpText</prop> property is readable in the UIA framework
    				by any client that programs against the basic UIA property model, and
    				that property is forwarded/bridged to MSAA through the <function>get_accHelp</function> method.
    				However, as of 13 January 2011, no known assistive technology provides
    				users with a technique or interface option that accesses the <prop>HelpText</prop> / <function>get_accHelp</function> information. </p></ua-issue>
    		</ua-issues>
    		<description>
    			<p>The objective of this technique is to provide a long text alternative
    				that serves the same purpose and presents the same information as the
    				original non-text content when a short text alternative is not sufficient,
    				and to show the practice of storing that information in a dedicated
    				property of the Silverlight-supported UI Automation support system.
    				The technique can also be used on text controls (such as <obj>TextBox</obj>),
    				for cases where the control text itself does not provide enough context
    				to suggest an appropriate user action. </p>
    			<p>The relevant UI Automation property is named <prop>HelpText</prop>,
    				to connote its possible usage to provide imperative instructions for
    				interactive elements. However, the same property can instead be used
    				for long text alternatives for nontext objects. The Silverlight API <prop>AutomationProperties.HelpText</prop> directly
    				sets <prop>HelpText</prop> in the UI Automation tree. The properties
    				in the UI Automation tree are reported to assistive technologies, when
    				the assistive technology implements behavior that acts as a UI Automation
    				client. </p>
    			<p><prop>AutomationProperties.HelpText</prop> can be set in code,
    				but is most typically set as an attribute in XAML that defines a Silverlight
    				UI. </p>
    			<p>The same information as is present in <prop>AutomationProperties.HelpText</prop> could
    				also be useful to sighted users. In this case, the same text could
    				be displayed in a Silverlight <loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.tooltip%28VS.95%29.aspx">ToolTip</loc> control.
    				The reason that application authors should use both <prop>AutomationProperties.HelpText</prop> AND <obj>Tooltip</obj> in
    				conjunction is because the <obj>Tooltip</obj> information is
    				not introduced into the runtime accessibility framework information
    				set. This is because a tooltip is transient and not conventionally
    				focusable. In Silverlight programming, a useful technique for sharing
    				the same resource is to combine the Silverlight data binding feature
    				with the .NET Framework embedded resource feature. For more information
    				on combining Silverlight data binding and resources for common string
    				sources, see <loc href="http://msdn.microsoft.com/en-us/library/dd882554%28VS.95%29.aspx">How
    					to Make XAML Content Localizable</loc>. </p>
    		</description>
    		<examples>
    			<eg-group>
    				<head>Applying a long text alternative for an Image with XAML</head>
    				<description>
    					<p>To introduce the necessary information to Silverlight XAML for an
    						application UI definition, specify the <prop>AutomationProperties.HelpText</prop> attribute
    						on the <obj>Image</obj> element. The value provided for the attribute
    						is a meaningful long text alternative for the image content. The value
    						of <prop>AutomationProperties.HelpText</prop> should augment rather
    						than duplicate <prop>AutomationProperties.Name</prop>, which is
    						also typically specified to provide accessibility support for an image. </p>
    					<codeblock><![CDATA[ <Image
   Height="400" Width="600"
   Source="/office.png"
   AutomationProperties.Name="Diagram of standard office layout"
   AutomationProperties.HelpText=”The standard office layout
includes one corner desk unit in the corner farthest from the
door, and one file cabinet against the same wall as the door.”/>
]]></codeblock>
    				</description>
    			</eg-group>
    			<eg-group>
    				<head>Using HelpText as form instructions</head>
    				<description>
    					<p>This example provides instructions for two form fields by using both <obj>Tooltip</obj> and <prop>AutomationProperties.HelpText</prop>.
    						The strings used for these purposes are shared to both methodologies
    						by defining the strings as resources and binding to them. In this example,
    						the form submission does not perform client-side validation (although
    						server-side validation following a data round trip might still exist). </p>
    					<p>The following is the XAML UI: </p>
    					<codeblock><![CDATA[<UserControl xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" 
   x:Class="HelpTextAndToolTip.MainPage"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
       <Grid x:Name="LayoutRoot" Background="White" Margin="10">
           <Grid.RowDefinitions>
               <RowDefinition Height="Auto"/>
               <RowDefinition Height="Auto"/>
               <RowDefinition Height="Auto"/>
               <RowDefinition Height="Auto"/>
               <RowDefinition Height="Auto"/>
           </Grid.RowDefinitions>
           <Grid.ColumnDefinitions>
               <ColumnDefinition Width="Auto"/>
               <ColumnDefinition Width="200"/>
               <ColumnDefinition Width="Auto"/>
           </Grid.ColumnDefinitions>
           <TextBlock Text="Form With Tooltips" FontSize="16" FontWeight="Bold"
     Grid.Column="1" HorizontalAlignment="Center" />
           <sdk:Label x:Name="NameLabel" Target="{Binding ElementName=NameTextBox}"
     Grid.Row="2" Margin="3"/>
           <TextBox x:Name="NameTextBox" 
     AutomationProperties.Name="{Binding Content, ElementName=NameLabel}"
     Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=Explicit}"
     Grid.Column="1" Grid.Row="2" Margin="3"
     AutomationProperties.HelpText="{Binding
       NameTextBoxToolTipString,Source={StaticResource TooltipStrings}}">
           <ToolTipService.ToolTip>
               <ToolTip Content="{Binding NameTextBoxToolTipString,Source={StaticResource TooltipStrings}}" />
           </ToolTipService.ToolTip>
           </TextBox>
           <sdk:Label x:Name="AgeLabel" Target="{Binding ElementName=AgeTextBox}"
     Grid.Row="3" Margin="3" HorizontalAlignment="Right"/>
           <TextBox x:Name="AgeTextBox" 
     AutomationProperties.Name="{Binding Content, ElementName=AgeLabel}" 
     Text="{Binding Age, Mode=TwoWay, UpdateSourceTrigger=Explicit}"  
     Grid.Column="1" Grid.Row="3" Margin="3"
    AutomationProperties.HelpText="{Binding AgeTextBoxToolTipString,Source={StaticResource TooltipStrings}}">
           <ToolTipService.ToolTip>
               <ToolTip Content="{Binding AgeTextBoxToolTipString,Source={StaticResource TooltipStrings}}" />
           </ToolTipService.ToolTip>
       </TextBox>
           <Button x:Name="SubmitButton" Content="Submit" Click="SubmitButton_Click"
             Grid.Column="1" Grid.Row="4" Width="50" Margin="3" />
       </Grid>
</UserControl>
]]></codeblock>
    					<p>The following is the resource definition in app.xaml: </p>
    					<codeblock><![CDATA[       <ResourceDictionary>
           <resources:Resource1 x:Key="TooltipStrings"/>
       </ResourceDictionary>
       ]]></codeblock>
    					<p>The generated resource code that defines the "Resource1" class
    						is not shown here because it is mostly infrastructure that is produced
    						by a generation task in Visual Studio. For more information about
    						embedded resources in Silverlight, see <loc href="http://msdn.microsoft.com/en-us/library/cc903945%28VS.95%29.aspx">Resources
    							Overview on MSDN</loc>. The resources here contain just two strings,
    						each of which would typically be defined in a Visual Studio .resx
    						file. Resources in a .resx file can be localized or changed separately
    						from code by the appropriate localization toolsets for Microsoft
    						localization/development. </p>
    					<ulist><item><p> NameTextBoxToolTipString: Must be 10 characters or less. Required. </p></item><item><p> AgeTextBoxToolTipString Must be a value between 0 and 120. Required. </p></item></ulist>
    					<p>These examples are shown in operation in the <loc href="AutomationPropertiesHelpTextTestPage.html" linktype="examples">working example of Automation Properties Help Text</loc> and <loc href="working-examples/SL8/HelpTextAndToolTipTestPage.html">working example of HelpText and ToolTip</loc>.</p>
    				</description>
    			</eg-group>
    		</examples>
    		<resources>
    			<see-also>
    				<ulist>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/ff400332%28VS.95%29.aspx">Automation
    					Properties for Accessibility Support in UI</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/system.windows.automation.automationproperties.helptext%28VS.95%29.aspx">AutomationProperties.HelpText
    					Attached Property</loc> </p></item>
    					<item><p>Tools: <loc href="http://firstfloorsoftware.com/silverlightspy/">SilverlightSpy</loc> or <loc href="http://uiautomationverify.codeplex.com/">UIAVerify</loc> </p></item>
    				</ulist>
    				
    			</see-also>
    		</resources>
    		<related-techniques>
    			<relatedtech idref="SL8"/>
    		</related-techniques>
    		<tests>
    			<procedure>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. To see
    					UI Automation, use Microsoft Windows as platform. </p></item><item><p> Use a verification tool that is capable of showing the full automation
    						tree, and an object’s long text alternative as part of the tree.
    						(For example, use UIAVerify or Silverlight Spy; see Resources links.) </p></item><item><p> Focus an element that is known to have a long text alternative.
    							Check that the <prop>AutomationProperties.HelpText</prop> as applied to
    							individual UI elements appears as the <prop>HelpText</prop> or <prop>acc_Help</prop> value
    							in the automation tree. </p></item></olist>
    			</procedure>
    			<expected-results>
    				<p>#3 is true. </p>
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href="http://trace.wisc.edu/wcag_wiki/index.php?title=Providing_User_Instructions_With_AutomationProperties.HelpText_in_Silverlight"/></source>
    		</admin>
    	</technique>
    	<technique id="SL20">
    		<short-name>Relying on Silverlight AutomationPeer Behavior to Set AutomationProperties.Name</short-name>
    		<applicability>
    			<p use-id="silverlight.applicability.general"/>
    		</applicability>
    		<applies-to>
    			<success-criterion idref="content-structure-separation-programmatic"/>
    			<success-criterion idref="ensure-compat-rsv"/>
    		</applies-to>
    		<ua-issues>
    			<ua-issue use-id="silverlight.ua-issue.general"/>
    		</ua-issues>
    		<description>
    			<p>The objective of this technique is to illustrate how in certain cases,
    				the Silverlight automation peer system can provide an accessibility
    				framework <prop>Name</prop> based on any simple text strings that
    				are also presented in the visible user interface as control content. </p>
    			<p>The applicability of this technique to SC 1.3.1 is that once promoted,
    				the <prop>Name</prop> becomes the primary information item that
    				describes the user interface element to accessibiity frameworks and
    				assistive technologies, and the information is thus immune to any further
    				applications of the Silverlight style system that might change the
    				appearance of the visual text equivalent (styled with color, uses italic
    				font for rendering basis, etc.) </p>
    			<p>The applicability of this technique to SC 4.1.2 is that the default
    				peer promotion behavior provides the Name component of Name, Role,
    				Value. This is related to the description of the term <emph>label</emph> in
    				SC4.1.2. </p>
    			<p>A default behavior for generating <prop>Name</prop> for accessibility
    				frameworks is possible for certain peers of content controls. The content
    				controls that might support a default automation peer behavior include: </p>
    			<ulist><item><p> <obj>TextBlock</obj> </p></item><item><p> <obj>ButtonBase</obj> derived classes that do not change
    				the <function>GetNameCore</function> implementation. This includes the <obj>Button</obj> class.
    				In order for the default promotion to work, the <prop>Content</prop> of
    				the button must be set as a plain string or must contain only a <obj>TextBlock</obj>;
    				any compositing such as wrapping in a <obj>Border</obj> or
    				other container will disable the default promotion. </p></item><item><p> Any other <obj>ContentControl</obj> derived class where
    					the <prop>Content</prop> property contains either <obj>TextBlock</obj> or
    					a text-content-only <obj>ButtonBase</obj> implementation as
    					sole content. </p></item></ulist>
    			<p>In these cases the string that sets either <prop>Content</prop> (for <obj>ContentControl</obj> and <obj>ButtonBase</obj>)
    				or <prop>Text</prop> (for <obj>TextBlock</obj>) is promoted
    				as the <prop>AutomationProperties.Name</prop> for the control in
    				UI Automation, without any further attribution. The properties in the
    				UI Automation tree are reported to accessibility frameworks (UI Automation,
    				and MSAA through the bridge). The accessibility frameworks reports
    				this information to assistive technology clients. </p>
    			<p>Relying on default automation peer behavior is the preferred Silverlight
    				technique for supplying the accessibility framework "Name"   information,
    				so long as the default peer promotion actually does produce a usable
    				name. Using default behavior is preferred because re-using the strings
    				that are already used in the general visual presentation is less likely
    				to result in accessibility-specific strings being forgotten by the
    				application author, or get decoupled from visible UI in a revision
    				process. </p>
    			<p>For cases where there is control compositing in a control rather than
    				simple text, the automation peer typically cannot provide a default
    				simple string, and it may be the application author's responsibility
    				to set <prop>AutomationProperties.Name</prop> explicitly as an
    				attribute in XAML, or as a property in runtime code. For details, see <specref ref="SL30"/>. </p>
    			<section id="SL20_test-based">
    				<head> Test-based methodology </head>
    				<p>In order to use this technique effectively, application authors are
    					expected to be following a test-based methodology towards verifying
    					what information their application is reporting to any pertinent accessibility
    					framework. Useful tools for this purpose include SilverlightSpy and
    					UIAVerify. Application authors might examine their running Silverlight
    					application on a test machine where the accessibility framework test
    					viewers are also active. Initially, the application author might view
    					the application at a point in the application development cycle that
    					is prior to any effort devoted to specifically adding accessibility-related
    					information to the application. Silverlight applications might be in
    					this state because the initial user interface design was done in a
    					visually oriented design tool such as Microsoft Expression Blend. Using
    					the test-based methodology, application authors might note that certain
    					accessibility framework properties are already populated, as a result
    					of the mechanisms that are described in this technique. However, it
    					is rare that ALL of the necessary accessibility information for an
    					application can be obtained entirely from the built-in default behaviors
    					of the automation peers. At this point, the application author may
    					have to apply additional Silverlight techniques that provide accessibility
    					framework information, for example <specref ref="SL30"/>. </p>
    			</section>
    		</description>
    		<examples>
    			<eg-group>
    				<head>Button is composed with direct text content only</head>
    				<description>
    					<p>The following example shows XAML UI only. Logic is not shown, but
    						would typically be added by referencing a <event>Click</event> handler
    						from the XAML. </p>
    					<codeblock><![CDATA[ <Button Height="20" Width="200">Fire photon torpedoes!</Button>
]]></codeblock>
    					<p>The following illustration shows the UIAVerify tree view of this
    						simple interface. Note that the internal string "Fire photon
    						torpedoes!"   is being peer-forwarded. This is verified by the
    						Properties view on the right side: the Name property value is "Fire
    						Photon Torpedoes", even though no programmatic Name property
    						or <prop>AutomationProperties.Name</prop> has been applied to
    						that button that would otherwise have supplied an acccessibility
    						framework "Name". </p>
    					<p><image><img source="working-examples/SL20/uiatree_simplepeerforwarding.png" height="373" width="747"/><alt>UIAVerify tree view</alt></image> </p>
    					<p>This example is shown in operation in the <loc href="SimplePeerForwardingTestPage.html" linktype="examples">working example of Simple Peer Forwarding</loc>.</p>
    				</description>
    			</eg-group>
    		</examples>
    		<resources>
    			<see-also>
    				<ulist>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/ff400332%28VS.95%29.aspx">Automation
    						Properties for Accessibility Support in UI </loc> </p>
    					</item>
    					<item><p>Tools: <loc href="http://firstfloorsoftware.com/silverlightspy/">SilverlightSpy</loc> or <loc href="http://uiautomationverify.codeplex.com/">UIAVerify</loc> </p></item>
    				</ulist>
    			</see-also>
    		</resources>
    		<tests>
    			<procedure>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. To use
    					UI AUtomation, use Windows as the platform. </p></item><item><p> Use a verification tool that is capable of showing the full automation
    						tree, and an object’s name text alternative as part of the tree.
    						(For example, use UIAVerify or Silverlight Spy; see Resources links.) </p></item><item><p> Check that any element where default automation peer promotion
    							is expected is supplying a default Name in the automation tree. </p></item></olist>
    			</procedure>
    			<expected-results>
    				<p>#3 is true. </p>
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href="http://trace.wisc.edu/wcag_wiki/index.php?title=Relying_on_Silverlight_AutomationPeer_Behavior_to_Set_AutomationProperties.Name"/></source>
    		</admin>
    	</technique>
    	<technique id="SL21">
    		<short-name>Replacing A Silverlight Timed Animation With a Nonanimated Element</short-name>
    		<applicability>
    			<p use-id="silverlight.applicability.general"/>
    		</applicability>
    		<applies-to>
    			<success-criterion idref="time-limits-required-behaviors"/>
    		</applies-to>
    		<ua-issues>
    			<ua-issue use-id="silverlight.ua-issue.general"/>
    		</ua-issues>
    		<description>
    			<p>The objective of this technique is to replace a timed Silverlight
    				animation with a non-timed user interface element that presents equivalent
    				information. This is useful in cases where the Silverlight animation
    				is a timed animation that may contain information that the user wants
    				to see without a time limit, such as crawling text in a text area.
    				The animated version of information in the user interface element can
    				instead be swapped out for an equivalent static element. </p>
    			<p>The Silverlight animation system is generalized such that nearly any
    				Silverlight property of type <obj>Double</obj>, <obj>Point</obj> or <obj>Color</obj> can
    				be animated, or a property can cycle through discrete object values.
    				Thus the possibilities for which properties in the user interface can
    				be animated are quite broad. The general technique shown can be used
    				to stop any animation. </p>
    		</description>
    		<examples>
    			<eg-group>
    				<head>Stopping an animation that is scrolling text, replacing the animation with a full text alternative </head>
    				<description>
    					<p>This example has a UI definition in XAML and interaction logic in C#. The following is the basic UI in XAML. </p>
    					<codeblock><![CDATA[<UserControl x:Class="StopAnimation.MainPage"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
   <UserControl.Resources>
       <ImageBrush x:Key="Stars" ImageSource="/stars.jpg" Stretch="Fill"/>
       <Storyboard x:Key="crawl">
           <DoubleAnimation From="700" To="-100" Duration="0:0:20"
             Storyboard.TargetName="crawltext" Storyboard.TargetProperty="(Canvas.Top)"/> 
       </Storyboard>
       <sys:String x:Key="crawlText">
           Episode IV, A NEW HOPE It is a period of civil war. Rebel spaceships, striking from a hidden base, 
           have won their first victory against the evil Galactic Empire. During the battle, Rebel spies managed 
           to steal secret plans to the Empire’s ultimate weapon, the DEATH STAR, an armored space station with 
           enough power to destroy an entire planet. Pursued by the Empire’s sinister agents, Princess Leia 
           races home aboard her starship, custodian of the stolen plans that can save her people and restore 
           freedom to the galaxy….
       </sys:String>
   </UserControl.Resources>
   <StackPanel x:Name="LayoutRoot"
   Background="{StaticResource Stars}"
   Height="600" Width="800">
       <Button Width="200"
   Click="Button_Click">Stop crawling text, display fixed text</Button>
       <Canvas Name="CrawlPanel" Width="605" Height="595" >
           <Canvas.Projection>
               <PlaneProjection RotationX="-75"/>
           </Canvas.Projection>
           <Canvas.Clip>
               <RectangleGeometry Rect="0 0 600 600"/>
           </Canvas.Clip>
           <TextBlock Text="{StaticResource crawlText}"
   TextWrapping="Wrap" FontSize="20"
   Width="300" Canvas.Left="150" Name="crawltext"
   Foreground="Goldenrod"/>
       </Canvas>
   </StackPanel>
</UserControl>
]]></codeblock>
    					<p>The following is the C# logic. In this example, the animation starts
    						automatically. When the user activates the control (the <obj>Button</obj>),
    						the event handler stops the animation, removes the animated element
    						from the visual tree, and replaces it with a fixed text element that
    						presents all text at once. Because it is a <obj>TextBox</obj>,
    						assistive technologies could identify the newly introduced text element
    						and present it, for example read the text in a screen reader. </p>
    					<codeblock><![CDATA[       public MainPage()
       {
           InitializeComponent();
           (this.Resources["crawl"] as Storyboard).Begin();
       }
       private void Button_Click(object sender, RoutedEventArgs e)
       {
           (this.Resources["crawl"] as Storyboard).Stop();
           LayoutRoot.Children.Remove(CrawlPanel);
           TextBox tb = new TextBox();
           tb.IsReadOnly = true;
           tb.FontSize = 30;
           tb.TextWrapping = TextWrapping.Wrap;
           tb.Text = (string)this.Resources["crawlText"];
           LayoutRoot.Children.Add(tb);
       }
]]></codeblock>
    					<p>This example is shown in operation in the <loc href="StopAnimationTestPage.html" linktype="examples">working example of Stop Text Animation</loc>.</p>
    				</description>
    			</eg-group>
    		</examples>
    		<resources>
    			<see-also>
    				<ulist>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc189019%28VS.95%29.aspx">Animation
    					Overview</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc189069%28VS.95%29.aspx">Working
    						with Animations Programmatically</loc> </p></item>
    				</ulist>
    			</see-also>
    		</resources>
    		<tests>
    			<procedure>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. For a
    					Silverlight application that has a time limit on interaction due
    					to an animated user interface element: </p></item><item><p> Check for a mechanism to stop the time limit on interaction. </p></item><item><p> When the mechanism is activated, check that the element that is
    						animated and resulting in a time limit is removed, and the time-limited
    						element is replaced with static content that is equivalent and does
    						not have a time limit. </p></item></olist>    				
    			</procedure>
    			<expected-results>
    				<p>#3 is true. </p>
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href="http://trace.wisc.edu/wcag_wiki/index.php?title=Replacing_A_Silverlight_Timed_Animation_With_a_Nonanimated_Element"/></source>
    		</admin>
    	</technique>
    	<technique id="SL22">
    		<short-name>Supporting Browser Zoom in Silverlight</short-name>
    		<applicability>
    			<p use-id="silverlight.applicability.general"/>
    			<ulist>
    				<item><p> Silverlight content in a user agent host that supports browser
    					zoom </p></item>
    			</ulist>
    			
    		</applicability>
    		<applies-to>
    			<success-criterion idref="visual-audio-contrast-scale"/>
    		</applies-to>
    		<ua-issues>
    			<ua-issue use-id="silverlight.ua-issue.general"/>
    			<ua-issue><ulist><item><p> Not all user agents implement a browser zoom feature. Of those
    				that do as of 30 March 2011, best results are obtained when the
    				user agent is Internet Explorer or Firefox. </p></item><item><p> Note that on Firefox, the Ctrl+(+) accelerator for browser zoom
    					may not work due to an issue where if the plugin (Silverlight) has
    					focus, it traps all keyboard events, even those that would ordinarily
    					be the user agent's set of accelerators. </p></item><item><p> Some versions of Firefox have a browser zoom mode that zooms text
    						only. This functionality is based on text by an HTML definition,
    						so selecting this option does not zoom any Silverlight content (whether
    						it is text by any Silverlight definition, or not.) </p></item><item><p> Internet Explorer version 8 has an "AutoZoom" feature
    							that is based on operating system DPI. Silverlight accounts for this
    							through a native sizing behavior, but that behavior is not relevant
    							for this technique because the DPI settings are not typically used
    							as a primary technique by Web technology users for accessibility
    							purposes. DPI is more relevant to device choices, or specific operating
    							system features. </p></item></ulist></ua-issue>
    		</ua-issues>
    		<description>
    			<p>The objective of this technique is to support or anticipate existing
    				browser zoom features effectively when users interact with the Silverlight
    				application. This technique explains how the Silverlight content area
    				reacts to the browser zoom feature implemented by some user agent hosts.
    				Silverlight content and layout properties are based on physical screen
    				pixel measurements. When the browser zoom is engaged, Silverlight content
    				scales correctly for the zoom factor, and uses the same zoom factor
    				as any surrounding HTML content. </p>
    			<p>Browser zoom is relevant for accessibility and Silverlight because
    				it is likely to be the zoom /scaling feature enabled by the browser
    				host that Web technology users are the most familiar with as a technique
    				for increasing the text size in Web content. </p>
    			<section id="SL22_legacy">
    				<head> Legacy behavior in Silverlight version 2 </head>
    				<p>Built-in support for browser zoom was introduced as a feature in Silverlight
    					version 3. Older documents on the Web might describe techniques that
    					were relevant for Silverlight version 2, where dealing with browser
    					zoom required JavaScript handling of the <event>Resized</event> event,
    					and developers manually applied a <obj>ScaleTransform</obj> to Silverlight
    					content to scale it up. Silverlight has a "quirks mode"   that
    					detects existing handlers that might still use the older techniques.
    					Built-in zoom not active in these cases, so that applications can avoid
    					doubling or otherwise mishandling the user agent's zooming behavior. </p>
    			</section>
    			<section id="SL22_disable-zoom">
    				<head> Deliberately disabling browser zoom in Silverlight applications </head>
    				<p>Silverlight also provides the ability to disable the built-in browser
    					zoom handling and rendering behavior. This is sometimes done in order
    					to suppress some of the aliasing and distortion artifacts that host-level
    					scaling can introduce, particularly for video content or certain uses
    					of text. In these cases, application authors might consider other Silverlight
    					techniques for scaling the user interface, perhaps specifically only
    					for the text elements on a page. When an application disables the built-in
    					zoom behavior and rendering for Silverlight content, the browser still
    					retains its zoom settings, and that setting applies to other content
    					outside of Silverlight such as the hosting HTML. </p>
    			</section>
    		</description>
    		<examples>
    			<eg-group>
    				<head>Verifying browser zoom, and checking the zoom factor</head>
    				<description>
    					<p>This example has a UI defined in XAML and logic defined in C#. The
    						UI shows the zoom factor, and also demonstrates what happens when built-in
    						browser zoom handling is deliberately disabled. Note that the zooming
    						factor as reported by the API is still retained even when Silverlight
    						built-in zoom scaling is disabled deliberately. The following is the
    						XAML UI: </p>
    					<codeblock><![CDATA[<UserControl x:Class="BrowserZoom.MainPage"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
   <StackPanel x:Name="LayoutRoot" Background="White">
       <TextBlock>Some text you can zoom.</TextBlock>
       <Button Click="Button_Click">Toggle built-in zoom handling</Button>
       <StackPanel Orientation="Horizontal">
           <Button Click="Button_Click_1">Query current zoom factor</Button>
           <TextBox IsReadOnly="true" Name="zoomf"
   Text="{Binding Path=reportZoom}"/>
       </StackPanel>
   </StackPanel>
</UserControl>
]]></codeblock>
    					<p>The following is the C# logic: </p>
    					<codeblock><![CDATA[   public partial class MainPage : UserControl
   {
       public MainPage()
       {
           InitializeComponent();
       }
       private void Button_Click(object sender, RoutedEventArgs e)
       {
           if (!Application.Current.Host.Settings.EnableAutoZoom == false) {
           Application.Current.Host.Settings.EnableAutoZoom = false;
           }
           else
           {
               Application.Current.Host.Settings.EnableAutoZoom = true;
           }
       }
       private void Button_Click_1(object sender, RoutedEventArgs e)
       {
           zoomf.Text = Application.Current.Host.Content.ZoomFactor.ToString();
       }
   }
]]></codeblock>
    					<p>This example is shown in operation in the <loc href="BrowserZoomTestPage.html" linktype="examples">working example of Browser Zoom</loc>.</p>
    				</description>
    			</eg-group>
    		</examples>
    		<resources>
    			<see-also>
    				<ulist>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/system.windows.interop.settings.enableautozoom%28VS.95%29.aspx">EnableAutoZoom
    					Property</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc707824%28VS.95%29.aspx">Silverlight
    						Accessibility Overview</loc> </p></item>
    				</ulist>
    			</see-also>
    		</resources>
    		<related-techniques>
    			<relatedtech idref="G142"/>
    			<relatedtech idref="G179"/>
    		</related-techniques>
    		<tests>
    			<procedure>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. The browser
    					being used for the test must support a browser zoom feature, and
    					the feature must be turned on as a user preference. </p></item><item><p> Verify that the Silverlight application enables auto zoom (no
    						Silverlight application-specific code or markup has set EnableAutoZoom
    						API to false). </p></item><item><p> Test the zooming feature of the user agent. Verify that browser
    							zoom factors apply to the Silverlight content. </p></item></olist>
    			</procedure>
    			<expected-results>
    				<p>#2 and #3 are true. </p>
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href="http://trace.wisc.edu/wcag_wiki/index.php?title=Silverlight_and_Browser_Zoom"/></source>
    		</admin>
    	</technique>
    	<technique id="SL23">
    		<short-name>Using A Style Switcher to Increase Font Size of Silverlight Text
    			Elements</short-name>
    		<applicability>
    			<p use-id="silverlight.applicability.general"/>
    		</applicability>
    		<applies-to>
    			<success-criterion idref="visual-audio-contrast-scale"/>
    		</applies-to>
    		<ua-issues>
    			<ua-issue use-id="silverlight.ua-issue.general"/>
    		</ua-issues>
    		<description>
    			<p>The objective of this technique is to define style switching logic
    				for Silverlight. In particular, the intent is to use the style switcher
    				to change the font size of text elements. This technique could be used
    				only for specific elements, or could also be applied to the entire
    				Silverlight content area and all text elements therein (including elements
    				such as <obj>TextBlock</obj> that are technically not controls).
    				Examples are provided for these two cases. </p>
    			<p>The property to style or otherwise change is the <prop>FontSize</prop> property.
    				Primarily, this is done using the API <loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.control.fontsize%28VS.95%29.aspx">Control.FontSize</loc>,
    				but developers can also use similar properties on other objects that do not
    				derive from <obj>Control</obj> (examples: <loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.textblock.fontsize%28VS.95%29.aspx">TextBlock</loc>; <loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.datagridtextcolumn.fontsize%28VS.95%29.aspx">DataGridTextColumn</loc>). </p>
    			<p>Silverlight uses a style system whereby many properties that affect
    				UI appearance can be referred to and changed through a style resource.
    				The style resource overrides the default code implementation and the
    				default XAML template as provided by the Silverlight core implementation(or
    				a third party control author). A style enables an application author
    				to make a one-to-many change to property values in an efficient and
    				reversible way, and also to group multiple related property changes
    				as one unit of logic. Styles can be applied explicitly by referencing
    				them by name, or implicitly by associating a style with a class (which
    				then targets all instances of that class). This is analogous to how
    				CSS can either define styles globally for tags or uniquely for classids
    				and names. </p>
    			<p>Silverlight styles are always written in XAML. Silverlight event handlers
    				are most often written in code (there are related techniques that can
    				react to states with event associations, defined in pure XAML, but
    				the specific style switching technique is most straightforward in code). </p>
    			<section id="SL23_zoom-comparison">
    				<head> Using this technique versus relying on browser zoom </head>
    				<p>Silverlight supports browser zoom when viewed in browser hosts that
    					support a browser zoom feature. Specifically, Silverlight scales content
    					within its content area when the user engages browser zoom, based on
    					the browser zoom factor. However, not all browser hosts that Silverlight
    					supports have a browser zoom feature, and/or users might choose not
    					to use browser zoom. This technique presents an alternative technique
    					for font scaling in cases when relying on browser zoom is not viable
    					as a technique. Applications might use HTML DOM based logic to determine
    					the user agent string of the browser host, and use that as a determinant
    					of whether the user has browser zoom available as an option. If no
    					browser zoom feature exists for that user and their user agent, that
    					user could be served a version of the Silverlight application that
    					presents a UI and logic for sizing the fonts using the Silverlight
    					API, as described in this technique. </p>
    				<p>For more information about Silverlight and browser zoom, see the technique <specref ref="SL22"/>. </p>
    			</section>
    			<section id="SL23_percent">
    				<head> Sizing by percent </head>
    				<p>Generally, sizing Silverlight <prop>FontSize</prop> values by
    					percentages is not recommended. Sizing by percentage produces non-integer
    					font size values, which in turn produce aliasing artifacts. The Silverlight
    					rendering routines for text work best when dealing with integer numbers.
    					The entire Silverlight rendering system is based on pixel measurements.
    					In particular, the behavior for text rendering produces optimized font
    					shaping and subpixel rendering for text areas, and this behavior is
    					based on the assumption that font unit measurements will be provided
    					by applications using whole pixel values. </p>
    			</section>
    			<section id="SL23_units">
    				<head> Units for font sizing in Silverlight </head>
    				<p>Font sizing in Silverlight is always specified by a unit measure of
    					pixels. Other unit measures such as ems or points that come from a
    					migrated UI definition in XAML would need to be unit-converted to all
    					use a purely numeric value, such that attribute values in XAML do not
    					not include unit identifier suffixes such as "px", "pt", "em",
    					or "cm". This note is most relevant if the application author
    					is porting or migrating a Windows Presentation Framework (WPF) application
    					to Silverlight, or is using a XAML-emitting design tool that is producing
    					general XAML UI definitions and not targeting a specific framework. </p>
    			</section>
    		</description>
    		<examples>
    			<eg-group>
    				<head>Style applied to all text elements within a RichTextBox
    					container</head>
    				<description>
    					<p>Variations of this example could be employed to offer more choices.
    						For example, multiple style switchers could be provided that gave three
    						or more fontsize choices. </p>
    					<codeblock><![CDATA[<UserControl x:Class="StyleSwitcherFontSize.MainPage"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
   <UserControl.Resources>
       <Style x:Key="BiggerRTBFonts" TargetType="RichTextBox">
           <Setter Property="FontSize" Value="24"/>
       </Style>
   </UserControl.Resources>

   <StackPanel x:Name="LayoutRoot" Background="White">
       <Button Click="Button_Click">Super size fonts!</Button>
       <Button Name="Undo" Click="Undo_Click">Make those big fonts stop!</Button>
       <RichTextBox IsReadOnly="True" Name="rtb1">
           <RichTextBox.Blocks>
               <Paragraph>Various test text</Paragraph>
               <Paragraph>
                   <Bold>Some bold test text</Bold></Paragraph>
               <Paragraph>
                   <Italic>Some italic</Italic>
               </Paragraph>
               <Paragraph FontFamily="Times New Roman">A different font, why not?</Paragraph>
           </RichTextBox.Blocks>
       </RichTextBox>
   </StackPanel>
</UserControl>
]]></codeblock>
    					<p>The second listing is the C# code for the event handler . Note that
    						all it does is change a style property, using a value that keys into
    						the .Resources collection from XAML where the Style is defined. Another
    						event handler nulls out the style and returns values to defaults. </p>
    					<codeblock><![CDATA[private void Button_Click(object sender, RoutedEventArgs e)
{
  rtb1.Style = this.Resources["BiggerRTBFonts"] as Style;
}
private void Undo_Click(object sender, RoutedEventArgs e)
{
   rtb1.Style = null;
}
]]></codeblock>
    					<p>The following images show the original, and the applied style. </p>
    					<p><image><img source="working-examples/SL23/originalfontsize.png" height="119" width="240"/><alt>Screen shot with standard fonts and a button to enlarge</alt></image> </p>
    					<p><image><img source="working-examples/SL23/newfontsize.png" height="257" width="246"/><alt>Screen shot with enlarged fonts after activating button to enlarge</alt></image> </p>
    					<p>This example is shown in operation in the <loc href="StyleSwitcherFontSizeTestPage.html" linktype="examples">working example of Style Switcher Font Size</loc>.</p>
    				</description>
    			</eg-group>
    			<eg-group>
    				<head>Font size increase applied to all text content by applying
    				at UserControl level, and by percent increase logic</head>
    				<description>
    					<p>This example uses the inheritance characteristics of the <prop>FontSize</prop>
    						property that is available to all Silverlight controls. Rather than
    						using a style, this example uses a <prop>HoldEnd</prop> animation, to take advantage
    						of the "By" behavior of the animation system that can increment
    						an existing value by 2 (pixels) rather than replacing the value with
    						a fixed pixel value. </p>
    					<p>The following is the XAML UI: </p>
    					<codeblock><![CDATA[<UserControl x:Class="StyleSwitcherFontSize.MainPage"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   Name="rootcontrol">
   <UserControl.Resources>
       <Storyboard x:Key="BySize">
           <DoubleAnimation Storyboard.TargetName="rootcontrol" Storyboard.TargetProperty="FontSize" By="2" FillBehavior="HoldEnd" Duration="0"/>
       </Storyboard>
   </UserControl.Resources>
   <StackPanel x:Name="LayoutRoot" Background="White">
       <Button Click="Button_Click">Super size fonts!</Button>
       <Button Name="Undo" Click="Undo_Click">Make those big fonts stop!</Button>
       <TextBox Text="Various test text"/>
       <TextBox FontWeight="Bold" Text="Some bold test text"/>
       <TextBox FontStyle="Italic" Text="Some italic"/>
       <TextBox FontFamily="Times New Roman" Text="A different font, why not?"/>
   </StackPanel>
</UserControl>
]]></codeblock>
    					<p>The following are the C# event handlers. </p>
    					<codeblock><![CDATA[private void Button_Click(object sender, RoutedEventArgs e)
{
   (this.Resources["BySize"] as Storyboard).Begin();
}
private void Undo_Click(object sender, RoutedEventArgs e)
{
   (this.Resources["BySize"] as Storyboard).Stop();
}
]]></codeblock>
              <p>
                This example is shown in operation in the <loc href="ByAnimationFontSizeTestPage.html" linktype="examples">working example of By Animation Font Size</loc>.
              </p>
            </description>
    			</eg-group>
    		</examples>
    		<resources>
    			<see-also>
    				<ulist>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/system.windows.style%28VS.95%29.aspx">Style
    					Class</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc189010%28VS.95%29.aspx">Text
    					and Fonts</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc189019%28VS.95%29.aspx">Animation
    						Overview</loc> </p></item>
    				</ulist>
    			</see-also>
    		</resources>
    		<related-techniques>
    			<relatedtech idref="C29"/>
    		</related-techniques>
    		<tests>
    			<procedure>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. </p></item><item><p> Verify that the application provides a control that can increase
    						font size. </p></item><item><p> Activate the control, and check that the font sizes increase. </p></item></olist>
    			</procedure>
    			<expected-results>
    				<p>#2 and #3 are true. </p>
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href="http://trace.wisc.edu/wcag_wiki/index.php?title=Using_A_Style_Switcher_to_Increase_Font_Size_of_Silverlight_Text_Elements"/></source>
    		</admin>
    	</technique>
    	<technique id="SL24">
    		<short-name>Using AutoPlay to Keep Silverlight Media from Playing Automatically</short-name>
    		<applicability>
    			<p use-id="silverlight.applicability.general"/>
    		</applicability>
    		<applies-to>
    			<success-criterion idref="visual-audio-contrast-dis-audio"/>
    			<success-criterion idref="time-limits-pause"/>
    		</applies-to>
    		<ua-issues>
    			<ua-issue use-id="silverlight.ua-issue.general"/>
    		</ua-issues>
    		<description>
    			<p>The objective of this technique is to use the <prop>AutoPlay</prop> property
    				of <obj>MediaElement</obj> object, which prevents the <obj>MediaElement</obj> from
    				playing its media source automatically. </p>
    			<p>By default the value of <prop>AutoPlay</prop> is true, which causes
    				any media that is the <prop>Source</prop> of the <obj>MediaElement</obj> to
    				play as soon as either the entire source file is loaded (for nonstreaming
    				media) or an initial buffer is loaded (for streaming media). To prevent
    				the possible accessility issues, developers can instead specifically set <prop>AutoPlay</prop> to
    				false, so that the user always controls whether the media plays. This
    				technique would thus be used in combination with providing user interface
    				controls that go along with the <obj>MediaElement</obj>, and
    				that enable the user to control the media. In particular, the user
    				interface controls enable the media to play, pause or stop, with event
    				wiring for those controls associated with the <function>Play</function>, <function>Pause</function> or <function>Stop</function> methods
    				of the <obj>MediaElement</obj> object. </p>
    			<ulist>
    				<item><p> <loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.mediaelement.pause%28VS.95%29.aspx">Pause</loc> </p></item>
    				<item><p> <loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.mediaelement.play%28VS.95%29.aspx">Play</loc> </p></item>
    				<item><p> <loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.mediaelement.stop%28VS.95%29.aspx">Stop</loc> </p></item>
    			</ulist>
    		</description>
    		<examples>
    			<eg-group>
    				<head>Setting AutoPlay to false, and providing the typical MediaElement controls in the UI </head>
    				<description>
    					<p>This example has a UI definition in XAML and interaction logic in
    						C#. </p>
    					<p>The following is the basic UI in XAML. Note the AutoPlay="false" setting. </p>
    					<codeblock><![CDATA[<UserControl x:Class="MediaElementControlsAutoPlay.MainPage"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  >
   <Grid x:Name="LayoutRoot">
       <Grid.ColumnDefinitions>
           <ColumnDefinition Width="*" />
           <ColumnDefinition Width="*" />
           <ColumnDefinition Width="*"/>
       </Grid.ColumnDefinitions>
       <Grid.RowDefinitions>
           <RowDefinition Height="*" />
           <RowDefinition Height="Auto" />
       </Grid.RowDefinitions>
       <MediaElement x:Name="media" Source="/xbox.wmv"
          Width="300" Height="300" 
          Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="3"
          AutoPlay="False"
          AutomationProperties.Name="Video of new Fable game for XBox"           
       />
       <Button Click="StopMedia" 
    Grid.Column="0" Grid.Row="1" Content="Stop" />
       <Button Click="PauseMedia" 
    Grid.Column="1" Grid.Row="1" Content="Pause" />
       <Button Click="PlayMedia" 
    Grid.Column="2" Grid.Row="1" Content="Play" />
   </Grid>
</UserControl>
]]></codeblock>
    					<p>The following is the C# logic. </p>
    					<codeblock><![CDATA[ private void StopMedia(object sender, RoutedEventArgs e)
 {
     media.Stop();
 }
 private void PauseMedia(object sender, RoutedEventArgs e)
 {
     media.Pause();
 }
 private void PlayMedia(object sender, RoutedEventArgs e)
 {
     media.Play();
 }
 
]]></codeblock>
    					<p>This example is shown in operation in the <loc href="MediaElementControlsAutoPlayTestPage.html" linktype="examples">working example of Media Element Controls with AutoPlay False</loc>.</p>
    				</description>
    			</eg-group>
    		</examples>
    		<resources>
    			<see-also>
    				<ulist>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc189078%28VS.95%29.aspx">Audio
    					and Video Overview</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.mediaelement%28VS.95%29.aspx">MediaElement
    					Class</loc> </p></item>
    					<item><p><loc href="http://smf.codeplex.com/">Silverlight
    						Media Framework</loc> - a framework and a media player control implementation
    						that incorporates many of the Silverlight techniques related to <obj>MediaElement</obj> </p></item>
    				</ulist>
    			</see-also>
    		</resources>
    		<related-techniques>
    			<relatedtech idref="SL17"/>
    		</related-techniques>
    		<tests>
    			<procedure>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. The application
    					is expected to use a <obj>MediaElement</obj> object to play
    					prerecorded media. </p></item><item><p> Check that the media does not play automatically as soon as the
    						application loads and displays. Rather, the user is presented with
    						a user interface that can start the media per the user's action. </p></item></olist>
    			</procedure>
    			<expected-results>
    				<p>#2 is true. </p>
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href="http://trace.wisc.edu/wcag_wiki/index.php?title=Using_AutoPlay_to_Keep_Silverlight_Media_from_Playing_Automatically"/></source>
    		</admin>
    	</technique>
    	<technique id="SL25">
    		<short-name>Using Controls and Programmatic Focus to Bypass Blocks of Content
    			in Silverlight</short-name>
    		<applicability>
    			<p use-id="silverlight.applicability.general"/>
    		</applicability>
    		<applies-to>
    			<success-criterion idref="navigation-mechanisms-skip"/>
    		</applies-to>
    		<ua-issues>
    			<ua-issue use-id="silverlight.ua-issue.general"/>
    		</ua-issues>
    		<description>
    			<p>The objective of this technique is to use the combination of Silverlight
    				control activation and programmatic focus to enable the user to skip
    				regions of content in a Silverlight application user interface. </p>
    			<p>The control that the user activates should clearly indicate that its
    				purpose is to skip content, so that the resulting programmatic focus
    				shift is not interpreted as an undesired change of context. </p>
    			<p>The object to call focus to (the receiver of focus after the user-initiated
    				action is triggered) has to be a <obj>Control</obj> in the Silverlight
    				programming model. This is because the <function>Focus</function> method
    				must be called on the target, and therefore the target must inherit
    				the <obj>Control</obj> class. So, an application author might
    				call focus to a read-only <obj>TextBox</obj>, or perhaps a <obj>RichTextBox</obj>,
    				depending on the purpose of the Silverlight application and its user
    				interface design. You can also focus a <obj>UserControl</obj>,
    				for cases where the area to call focus to represents a custom control
    				implementation. </p>
    			<section>
    				<head> Setting TabIndex (not recommended) </head>
    				<p>Silverlight provides a <prop>TabIndex</prop> attribute that can
    					be used to override the default-generated tab sequence. Do not attempt
    					to adjust tab index as a technique for getting past content blocks.
    					Doing so will create a focus order that does not match the apparent
    					visual order, as described in <loc href="navigation-mechanisms-focus-order" linktype="understanding">SC
    					2.4.3</loc>. </p>
    			</section>
    		</description>
    		<examples>
    			<eg-group>
    				<head>User-enabled control that programmatically sets focus</head>
    				<description>
    					<p>The following is the XAML for the user interface. </p>
    					<codeblock><![CDATA[   <StackPanel Name="LayoutRoot">
       <Button Name="bypassbtn1" Click="bypassbtn1_Click">Skip menus, go to main page content</Button>
       <!intervening content-->
       <StackPanel>
           <RichTextBox Name="rtb_MainContent" IsReadOnly="True">
           <Paragraph>Here is the main content ....</Paragraph>
           </RichTextBox>
       </StackPanel>
   </StackPanel>
   ]]></codeblock>
    					<p>The following is the event handler that forces focus. </p>
    					<codeblock><![CDATA[       private void bypassbtn1_Click(object sender, RoutedEventArgs e)
       {
           rtb_MainContent.Focus();
       }
]]></codeblock>
    					<p>This example is shown in operation in the <loc href="ProgrammaticFocusTestPage.html" linktype="examples">working example of Programmatic Focus</loc>.</p>
    				</description>
    			</eg-group>
    		</examples>
    		<resources>
    			<see-also>
    				<ulist>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc903954%28VS.95%29.aspx">Focus
    					Overview</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc707824%28VS.95%29.aspx">Silverlight
    						Accessibility Overview</loc> </p></item>
    				</ulist>
    			</see-also>
    		</resources>
    		<related-techniques>
    			<relatedtech idref="G123"/>
    		</related-techniques>
    		<tests>
    			<procedure>
    				<olist><item><p> Open the test HTML page for a Silverlight application. </p></item><item><p> Check for a control that indicates that activating that control
    					can skip to some particular region of the content. </p></item><item><p> Activate that control. Verify that activating the control causes
    						focus to go to that region, and that a repeated block or blocks of
    						content are skipped. </p></item></olist>
    			</procedure>
    			<expected-results>
    				<p>#2 and #3 are true. </p>
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href="http://trace.wisc.edu/wcag_wiki/index.php?title=Using_Controls_and_Programmatic_Focus_to_Bypass_Blocks_of_Content_in_Silverlight"/></source>
    		</admin>
    	</technique>
    	<technique id="SL26">
    		<short-name>Using LabeledBy to Associate Labels and Targets in Silverlight</short-name>
    		<applicability>
    			<p use-id="silverlight.applicability.general"/>
    		</applicability>
    		<applies-to>
    			<success-criterion idref="text-equiv-all"/>
    			<success-criterion idref="content-structure-separation-programmatic"/>
    			<success-criterion idref="minimize-error-cues"/>
    			<success-criterion idref="ensure-compat-rsv"/>
    		</applies-to>
    		<ua-issues>
    			<ua-issue use-id="silverlight.ua-issue.general"/>
    			<ua-issue><p>MSAA clients might not use LabeledBy values appropriately, unless
    				such clients are handling MSAA AND IAccessibleEx. See <loc href="http://msdn.microsoft.com/en-us/library/dd561899%28VS.85%29.aspx">IAccessibleEx
    					Implementation Guidelines</loc>. </p></ua-issue>
    		</ua-issues>
    		<description>
    			<p>The objective of this technique is to use the <prop>AutomationProperties.LabeledBy</prop> property
    				to associate a non-interactive text label with an interactive field
    				such as a Silverlight <obj>TextBox</obj> or <obj>RichTextBox</obj>.
    				By using this technique, application authors can use the label text
    				as the default source for <prop>AutomationProperties.Name</prop> on
    				the target, and do not need to specify an explicit <prop>AutomationProperties.Name</prop>. </p>
    			<p>This technique relies on several Silverlight features: the <prop>Name</prop> property
    				for identifying specific UI elements, the <obj>AutomationProperties</obj> API,
    				and the ElementName variation of Silverlight data binding. <prop>AutomationProperties.Name</prop> can
    				be set on and can target any Silverlight <obj>UIElement</obj>.
    				The two most common uses of this labeling technique are for labeling
    				a form field, and for associating an image caption with an image. </p>
    		</description>
    		<examples>
    			<eg-group>
    				<head>Two TextBox form fields, each with a LabeledBy reference
    					to a text label</head>
    				<description>
    					<p>The following is XAML for the UI (and can be inserted into a UserControl
    						XAML root or elsewhere). No code-behind is necessary for this example;
    						the element relationships are established by the {Binding} values in
    						the XAML and interpreted appropriately by the Silverlight run time. </p>
    					<codeblock><![CDATA[   <StackPanel x:Name="LayoutRoot" Background="White">
       <StackPanel Orientation="Horizontal">
           <TextBlock Name="lbl_FirstName">First name</TextBlock>
           <TextBox AutomationProperties.LabeledBy="{Binding ElementName=lbl_FirstName}" Name="tbFirstName" Width="100"/>
       </StackPanel>
       <StackPanel Orientation="Horizontal">
           <TextBlock Name="lbl_LastName">Last name</TextBlock>
           <TextBox AutomationProperties.LabeledBy="{Binding ElementName=lbl_LastName}" Name="tbLastName" Width="100"/>
       </StackPanel>
   </StackPanel>
]]></codeblock>
    					<p>This example is shown in operation in the <loc href="LabelsTestPage.html" linktype="examples">working example of Labels</loc>.</p>
    				</description>
    			</eg-group>
    			<eg-group>
    				<head>Labeling / captioning an image </head>
    				<description>
    					<codeblock><![CDATA[       <Image HorizontalAlignment="Left" Width="480" Name="img_MyPix"
                Source="snoqualmie-NF.jpg"
                AutomationProperties.LabeledBy="{Binding ElementName=caption_MyPix}"/>
       <TextBlock Name="caption_MyPix">Mount Snoqualmie North Bowl Skiing</TextBlock>
       ]]></codeblock>
    					<note><p>If the caption is not a usable text alternative, use the technique <specref ref="SL5"/>, or change the caption
    						text. </p></note>
    				</description>
    			</eg-group>
    		</examples>
    		<resources>
    			<see-also>
    				<ulist>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/system.windows.automation.automationproperties.labeledby%28VS.95%29.aspx">AutomationProperties.LabeledBy</loc> </p></item>
    					<item><p>Tools: <loc href="http://firstfloorsoftware.com/silverlightspy/">SilverlightSpy</loc> or <loc href="http://uiautomationverify.codeplex.com/">UIAVerify</loc> </p></item>
    				</ulist>
    			</see-also>
    		</resources>
    		<related-techniques>
    			<relatedtech idref="SL35"/>
    		</related-techniques>
    		<tests>
    			<procedure>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. To see
    					UI Automation, use Microsoft Windows as platform. </p></item><item><p> Use a verification tool that is capable of showing the full automation
    						tree. (For example, use UIAVerify or Silverlight Spy; see Resources
    						links.) </p></item><item><p> Verify that any element that has a <prop>LabeledBy</prop> value
    							has an associated visible label. </p></item><item><p> Verify that any element that has a <prop>LabeledBy</prop> value
    								uses the <prop>Name</prop> value from that label. </p></item></olist>
    			</procedure>
    			<expected-results>
    				<p>#3 and #4 are true. </p>
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href="http://trace.wisc.edu/wcag_wiki/index.php?title=Using_LabeledBy_to_Associate_Labels_and_Targets_in_Silverlight"/></source>
    		</admin>
    	</technique>
    	<technique id="SL27">
    		<short-name>Using Language/Culture Properties as Exposed by Silverlight Applications
    			and Assistive Technologies</short-name>
    		<applicability>
    			<p use-id="silverlight.applicability.general"/>
    		</applicability>
    		<applies-to>
    			<success-criterion idref="meaning-other-lang-id" relationship="advisory"/>
    		</applies-to>
    		<ua-issues>
    			<ua-issue use-id="silverlight.ua-issue.general"/>
    			<ua-issue><p>Most assistive technologies will use the HTML Lang tag value as the
    				determinant of the language of the page. Assistive technologies would
    				also use HTML Lang tag values for the language of parts. HTML Lang
    				is not specifically reported in accessibility frameworks, so assistive
    				technologies would typically be accessing the HTML DOM to get this
    				information. </p></ua-issue>
    			<ua-issue><p>Existing behavior on screen readers is not able to determine language
    				programmatically by using the CultureInfo and Language properties of
    				.NET and Silverlight that are referenced in the body of this technique.
    				For an alternative technique that specifically uses HTML Lang on two
    				discrete Silverlight object tags, such that language of parts can be
    				determined through the same principles as described in <loc href="H58" linktype="techniques">H58</loc>,
    				see <specref ref="SL4"/>. </p></ua-issue>
    			<ua-issue><p>In the case of the parts that are within Silverlight, these parts
    				are not HTML parts and thus do not provide the ability to specify HTML
    				Lang. For this reason, Silverlight application authors should be cautious
    				about defining extensive text regions in Silverlight that set a Silverlight <prop>Language</prop> to
    				be other than that declared by the hosting page HTML Lang. Any such
    				text regions might not be processed correctly by an assistive technology
    				such as a screen reader. In particular, authors should not specify
    				HTML Lang at all if it is uncertain that the language of the Silverlight "part" will
    				match, due to the "CurrentCulture" that is determined only
    				at run time on the client. In these cases it is best to leave HTML
    				Lang unspecified, so that language properties are under the control
    				of the user's browser settings/preferences, or operating system settings/preferences. </p></ua-issue>
    		</ua-issues>
    		<description>
    			<p>The objective of this technique is to use the combination of HTML
    				<att>Lang</att> attribute, <obj>CultureInfo</obj> and <prop>Language</prop> to
    				correctly specify the language of the entirety of Silverlight content,
    				or of parts within the Silverlight content. </p>
    			<p>In general, Silverlight does not attempt to repurpose HTML Lang, because
    				Silverlight is not HTML. Instead, internally within the Silverlight
    				content area, Silverlight uses language definition concepts that relate
    				to XML (<prop>Language</prop> is a remapping of xml:lang) or .NET
    				Framework programming (<obj>CultureInfo</obj>). For these reasons,
    				HTML Lang techniques as described in [<loc href="H58" linktype="techniques">H58</loc>]
    				are not useful for Silverlight programming of Silverlight-specific "parts". </p>
    			<p>What becomes important in Silverlight application programming then
    				is to make sure that the HTML language concept of Lang and the Silverlight
    				language concept of CultureInfo or Lang are not at odds with one another,
    				or reporting misinformation. In particular, application authors should
    				avoid situations where an assistive technology has HTML Lang available
    				for programmatic determination of either page or part, but the effective
    				runtime language in the Silverlight part is different. The result here
    				might be that a screen reader that changes functionality such as phonetic
    				pronunciations would not correctly read the text content from the Silverlight
    				content. Avoiding this situation is largely a matter of due diligence
    				on the part of a Silverlight application author, OR on the part of
    				the Web page author who authors surrounding HTML, in cases where a
    				Web page is embedding Silverlight content or packages that the Web
    				page's author did not actively develop and is only consuming/embedding. </p>
    			<p>The following is a general recommendation that summarizes the detailed
    				discussion in subsequent subheadings: </p>
    			<ulist><item><p> If the Silverlight application does not have a strong emphasis
    				on presenting textual information with a particular language association,
    				HTML Lang should be left blank. This causes assistive technologies
    				to defer to either user agent or platform language settings. Silverlight
    				is able to determine these same language values at run time, and
    				language behavior of assistive technologies and of Silverlight is
    				kept synchronized through the use of the same external information
    				set. </p></item><item><p> If the Silverlight application DOES have a strong emphasis on
    					presenting textual information with A SINGLE particular language
    					association, HTML Lang should be assigned to report that specific
    					language either for whole page or at least for the Silverlight object
    					tag. This enables assistive technologies to pick up the value, per <loc href="H57" linktype="techniques">H57:
    						Using language attributes on the html element HTML</loc>. Aside from
    					due diligence during development and deployment, Silverlight application
    					code might choose to enforce that its runtime CultureInfo is really
    					the same. This could be addressed with a specific HTML DOM helper
    					function. </p></item><item><p> If the Silverlight application has MULTIPLE language associations,
    						the best option is to separate the Silverlight application into object
    						parts at the HTML level, to assure that HTML Lang and intended runtime
    						language do not clash. This is particularly important if the application
    						is actively resetting CurrentCulture away from the user settings
    						of platform or user agent. For more information, see <specref ref="SL4"/>. </p></item></ulist>
    			<section id="SL27_html-lang">
    				<head> HTML Lang </head>
    				<p>When Silverlight is embedded in an HTML document with the   &lt;object&gt; element,
    					the value of the HTML <att>Lang</att> attribute of the surrounding HTML becomes
    					a factor. Browsers process the outer HTML, and the browser's processing
    					has possible influence over values reported to any DOM script that
    					acts, or to any accessibility framework that is reporting the browser
    					content. The preferred way for a Silverlight application to address <loc href="meaning-doc-lang-id" linktype="understanding">SC
    						3.1.1</loc> is to correctly specify the HTML Lang value in the hosting
    					HTML page. This technique should be used in conjunction with <loc href="H57" linktype="techniques">H57:
    						Using language attributes on the html element HTML</loc>. By using the
    					same language values with both techniques as a better practice, H57
    					will satisfy 3.1.1 while setting the language value of the Silverlight
    					content to match will assist authors in meeting SC 3.1.2. </p>
    				<p>The Silverlight runtime itself does not attempt to inherit language
    					settings that come from markup that is outside the Silverlight-specific
    					content. In particular, the HTML <att>Lang</att> attribute applied to the html
    					tag, Lang on host object tag, specific parameters of the Silverlight
    					object tag, all have no affect on the value of any Silverlight <prop>Language</prop> attribute.
    					Instead, the Silverlight <prop>Language</prop> defaults to the <obj>CultureInfo</obj> of
    					the Silverlight runtime as instantiated by HTML object tag invocation.
    					It is expected that if a Silverlight application contains extensive
    					text where language of text is a factor for assistive technology purposes,
    					developers will manually set the HTML Lang tag to match the <prop>Language</prop> value
    					on the Silverlight root element in XAML. Development tools might or
    					might not enforce or inform the relationship between HTML Lang and
    					Silverlight <prop>Language</prop>; that consideration is outside
    					the scope of Silverlight as a technology. If language is not a major
    					factor in the application, application authors should consider leaving
    					HTML Lang blank on the hosting HTML page. </p>
    				<p>You can programatically determine the value of HTML Lang of surrounding
    					HTML from within the Silverlight API, by using the DOM-bridging method <loc href="http://msdn.microsoft.com/en-us/library/system.windows.browser.htmlelement.getattribute%28VS.95%29.aspx">HtmlElement.GetAttribute</loc>.
    					Otherwise, this can be determined by techniques other than Silverlight's
    					(such as scripting to the HTML DOM of the hosting browser). </p>
    			</section>
    			<section id="SL27-language-property">
    				<head> Silverlight Language property </head>
    				<p><prop>Language</prop> is an attribute that is available on all
    					Silverlight objects that directly represent a UI element. Language
    					can be queried (or set) by Silverlight managed code run time, such
    					that the <prop>Language</prop> value can be programatically determined
    					within the Silverlight programming model. </p>
    				<p>The format of the value that is used to set <prop>Language</prop> is
    					based on ISO-639-1, and is thus compatible with <loc href="http://www.rfc-editor.org/rfc/bcp/bcp47.txt">http://www.rfc-editor.org/rfc/bcp/bcp47.txt</loc>. </p>
    				<p><prop>Language</prop> has a behavior that parallels the behavior
    					of <att>xml:lang</att> in an XML document: if <prop>Language</prop> is set on
    					a parent element, all child elements inherit that <prop>Language</prop> value.
    					An actual <att>xml:lang</att> attribute in XAML is also valid for this purpose. </p>
    				<p><prop>Language</prop> can be set at the root of a XAML document,
    					so that the entire UI shares the same language setting. If <prop>Language</prop> is
    					not explicitly set at the root by application markup, <prop>Language</prop> is
    					inferred per running instance, based on processing the acting <obj>CultureInfo</obj> at
    					run time. </p>
    				<p>However, another usage is for application authors to set <prop>Language</prop> on
    					a specific child element, to override the root-level or client-environment-inferred <prop>Language</prop> value.
    					This enables consciously embedding a content part that is deliberately
    					in a different language than the remainder of the Silverlight content. </p>
    				<p>Exactly what happens when a <prop>Language</prop> is set on a
    					part is not always specified, and is largely a matter of implementation
    					detail of the individual Silverlight classes that might be a "part".
    					However, as an informative generalization, the value of <prop>Language</prop> might
    					affect considerations such as: how white space is processed (in particular
    					CR or LF); character sets for fonts; string formatting when using APIs
    					specifically on that part. </p>
    			</section>
    			<section id="SL27_cultureinfo">
    				<head> CultureInfo </head>
    				<p><obj>CultureInfo</obj> is a concept that is relevant to .NET
    					Framework programming. This concept applies to Silverlight because
    					Silverlight uses a specific implementation of a CLR runtime that uses
    					.NET Framework principles. <obj>CultureInfo</obj> potentially
    					specifies both a language and a culture. This distinction becomes relevant
    					for advanced string formatting concepts that are provided in the .NET
    					Framework, such as decimal separators, dates, and currency. For example,
    					an application author might simply specify "en" if the author
    					did not care about string formatting, but might specify "en-GB" if
    					the application was using string formatting for currency values with
    					the intention of displaying Pounds Sterling as currency unit in string
    					formatting. </p>
    				<p>Silverlight applications often run using an inferred <obj>CultureInfo</obj> based
    					on the operating system where the user agent browser host exists (in
    					other words, the culture of the client computer where the Silverlight
    					application is run). This <obj>CultureInfo</obj> can be queried
    					by applications at run time; see <loc href="http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.currentculture%28VS.95%29.aspx">CultureInfo.CurrentCulture</loc>.
    					Application authors can deliberately constrain the set of <obj>CultureInfo</obj> cases
    					that a Silverlight application can be run under, in order to verify
    					that necessary string resources for that culture are available in that
    					application. This is done by setting &lt;SupportedCultures&gt; in the
    					Silverlight project settings. If a user accesses the application on
    					a client that is outside the SupportedCultures, the application author
    					has the following choices: </p>
    				<ulist><item><p> Use a fallback resource set representing a neutral culture; this
    					is enabled automatically by the Silverlight resources lookup behavior,
    					so long as the project includes resources identified as being culture-neutral.
    					This is the preferred approach. </p></item><item><p> Use client logic to detect the culture, and initiate a client-side
    						redirect to request either a different XAP or a different hosting
    						HTML page. </p></item><item><p> Trap requests at the server level by checking lang request in
    							the header. This varies between server implementations, is not a
    							Silverlight-specific technique, and is not discussed here. </p></item></ulist>
    				<p>For more information, see <loc href="http://msdn.microsoft.com/en-us/library/dd941932%28VS.95%29.aspx">How
    					to: Create a Build that Targets a Specific Culture</loc>. </p>
    				<p><obj>CultureInfo</obj> generally applies to the Silverlight
    					application as a whole. There are advanced techniques whereby worker
    					threads can be run as separate cultures, but that is not discussed
    					here and is not relevant because only the main UI thread has relevance
    					to Web content accessibility. So, if an application author wants to
    					declare specific language settings for a part (component, region or
    					control) of the Silverlight application, a different Silverlight-specific
    					property <prop>Language</prop> is used. </p>
    			</section>
    		</description>
    		<examples>
    			<p>These examples show Silverlight behaviors that are based on interpreting
    				the <prop>Language</prop> property value, as a way of illustrating
    				the programmatic determination of language values specifically in the
    				Silverlight application framework. To determine HTML Lang, application
    				authors should use the HTML DOM as enabled by browser host scripting,
    				rather than Silverlight APIs. HTML DOM techniques are not shown here
    				because they are specific to browsers or scripting frameworks, not
    				to Silverlight. </p>
    			<eg-group>
    				<head>Language set at root-level of Silverlight content, inherits</head>
    				<description>
    					<p>This example features a XAML UI and logic that reports information
    						to demonstrate that the information is programmatically determinable.
    						This example shows determination of the <loc href="http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.language%28VS.95%29.aspx">Language</loc> property. </p>
    					<codeblock><![CDATA[<UserControl x:Class="LangProperties.MainPage" 
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   Language="en-gb">
 <StackPanel x:Name="LayoutRoot" Background="White">
       <Border BorderBrush="Red" BorderThickness="2">
           <TextBlock Language="zh-cn" Text="（（）共" Name="t2" VerticalAlignment="Top" TextWrapping="Wrap" Height="100"/>
       </Border>
       <Border BorderBrush="Red" BorderThickness="2">
           <TextBlock Text="（（）共" Name="t3" VerticalAlignment="Top" TextWrapping="Wrap" Height="100"/>
       </Border>
       <Button Click="button1_Click">IETF Language of this app</Button>
 </StackPanel>
</UserControl

private void button1_Click(object sender, RoutedEventArgs e)
{
   Button b = sender as Button;
   MessageBox.Show(b.Language.IetfLanguageTag);
   // this will be 'en-gb' because inherits from the root
}
]]></codeblock>
    					<p>This example is shown in operation in the <loc href="LangPropertiesTestPage.html" linktype="examples">working example of Language Properties</loc>.</p>
    				</description>
    			</eg-group>
    			<eg-group>
    				<head>Determine CurrentCulture; runtime verification that CurrentCulture and the surrounding HTML's current Lang value do not report different language settings </head>
    				<description>
    					<p>The following is an event handler that can be hooked to an object
    						lifetime event such as <event>UserControl.Loaded</event> on the Silverlight
    						XAML root. This example demonstrates property access to several of
    						the relevant language properties that are present in Silverlight and
    						shows a specific way to compare CultureInfo and Lang by a   "not
    						equals" check after constructing a CultureInfo based on the Lang
    						string. To apply this test, the hosting HTML page may need to be altered
    						to declare a specific HTML Lang; default Silverlight aspx or html test
    						pages do not declare HTML Lang. </p>
    					<codeblock><![CDATA[       private void RunLanguageDetectLogic(object sender, RoutedEventArgs e)
       {
           CultureInfo thisAppCC = CultureInfo.CurrentCulture;
           CultureInfo thisAppCUIC = CultureInfo.CurrentUICulture;
           HtmlDocument thisPage = HtmlPage.Document;
           String thisAppHTMLLang = (string) thisPage.DocumentElement.GetProperty("lang");
           CultureInfo CCFromLang = new CultureInfo(thisAppHTMLLang);
           if (CCFromLang != thisAppCC && CCFromLang.ToString() !=  "")
           {
               TextBlock tb = new TextBlock();
               tb.Text += "Warning: the current culture for the run time (";
               tb.Text += thisAppCC.ToString();
               tb.Text += ") does not match the culture indicated in hosting HTML's Lang (";
               tb.Text += CCFromLang.ToString();
               tb.Text += ").";
               tb.Inlines.Add(new LineBreak());
               tb.Inlines.Add("Typical action here would be to redirect the request to an HTML page
                 where the Lang is correct for user's current culture as determined from the OS.");
               LayoutRoot.Children.Add(tb); 
               //LayoutRoot refers to the default MainPage.xaml element from a VS-template Silverlight Application
           }
       }
]]></codeblock>
    				</description>
    			</eg-group>
    		</examples>
    		<resources>
    			<see-also>
    				<ulist>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc838238%28VS.95%29.aspx">Localizing
    						Silverlight-based Applications</loc> </p></item>
    				</ulist>
    			</see-also>
    		</resources>
    		<tests>
    			<procedure>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. </p></item><item><p> Verify that language settings are respected by individual Silverlight
    						control characteristics. (Exactly what behavior manifests the language
    						difference varies per Silverlight class implementation. For some
    						testing ideas, see <loc href="http://msdn.microsoft.com/en-us/library/cc853414%28VS.95%29.aspx">Creating
    							Globally Aware Applications</loc>). </p></item><item><p> Verify that any interaction between HTML Lang in the HTML and
    								the Language or CultureInfo from the Silverlight application do not
    								result in a clash of language information, either in terms of basic
    								application behavior or in how an assistive technology decides to
    								process language information. </p></item></olist>
    			</procedure>
    			<expected-results>
    				<p>#2 and #3 are true. </p>
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href="http://trace.wisc.edu/wcag_wiki/index.php?title=Using_Language/Culture_Properties_as_Exposed_by_Silverlight_Applications_and_Assistive_Technologies"/></source>
    		</admin>
    	</technique>
    	<technique id="SL28">
    		<short-name>Using Separate Text-Format Text Captions for MediaElement Content</short-name>
    		<applicability>
    			<p use-id="silverlight.applicability.general"/>
    		</applicability>
    		<applies-to>
    			<success-criterion idref="media-equiv-captions"/>
    		</applies-to>
    		<ua-issues>
    			<ua-issue use-id="silverlight.ua-issue.general"/>
    		</ua-issues>
    		<description>
    			<p>The objective of this technique is to use text captioning that comes
    				from a separate text file, synchronize the captions with the media
    				in a Silverlight <obj>MediaElement</obj>, and display the captions
    				in Silverlight. </p>
    			<p>There are two variations of the general theme of implementing Silverlight
    				media player controls to work with external timed text: using built-in
    				capabilities of the Microsoft Expression Encoder tool, and using parsing
    				code that consumes caption as a raw file format and converts that format
    				into the Silverlight API's <obj>TimelineMarkers</obj> representation.
    				This technique primarily addresses how to use the Expression Encoder
    				technique, along with media player templates that are also provided
    				by Expression Encoder or related Silverlight SDKs such as the Smooth
    				Streaming SDK. </p>
    			<p>At a pure architecture level, Silverlight uses the <obj>TimelineMarkers</obj> API
    				to display caption text at synchronized times. The Expression Encoder
    				and Expression Blend tools provide a front end to drive the <obj>TimelineMarkers</obj> API
    				for the supported formats. The intention of the architecture is so
    				that Silverlight as a run-time has a base architecture that could potentially
    				use any existing or future timed text format, but the tools for Silverlight
    				(rather than built-in features of the runtime) provide the optimized
    				workflow for producing captioned media projects. </p>
    			<p>A procedure for using the Expression Encoder and Expression Blend
    				tools to produce a Silverlight media player application that can consume
    				timed text in TTML format is provided as Example 1 in this technique.
    				(Note: prior to the approval of TTML by W3C, DFXP was a format that
    				used much of the eventual TTML vocabulary. In tools that predate TTML,
    				this format is often identified as DFXP.) </p>
    			<p>A purely code-based parsing technique, with the goal of avoiding Expression
    				Encoder dependencies, is necessarily more complex. This is because
    				there are multiple issues to solve: </p>
    			<ulist><item><p> Obtaining and validating the timed text file </p></item><item><p> Parsing the format into general information items like timings,
    				text, format etc. that are either consumable directly in a Silverlight
    				API, or useful as intermediates </p></item><item><p> Using the timecode information to create <obj>TimelineMarker</obj> representations
    					for each timed text entity </p></item><item><p> Associating the <obj>TimelineMarkers</obj> with media loaded
    						by the player </p></item><item><p> Finding a place to store the additional formatting that is conveyed,
    							including the text and any formatting </p></item><item><p> Handling events from <obj>TimelineMarkers</obj> in the media
    								player, in such a way that text and formatting behavior can be retrieved
    								and presented in the Text part of the player UI </p></item></ulist>
    			<section id="SL28_formats">
    				<head> Text Captioning Formats </head>
    				<p>There are several existing text-based formats that are used for text
    					captioning of prerecorded media. The following are supported as formats
    					if using the Expression Encoder tool as shown in Example 1 (where the
    					Expression Encoder generated Silverlight application uses the existing
    					Silverlight MediaPlayerTemplate and the TimedTextLibrary component.)
    					For more information on which timed text formats can be referenced
    					in an Expression Encoder project, see <loc href="http://msdn.microsoft.com/en-us/library/ff723862%28Expression.40%29.aspx">About
    						Captioning (Expression documentation on MSDN)</loc>. </p>
    				<ulist><item><p> SAMI (Synchronized Accessible Media Interchange). For more information
    					on this format, see <loc href="http://msdn.microsoft.com/en-us/library/ms971327.aspx">Understanding
    						SAMI 1.0</loc> on MSDN. </p></item><item><p> SMIL (Synchronized Multimedia Integration Language). For more
    							information on this format, see <loc href="http://www.w3.org/TR/2008/REC-SMIL3-20081201/">Synchronized
    								Multimedia Integration Language (SMIL 3.0)</loc> on W3C site. </p></item><item><p> TT (Timed Text) in particular TTML (Timed Text Markup Language).
    									For more information, see <loc href="http://www.w3.org/TR/ttaf1-dfxp/">Timed
    										Text Markup Language (TTML) 1.0</loc> on W3C site. </p></item><item><p> TTML (previously known as DFXP). This is the Timed Text format
    											used by Adobe Flash for its FLVPlaybackCaptioning component,
    											and is produced by a variety of tools and full-service captioning
    											vendors. For more information, see <loc href="http://www.adobe.com/accessibility/products/flash/captions.html">Captions</loc> on
    											the Adobe site. </p></item></ulist>
    				<p>The following are not supported directly in Expression Encoder templates.
    					To use these formats, application authors would have to write parsing
    					logic, as shown in Example 2: </p>
    				<ulist><item><p> MPEG Part 17 / 3GPP Timed Text. For more information, see <loc href="http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=39478">ISO/IEC
    					14496-17:2006</loc> on ISO site. </p></item><item><p> Other formats that have not realized wide adoption, for example
    						Universal Subtitle Format. </p></item><item><p> In addition to these formats, other formats for device-specific
    							recorded media (such as DVD encoded tracks) could be cross-purposed
    							for use by streaming/online media. </p></item></ulist>
    				<p>Rather than build the parsing logic for all these formats into the
    					Silverlight runtime, or choosing just one of these formats to support,
    					the Silverlight design for text captioning at the core level instead
    					makes the <obj>TimelineMarkers</obj> property of a <obj>MediaElement</obj> writeable,
    					independently of the value of <prop>Source</prop>. The format of
    					each <obj>TimelineMarker</obj> in the collection is very simple:
    					a time value expressed in the format, and the text value of the text
    					for that synchronized caption. The time format for <obj>TimelineMarkers</obj> is
    					documented as <loc href="http://msdn.microsoft.com/en-us/library/system.windows.media.timelinemarker.time%28VS.95%29.aspx">TimelineMarker
    						reference on MSDN</loc>. Converting timed text formats to <obj>TimelineMarkers</obj> form
    					as consumed by the Silverlight core can be done by following any of
    					the following application design patterns: </p>
    				<ulist><item><p> Authoring the project using Expression Encoder, and using the
    					Expression MediaPlayerTemplate as the media player UI. In this case,
    					Expression produces a Silverlight application that includes assemblies
    					that are generated from code templates. The default build of the
    					project provides a working library that handles all tasks related
    					to timed-text format conversion, from the formats as documented at <loc href="http://msdn.microsoft.com/en-us/library/ff723862%28Expression.40%29.aspx">About
    						Captioning (Expression documentation on MSDN)</loc>. </p></item><item><p> The templates of an Expression Encoder project can also be edited,
    							either editing the XAML for the UI by altering the template, or by
    							altering the C# code files that define various aspects of the media
    							player logic, including the timed text format parsers. Then the project
    							can be rebuilt using the desired customizations. Using this technique,
    							it is possible to adapt the code to support timed text formats that
    							are not directly supported in the Expression Encoder project UI. </p></item><item><p> Using a 3rd party media player implementation that also includes
    								a codebase for processing timed text formats, producing <obj>TimelineMarkers</obj>,
    								and displaying the captions in the player-specific UI. </p></item><item><p> Including a library that handles just the format parsing, and
    									using APIs of this library as part of the Silverlight application
    									code-behind. </p></item><item><p> Writing all logic that is necessary for timed text parsing AND
    										application UI display, and including it all in the main Silverlight
    										application library. </p></item></ulist>
    			</section>
    		</description>
    		<examples>
    			<eg-group>
    				<head>Using Expression Encoder and Expression Blend to produce
    					a Silverlight media player project from tool output and templates</head>
    				<description>
    					<p>By far the simplest technique for incorporating existing timed-text
    						information is to use Microsoft Expression Encoder and the media player
    						templates that an Expression Encoder project produces by default. You
    						can use timed text in any of the following formats: DFXP, SAMI, SRT,
    						SUB, and LRC. Associating a caption file with a media source is done
    						as an "import" operation in the Expression Encoder tool.
    						However, the   "import" does not necessarily mean that the
    						timed text file is integrated into the media stream; Silverlight authors have the option
    						to preserve the file separation. This is useful if the application is obtaining
    						timed text from a third party source in real-time, or if Silverlight authors have a
    						production pipeline that makes it difficult to have the captioning
    						ready in time to be encoded in the stream along with the audio-visual
    						source files. For third-party timed text files that are served directly
    						from the third party's HTTP servers, it can be useful to supply a dummy
    						URL in the initial project encoding. The output of the Expression Encoder
    						project parameterizes many of the project settings at the HTML level.
    						This makes it possible to change the URL at any time prior to deployment
    						without having to rebuild the project. The following code is the HTML
    						output of a sample Expression Encoder project. Note the CaptionSources
    						node in the initparams; that is the information item that informs the
    						Expression Encoder templates where to find the timed text file. </p>
    					<codeblock><![CDATA[     <object data="data:application/x-silverlight," type="application/x-silverlight" width="100%" height="100%">
       <param name="source" value="MediaPlayerTemplate.xap"/>
       <param name="onerror" value="onSilverlightError" />
       <param name="autoUpgrade" value="true" />
       <param name="minRuntimeVersion" value="4.0.50401.0" />
       <param name="enableHtmlAccess" value="true" />
       <param name="enableGPUAcceleration" value="true" />
       <param name="initparams" value='playerSettings = 
         <Playlist>
           <AutoLoad>true</AutoLoad>
           <AutoPlay>true</AutoPlay>
           <DisplayTimeCode>false</DisplayTimeCode>
           <EnableOffline>false</EnableOffline>
           <EnablePopOut>false</EnablePopOut>
           <EnableCaptions>true</EnableCaptions>
           <EnableCachedComposition>true</EnableCachedComposition>
           <StretchNonSquarePixels>NoStretch</StretchNonSquarePixels>
           <StartMuted>false</StartMuted>
           <StartWithPlaylistShowing>false</StartWithPlaylistShowing>
           <Items>
             <PlaylistItem>
             <AudioCodec></AudioCodec>
             <Description></Description>
             <FileSize>2797232</FileSize>
             <IsAdaptiveStreaming>false</IsAdaptiveStreaming>
             <MediaSource>thebutterflyandthebear.wmv</MediaSource>
             <ThumbSource></ThumbSource>
             <Title>thebutterflyandthebear</Title>
             <DRM>false</DRM>
             <VideoCodec>VC1</VideoCodec>
             <FrameRate>30.00012000048</FrameRate>
             <Width>508</Width>
             <Height>384</Height>
             <AspectRatioWidth>4</AspectRatioWidth>
             <AspectRatioHeight>3</AspectRatioHeight>
             <CaptionSources>
               <CaptionSource Language="English" LanguageId="eng" Type="Captions" Location="thebutterflyandthebear.eng.capt.dfxp"/>
             </CaptionSources>
           </PlaylistItem>
         </Items>
      </Playlist>'/>       
   </object>
   ]]></codeblock>
    					<p>The templates include a library that handles any parsing requirements
    						for the chosen timed text format, both at the level of getting the
    						basic text and timing into the <obj>TimelineMarkers</obj> used
    						by the run-time <obj>MediaElement</obj>, and for preserving
    						a subset of format information that can reasonably be crossmapped
    						from the formatting paradigm of the source (typically HTML/CSS) into
    						the Silverlight text object model of the text element that displays
    						the captions in the running Silverlight application. </p>
    					<p>The following is a brief description of the procedure for creating
    						a project that incorporates a separate timed text file. </p>
    					<olist><item><p> From the initial Expression Encoder screen, select New Project
    						from the File menu. </p></item><item><p> In the <emph role="strong">Load a new project</emph> dialog, select <emph role="strong">Silverlight
    							Project</emph>. </p></item><item><p> From the File menu, select Import. Choose the primary media source
    								file the project will use. </p></item><item><p> In the Text tab, find the listing for the media source file. Click
    									the <emph role="strong">+</emph> icon to the right of the file name. This opens
    									a file dialog. </p></item><item><p> Choose a timed text file to add to the project. </p></item><item><p> Build the project. By default the project produces a complete
    										output folder. The folder includes the media player template XAP,
    										the timed text file as a separate file, and additional libraries
    										and XAPs that support the basic template and/or the timed text capabilities. </p></item><item><p> Optionally, use the features in the Templates tab of Expression
    											Encoder to generate a template copy. You can edit the template copy
    											in other tools such as Expression Blend or Visual Studio, to change
    											the layout or behavior from the default media player template. Template
    											editing can address requirements such as applying a particular branding
    											or "look" to the player user interface. </p></item></olist>
    					<p>The following is a screenshot of the Expression Encoder (version 4)
    						interface. The <emph role="strong">+</emph> icon mentioned in Step 4 is highlighted
    						in this screenshot with a red diamond. The <emph role="strong">Templates</emph> tab
    						mentioned in Step 7 is on the right side, top-middle. Note that all
    						tabs of an Expression user interface are dockable; the orientations
    						shown here are the default, but could be in different locations on
    						any given computer or configuration. </p>
    					<p><image><img source="working-examples/SL28/encoder_scr.png" height="768" width="1024"/><alt>Expression Encoder screenshot</alt></image> </p>
    				</description>
    			</eg-group>
    			<eg-group>
    				<head>Code parses timed text; MediaElement handles MarkerReached,
    				displays marker text in application-defined TextBox</head>
    				<description>
    					<p>This example defines a very simple media player class that includes
    						a display surface, basic controls, and a text display for captions
    						as part of its default template. The usage code for this control in
    						XAML is simple, but only because the majority of the implementation
    						is present in the definition of the media player class. </p>
    					<p>
    					The following is example usage XAML: </p>
    					<codeblock><![CDATA[ <local:SimpleMediaPlayerWithTT Width="480" Height="360" CaptionUri="testttml.xml" MediaSourceUri="/xbox.wmv" />
    					]]></codeblock>
    					<p>Note the attributes CaptionUri and SimpleMediaPlayerWithTT. Each
    						of these is a custom property of the media control class TTReader.
    						CaptionUri in particular references a URL, in this case a local URL
    						from the same server that serves the Silverlight XAP. The timed text
    						file could come from a different server also, but comes from a local
    						server in this example to conform to the behavior of the test file. </p>
    					<p>The following is the generic.xaml default template for the media player
    						control. The template is mainly relevant for showing the named elements
    						that are shown in the initialization code. </p>
    					<codeblock><![CDATA[               <ControlTemplate TargetType="local:SimpleMediaPlayerWithTT">
                   <Border Background="{TemplateBinding Background}"
                           BorderBrush="{TemplateBinding BorderBrush}"
                           BorderThickness="{TemplateBinding BorderThickness}">
                       <Grid x:Name="vroot">
                           <Grid.RowDefinitions>
                               <RowDefinition Height="*"/>
                               <RowDefinition Height="50"/>
                               <RowDefinition Height="80"/>
                           </Grid.RowDefinitions>
                           <MediaElement x:Name="player" AutoPlay="False"/>
                           <StackPanel Orientation="Horizontal" Height="50" Grid.Row="1">
                               <Button x:Name="player_play">Play</Button>
                               <Button x:Name="player_pause">Pause</Button>
                               <Button x:Name="player_stop">Stop</Button>
                           </StackPanel>
                           <ScrollViewer x:Name="scroller" Height="50" Grid.Row="2">
                           <TextBox IsReadOnly="True" x:Name="captions"/>
                           </ScrollViewer>
                       </Grid>
                   </Border>
               </ControlTemplate>
               ]]></codeblock>
    					<p>The following is the initialization code that is for general infrastructure. <function>OnApplyTemplate</function> represents
    					the code wiring to the template-generated UI. </p>
    					<codeblock><![CDATA[   public class SimpleMediaPlayerWithTT : Control
   {
       MediaElement player;
       TextBox captions;
       public SimpleMediaPlayerWithTT()
       {
           this.DefaultStyleKey = typeof(SimpleMediaPlayerWithTT);
       }
       public override void OnApplyTemplate()
       {
           base.OnApplyTemplate();
           player = this.GetTemplateChild("player") as MediaElement;
           captions = this.GetTemplateChild("captions") as TextBox;
           scroller = this.GetTemplateChild("scroller") as ScrollViewer;
           //event hookups and prop inits
           player.MediaOpened += new RoutedEventHandler(OnMediaOpened);
           player.MediaFailed += new EventHandler<ExceptionRoutedEventArgs>(OnMediaFailed);
           player.Source = this.MediaSourceUri;
           player.MarkerReached+=new TimelineMarkerRoutedEventHandler(player_MarkerReached);
           Button player_play = this.GetTemplateChild("player_play") as Button;
           player_play.Click += new RoutedEventHandler(player_play_click);
           Button player_pause = this.GetTemplateChild("player_pause") as Button;
           player_pause.Click += new RoutedEventHandler(player_pause_click);
           Button player_stop = this.GetTemplateChild("player_stop") as Button;
           player_stop.Click += new RoutedEventHandler(player_stop_click);
       }
       // mediaelement in template events
       void OnMediaOpened(object sender, RoutedEventArgs e)
       {
           LoadCaptions(captionUri);
       }
       void OnMediaFailed(object sender, ExceptionRoutedEventArgs e)
       {
       }
       void player_MarkerReached(object sender, TimelineMarkerRoutedEventArgs e)
       {
           captions.SelectedText = e.Marker.Text + "\n";
           scroller.ScrollToVerticalOffset(scroller.ScrollableHeight);
       }
       void player_play_click(object sender, RoutedEventArgs e)
       {
           player.Play();
       }
       void player_pause_click(object sender, RoutedEventArgs e)
       {
           player.Pause();
       }
       void player_stop_click(object sender, RoutedEventArgs e)
       {
           player.Stop();
       }
       // properties
       private Uri captionUri;
       public Uri CaptionUri
       {
           get { return captionUri; }
           set { captionUri = value; }
       }
       private Uri msUri;
       public Uri MediaSourceUri
       {
           get { return msUri; }
           set { msUri = value; }
       }
       ]]></codeblock>
    					<p>The following is the logic that is particular to obtaining the separate
    						caption file. Some of this logic is referenced in the preceding template-specific
    						event handlers. This example uses the asynchronous <obj>WebClient</obj> technique
    						to request the file result of the <prop>CaptionUri</prop>. Make
    						sure to use <prop>AutoPlay</prop>=false or some other means to allow
    						time for the caption file to download before attempting to play the
    						media file. </p>
    					<codeblock><![CDATA[       private void LoadCaptions(Uri captionURL)
       {
           WebClient wc = new WebClient();   // Web Client to download data files
           if (captionURL != null)
           {
               wc.DownloadStringCompleted +=
                   new DownloadStringCompletedEventHandler(OnDownloadStringCompleted);
               wc.DownloadStringAsync(captionURL);
           }
       }
       private void OnDownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
       {
           if (!e.Cancelled && e.Error == null && e.Result != "")
           {
               string xml = e.Result.Trim();
               ParseCaptionData(new StringReader(xml));
           }
       }
       ]]></codeblock>
    					<p>The actual parsing can be done using a combination of the "XML
    						to Linq" facilities of an optional Silverlight library, and
    						standard .NET Framework string format APIs from the Silverlight core.
    						An implementation is NOT provided here, due to length considerations.
    						TTML supports a number of profiles and capabilities. The basic pattern
    						to follow in the implementation is to obtain the necessary text and
    						timing information, and to pass it to a function that might resemble
    						the following code template. This code template takes the raw information,
    						generates a new <obj>TimelineMarker</obj>, and adds it to the
    						collection assigned to the active <obj>MediaElement</obj> as
    						identified by "player" in the application. </p>
    					<codeblock><![CDATA[       public void AddMediaMarker(string time, string type, string data)
       {
           TimelineMarker marker = new TimelineMarker();
           marker.Time = new TimeSpan(0,0,(Convert.ToInt32(time.Trim())/1000));
           // this logic could vary depending on how time is formatted in the input string; this one assumes raw milliseconds
           marker.Type = type;
           marker.Text = data.Trim();
           player.Markers.Add(marker);
       }
]]></codeblock>
    				</description>
    			</eg-group>
    		</examples>
    		<resources>
    			<see-also>
    				<ulist>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc189078%28VS.95%29.aspx">Audio
    					and Video Overview</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.mediaelement%28VS.95%29.aspx">MediaElement
    					Class</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/system.windows.media.timelinemarker%28VS.95%29.aspx">TimelineMarker.Time</loc> </p></item>
    					<item><p><loc href="http://amp.codeplex.com/">Accessible
    						Media Project</loc> - a reference implementation MediaPlayer control
    						from the Silverlight product team that includes several accessibility
    						features including captioning; note that the codebase might not be
    						updated to Silverlight version 4 </p></item>
    				</ulist>
    			</see-also>
    		</resources>
    		<related-techniques>
    			<relatedtech idref="SL17"/>
    			<relatedtech idref="SL16"/>
    		</related-techniques>
    		<tests>
    			<procedure>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. That
    					application plays media that is expected to have text captioning. </p></item><item><p> Check that the text area in the textbox shows captions for the
    						media, and that the captions synchronize with media in an expected
    						way. </p></item></olist>
    			</procedure>
    			<expected-results>
    				<p>#2 is true. </p>
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href="http://trace.wisc.edu/wcag_wiki/index.php?title=Using_Separate_Text-Format_Text_Captions_for_MediaElement_Content"/></source>
    		</admin>
    	</technique>
    	<technique id="SL29">
    		<short-name>Using Silverlight "List" Controls to Define Blocks that
    			can be Bypassed</short-name>
    		<applicability>
    			<p use-id="silverlight.applicability.general"/>
    		</applicability>
    		<applies-to>
    			<success-criterion idref="navigation-mechanisms-skip"/>
    		</applies-to>
    		<ua-issues>
    			<ua-issue use-id="silverlight.ua-issue.general"/>
    		</ua-issues>
    		<description>
    			<p>The objective of this technique is to use some of the basic user interface
    				objects in Silveright to produce blocks of content that are identified
    				as a "List" to accessibility frameworks and to Silverlight's
    				own tab sequence navigation behavior. </p>
    			<p>Using the "List" technique results in a tab sequence behavior
    				whereby that element is treated as a single tab stop, even if that
    				element has consituent elements (the list items) that would otherwise
    				be considered additional tab stops in the main tab sequence. In the
    				default key handling, when the user presses the TAB key while focus
    				is on a List, the focus goes to the next element after the List. To
    				focus the items of the list, the user would press the Arrow keys rather
    				than TAB. In the Silverlight programming model for controls, this tab
    				sequence behavior is expressed by the <prop>TabNavigation</prop> property
    				holding the value of <prop>Once</prop>. The Silverlight <loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.listbox%28VS.95%29.aspx">ListBox</loc> is
    				a control that reports itself as "List" role, and that has
    				a default <loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.control.tabnavigation%28VS.95%29.aspx">TabNavigation.Once</loc> value.
    				Thus <loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.listbox%28VS.95%29.aspx">ListBox</loc> as
    				per this technique is a lightweight technique for producing blocks
    				that can be bypassed. It is specifically a lightweight technique because
    				it can be accomplished by writing simple application-level XAML and
    				using only the Silverlight core libraries. </p>
    			<p>Silverlight also supports more full-featured techniques for producing
    				bypass blocks that are based on common user interface features such
    				as menus or toolbars. However, using toolbars in Silverlight is inherently
    				not as lightweight because the Silverlight core libraries themselves
    				do not include a ready-made toolbar. Silverlight provides a <obj>ContextMenu</obj> as
    				part of the Silverlight Toolkit extensions, but the behavior of this
    				particular menu does not easily address the bypass block scenario.
    				Silverlight includes all the infrastructure and necessary base classes
    				for defining a toolbar or a menu that could address the bypass block
    				scenario. Many third-party control implementations of menus and toolbars
    				exist, either as part of control packages that are sold by control
    				vendors, or through community mechanisms such as CodePlex or third-party
    				sites that provide free source code. For some examples, see the following: </p>
    			<ulist><item><p> <loc href="http://demos.telerik.com/silverlight/">http://demos.telerik.com/silverlight/</loc> </p></item><item><p> <loc href="http://www.componentone.com/SuperProducts/StudioSilverlight/">http://www.componentone.com/SuperProducts/StudioSilverlight/</loc> </p></item><item><p> <loc href="http://www.vectorlight.net/silverlight/controls.aspx">http://www.vectorlight.net/silverlight/controls.aspx</loc> </p></item></ulist>
    			<p>If application authors use a built-in control such as <loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.listbox%28VS.95%29.aspx">ListBox</loc> where
    				the accessibility framework reported role is not traditionally associated
    				with a navigation role, it is a best practice to set <prop>AutomationProperties.Name</prop> such
    				that the name informs the user of the purpose of the list control.
    				Otherwise, the role alone leaves this ambiguous. For example, an author
    				might name the list control "Navigation control". </p>
    			<p>Often the List control itself is focusable. So long as the List control
    				has a visual focus indicator, that behavior might be acceptable. However,
    				it might provide a better user experience to deliberately have the
    				List itself non-focusable, and instead have focus fall to the first
    				List item when focus reaches that region. Otherwise, the List might
    				be perceived as an "extra" tab stop to some users. To enable
    				that behavior, set <loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.control.istabstop%28VS.95%29.aspx">IsTabStop</loc> to
    				false on the List control. The List itself still provides the intended
    				tab navigation behavior, and is still reported and identified to accessibility
    				frameworks and assistive technologies, even when the List container
    				is not focusable. This is shown in Example 1, by setting <prop>IsTabStop</prop> as
    				part of a <loc href="http://msdn.microsoft.com/en-us/library/system.windows.style%28VS.95%29.aspx">Style</loc>. </p>
    			<p>When an accessibility framework presents a List, assistive technologies
    				are generally expected to continue to support use of the same key behavior
    				as the default behavior, and to report to users that the item is a
    				List when it is focused. If assistive technologies use the accessibility
    				framework APIs for navigation, the items in the list are considered
    				child elements. Navigating either by spatial direction (e.g. NAVDIR_RIGHT
    				in MSAA) or sequential direction (e.g. NAVDIR_NEXT in MSAA) skips the
    				list items and goes to the spatial/next peer. </p>
    		</description>
    		<examples>
    			<eg-group>
    				<head>Customize the behavior and appearance of a ListBox to
    					construct a navigation control that can be bypassed</head>
    				<description>
    					<p>In this example, several properties that influence the items presentation
    						behavior of the Silverlight core control <obj>ListBox</obj> are
    						adjusted to make it suitable for a navigation control. The behavior
    						of this control is that when the tab sequence reaches the control,   "next" or
    						spatial navigation continues on to other controls, rather than through
    						the child controls of the list's items/options. This is enabled and
    						properly reported because <obj>ListBox</obj> reports its accessibility
    						framework role as "List", uses <prop>TabNavigation</prop> = Once as
    						default (because it is the default, <prop>TabNavigation</prop> does not have to
    						be set explicitly in the markup). <obj>ListBox</obj> has default
    						key handling for the arrow keys (to enable traversing the choices in
    						the menu by keyboard-only). The control could also be visually a menu
    						or perhaps other user interface control metaphors, depending on how
    						it is visually templated and composited. Regardless of appearance,
    						the accessibility framework and any assistive technologies based on
    						that framework will treat the control as a "List". This example
    						is templated as a horizontally oriented toolbar-type control. The items
    						in this example are <obj>Button</obj> controls, but could be
    						templated to not appear quite as button-like, or could instead use
    						another focusable control for the items such as a read-only <obj>TextBox</obj>. </p>
    					<codeblock><![CDATA[<UserControl x:Class="TabNavigation.MainPage"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
   <StackPanel x:Name="LayoutRoot" Background="White">
       <ListBox AutomationProperties.Name="Navigation Control">
           <ListBox.ItemsPanel>
               <ItemsPanelTemplate>
                   <StackPanel Orientation="Horizontal"/>
               </ItemsPanelTemplate>
           </ListBox.ItemsPanel>
           <ListBox.ItemContainerStyle>
               <Style TargetType="Control">
                   <Setter Property="IsTabStop" Value="False"/>
               </Style>
           </ListBox.ItemContainerStyle>
           <Button>Home</Button>
           <Button>Search</Button>
           <Button>Tools</Button>
           <Button>Help</Button>
       </ListBox>
   </StackPanel>
   <Button>Button here to show a focusable peer control beyond the list</Button>
</UserControl>
]]></codeblock>
    					<p>The following is an illustration of what such a control might look
    						like: </p>
    					<p><image><img source="working-examples/SL29/listboxbar.png" height="148" width="416"/><alt>Screen shot of a focusable control beyond a list of buttons</alt></image> </p>
    					<p>This example is shown in operation in the <loc href="TabNavigationTestPage.html" linktype="examples">working example of Tab Navigation</loc>.</p>
    				</description>
    			</eg-group>
    		</examples>
    		<resources>
    			<see-also>
    				<ulist>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc903954%28VS.95%29.aspx">Focus
    					Overview</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc707824%28VS.95%29.aspx">Silverlight
    						Accessibility Overview</loc> </p></item>
    				</ulist>
    			</see-also>
    		</resources>
    		<related-techniques>
    			<relatedtech idref="SCR28"/>
    			<relatedtech idref="G123"/>
    			<relatedtech idref="SL25"/>
    		</related-techniques>
    		<tests>
    			<procedure>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. </p></item><item><p> Press TAB key to traverse typical tab sequence within the Silverlight
    						application. Verify that common areas in the user interface composition
    						("blocks") that are reporting the List role per this technique
    						can be bypassed without having to tab through each constituent part
    						(the "items/children" of the List). </p></item><item><p> Verify that the list children are still accessible by keyboard,
    							by using ARROW keys rather than TAB. </p></item><item><p> Engage an accessibility framework test tool such as UIAVerify.
    								Examine roles in the automation tree, and verify that the List used
    								for bypass behavior reports a combination of name+role that is consistent
    								with the behavior. </p></item><item><p> Use a screen reader to verify that name and role are reported
    									properly. </p></item></olist>
    			</procedure>
    			<expected-results>
    				<p>#2 and #3 are true, and either #4 OR #5 are true. </p>
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href="http://trace.wisc.edu/wcag_wiki/index.php?title=Using_Silverlight_%22List%22_Controls_to_Define_Blocks_that_can_be_Bypassed"/></source>
    		</admin>
    	</technique>
    	<technique id="SL30">
    		<short-name>Using Silverlight Control Compositing and AutomationProperties.Name</short-name>
    		<applicability>
    			<p use-id="silverlight.applicability.general"/>
    		</applicability>
    		<applies-to>
    			<success-criterion idref="text-equiv-all"/>
    			<success-criterion idref="ensure-compat-rsv"/>
    		</applies-to>
    		<ua-issues>
    			<ua-issue use-id="silverlight.ua-issue.general"/>
    		</ua-issues>
    		<description>
    			<p>The objective of this technique is to properly apply Silverlight control
    				composition techniques that can present text and non-text in UI as
    				part of the same control. This technique explains the consequences
    				that using control composition has on how that control is reported
    				to the accessibility frameworks that Silverlight supports. </p>
    			<p>Silverlight control composition concepts are relevant either to Silverlight
    				developers who define and package a Silverlight control for use by
    				other Silverlight authors, or for Silverlight application authors that
    				use Silverlight controls in their UI but use the content properties
    				of such controls to include several other elements in a composite layout. </p>
    			<p>In Silverlight programming and UI definition, Silverlight authors can use control
    				composition to define a parent control that initiates an action. The
    				control can have component parts, such as text and non-text composition
    				pieces that display within the control and have equivalent meaning.
    				Silverlight authors can rely on the text component of the control to
    				provide any text alternative for purposes other than the accessibility
    				framework. However, Silverlight authors should declare alternative
    				text on the control that is specifically consumed by accessibility
    				frameworks, by setting <prop>AutomationProperties.Name</prop> as
    				an attribute in XAML. In most cases, this text can be the same as the
    				visible text in the control composition, per the definition of 'label'
    				in SC 4.1.2. </p>
    			<p>Note that this technique does not result in a duplication of text,
    				as explained in <loc href="H2" linktype="techniques">H2</loc>.
    				This is because the element parts of control composition are either
    				inherently not focusable separately, or can be specified by instance-specific
    				properties to behave as if they cannot be focused. The parts in Silverlight
    				composition are not promoted to the accessibility frameworks as parts
    				of an application-specific UI Automation tree, so that control composition
    				as an implementation detail does not interfere with the usage of controls
    				by Silverlight application authors. The primary source of accessibility-related
    				information is the specific <prop>AutomationProperties.Name</prop> property
    				as set on the parent control in the composition, which is set by the
    				application author rather than the control author. </p>
    			<p>The control author does specify the information that is reported to
    				accessibility frameworks as the "ClassName", which is often
    				used by assistive technologies for identification purposes and is appended
    				to any "Name" value. For example, if an application author
    				includes a   "Widget" control, and gives it an <prop>AutomationProperties.Name</prop> value
    				of "Show Map", an assistive technology might identify the
    				element as   "Show Map widget". The "Show Map" part
    				comes from the application author code, and the "widget" part
    				comes from the Widget control implementation code. </p>
    		</description>
    		<examples>
    			<eg-group>
    				<head>Button is composed with a StackPanel that contains nontext
    					and text content</head>
    				<description>
    					<p>In this example the <obj>TextBlock</obj> that goes with the
    						graphic image conveys the text information for non-accessibility purposes.
    						The <obj>Button</obj> has internal composition that combines
    						text from a non-focusable <obj>TextBlock</obj> part and an image
    						part. Therefore the "Pause" Text is not promoted to serve
    						as "Name" through built-in <obj>Button</obj> automation
    						peer logic. The Silverlight application author is responsible for explicitly
    						setting <prop>AutomationProperties.Name</prop> on the <obj>Button</obj> so
    						that the text equivalent is available to the accessibility framework.
    						This example shows the XAML UI. The logic, which might be attached
    						to <obj>Button</obj> with a <event>Click</event> handler, is
    						not shown. </p>
    					<codeblock><![CDATA[ <Button
   Height="20" Width="50" AutomationProperties.Name="Pause" 
 >
   <StackPanel Orientation="Horizontal" >
     <Image Height="12" Width="12" Source="/icon_pause.png"/>
     <TextBlock Text="Pause"/>
   </StackPanel>
 </Button>
]]></codeblock>
    					<p>This example is shown in operation in the <loc href="ButtonNontextTextCompositionTestPage.html" linktype="examples">working example of Button Nontext Text Composition</loc>.</p>
    				</description>
    			</eg-group>
    			<eg-group>
    				<head>Button composed, using binding and resource references
    				for strings</head>
    				<description>
    					<p>This example is similar to Example 1 and produces the same result
    						at run time. This example shows the preferred technique of using the
    						Silverlight data binding and resource features to ensure that the strings
    						for text content and accessibility are the same strings. Also, this
    						gets the strings out of the XAML source and makes them simpler to localize
    						or edit. For more information on using resource strings through binding,
    						see <loc href="http://msdn.microsoft.com/en-us/library/dd882554%28VS.95%29.aspx">Localizing
    						XAML topic on MSDN</loc>. </p>
    					<codeblock><![CDATA[ <Application.Resources>
  <resx:Resources x:Key="UIResourceStrings" />
 </Application.Resources>
  ...
 <Button
   Height="20" Width="50"
   AutomationProperties.Name="{Binding PauseUIString, Source=UIResourceStrings}" />
 >
   <StackPanel Orientation="Horizontal" >
     <Image Height="12" Width="12" Source="/icon_pause.png"/>
     <TextBlock
       Text="{Binding PauseUIString, Source=UIResourceStrings}"/>
   </StackPanel>
 </Button>
]]></codeblock>
    				</description>
    			</eg-group>
    		</examples>
    		<resources>
    			<see-also>
    				<ulist>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc645025%28VS.95%29.aspx">Silverlight
    					Layout System</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/system.windows.automation.automationproperties.name%28VS.95%29.aspx">AutomationProperties.Name
    					Attached Property</loc> </p></item>
    					<item><p>Tools: <loc href="http://firstfloorsoftware.com/silverlightspy/">SilverlightSpy</loc> or <loc href="http://uiautomationverify.codeplex.com/">UIAVerify</loc> </p></item>
    				</ulist>
    			</see-also>
    		</resources>
    		<related-techniques>
    			<relatedtech idref="SL18"/>
    			<relatedtech idref="H2"/>
    		</related-techniques>
    		<tests>
    			<head>Automation tree verifier</head>
    			<procedure>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. </p></item><item><p> Use a verification tool that is capable of showing the full automation
    						tree, and an object’s name text alternative as part of the tree.
    						(For example, use UIAVerify or Silverlight Spy; see Resources links.) </p></item><item><p> Check that the <prop>AutomationProperties.Name</prop> appears
    							as the <prop>Name</prop> value for identification in the automation
    							tree, whenever a composite control that has both text and non-text
    							elements is encountered. </p></item></olist>
    			</procedure>
    			<expected-results>
    				<p>#3 is true. </p>
    			</expected-results>
    		</tests>
    		<tests>
    			<head>Screen reader</head>
    			<procedure>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. </p></item><item><p> Engage the screen reader. With focus inside the Silverlight content
    						area, press TAB to focus to a composite control where both text and
    						non-text elements are present. </p></item><item><p> Check that the <prop>Name</prop> as applied to the control
    							instance, along with the class name of the control, is read by the
    							screen reader. </p></item></olist>
    			</procedure>
    			<expected-results>
    				<p>#3 is true. </p>
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href="http://trace.wisc.edu/wcag_wiki/index.php?title=Using_Silverlight_Control_Compositing_and_AutomationProperties.Name"/></source>
    		</admin>
    	</technique>
    	<technique id="SL31">
    		<short-name>Using Silverlight Font Properties to Control Text Presentation</short-name>
    		<applicability>
    			<p use-id="silverlight.applicability.general"/>
    		</applicability>
    		<applies-to>
    			<success-criterion idref="visual-audio-contrast-text-presentation"/>
    			<success-criterion idref="visual-audio-contrast-text-images"/>
    		</applies-to>
    		<ua-issues>
    			<ua-issue use-id="silverlight.ua-issue.general"/>
    		</ua-issues>
    		<description>
    			<p>The objective of this technique is to change the presentation / visual
    				appearance of text, by setting several of the font-specific properties
    				in the Silverlight API. Changing such properties does not change the
    				semantic meaning of the text, nor does it alter the representation
    				of the text that is available to assistive technologies through the
    				Silverlight support of the UIA accessibility framework. By using font
    				properties, it is possible to introduce a wide variety of presentation
    				changes to fonts that do not introduce semantic elements that interfere
    				with an assistive technology's view of text in the Silverlight application.
    				In particular, adjusting font properties will make it possible to avoid
    				any need for use of images of text, yet still provide a wide range
    				of choices for text presentation. </p>
    			<p>Silverlight font properties exist on all controls, as well as on other
    				text elements that are not true controls. For controls, the font properties
    				apply in any case where the control enables a presentation mode that
    				has enclosed text areas in its layout. By setting Silverlight font
    				properties, it is possible to adjust presentation of font features
    				without changing the structural connotation of that control, or the
    				value of any control-specific property that contains plain-text. For
    				example, the <prop>FontSize</prop> property can be set on a <obj>Paragraph</obj> (not
    				a control) or on a <obj>Button</obj> (a control, and in this
    				case the font size changes apply to any text displayed in the button
    				content area). Font properties are also inheriting properties, meaning
    				that if applying a font property value to a container in a relationship,
    				those font property values can apply to child elements in the relationship.
    				For example, if a <prop>FontSize</prop> is applied to a <obj>RichTextBox</obj>,
    				that <prop>FontSize</prop> value is used by default by all the <obj>Paragraph</obj> items
    				displayed in the <obj>RichTextBox</obj>. </p>
    			<p>Similar to CSS, Silverlight font properties can be grouped as a <obj>Style</obj>.
    				That <obj>Style</obj> can be applied to all instances of a text
    				element type (for example to all cases of <obj>Paragraph</obj>)
    				or specifically referenced as a resource that is only used by certain
    				instances of a text element type. Either way, the <obj>Style</obj> feature
    				enables the separation of presentation from semantics for text elements,
    				and enables workflows where content authors supply the semantic text
    				and design-oriented authors adjust the related Silverlight styles.
    				For more information on the Silverlight concept of styles, see <loc href="http://msdn.microsoft.com/en-us/library/cc278068%28VS.95%29.aspx">Control
    					Customization on MSDN</loc>. </p>
    			<p>The following Silverlight font properties are useful to style text
    				and avoid the need for text in images. Links in this list refer to
    				the <obj>Control</obj> class version of these properties. </p>
    			<ulist><item><p> The <loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.control.fontfamily%28VS.95%29.aspx">FontFamily</loc> property
    				is used to display the code aspect in a monospace font family (specifically,
    				FontFamily="Courier New"). </p></item>
    			<item><p> The <loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.control.fontsize%28VS.95%29.aspx">FontSize</loc> property
    				is used to display the text in a larger size. </p></item>
    			<item><p> The <loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.control.fontstyle%28VS.95%29.aspx">FontStyle</loc> property
    				is used to display text in italics. </p></item>
    				<item><p> The <loc href="http://msdn.microsoft.com/en-us/embedded/ee502142" diff="chg">FontWeight</loc> property
    				is used to set how thick or thin characters in text should be displayed. </p></item>
    				<item><p> The <loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.control.fontstretch.aspx" diff="chg">FontStretch</loc> property
    				is used to control the spacing of letters in text. </p></item>
    			<item><p> The <loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.control.foreground%28VS.95%29.aspx">Foreground</loc> property
    				is used to display the color of text or text containers. </p></item>
    			<item><p> The <loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.control.background%28VS.95%29.aspx">Background</loc> property
    			can be used to display text on a non-text background. </p></item>
    			</ulist>
    			<p>So long as images of text are avoided, the text within a Silverlight
    				text element can be reported to the UI Automation accessibility framework
    				that Silverlight supports. That text is reported using the same basic
    				text content as is used for semantic text display in the UI. In other
    				words, exposing that text to assistive technologies that use UIA as
    				a framework does not require the Silverlight application author to
    				resort to automation-specific override properties such as <prop>AutomationProperties.HelpText</prop>;
    				the automation peers for text elements report all necessary text content
    				to automation as a built-in behavior of the text element controls.
    				For more information on UI Automation and text containers, see <specref ref="SL32"/>. </p>
    			<section id="SL31_css">
    				<head> CSS versus Silverlight font properties </head>
    				<p>Related CSS techniques mention that users can override any page-declared
    					CSS styling techniques, by invoking browser-specific features. For
    					example, using Internet Explorer, a user can use Tools / Internet Options,
    					Appearance / Accessibility to override certain classifications of CSS-controlled
    					font properties when displaying HTML documents, or to use a user-specific
    					style sheet for HTML documents. No browser-level equivalent feature
    					exists for user alteration of Silverlight text properties in the Silverlight
    					content area. Instead, application authors could supply controls that
    					enable similar font-property changing behavior, and include those controls
    					in the application-specific user interface. For more information on
    					this technique, see <specref ref="SL13"/>. </p>
    			</section>
    			<section id="SL31_glyphs">
    				<head> Glyphs </head>
    				<p>Silverlight API includes a related text presentation API <obj>Glyphs</obj>. <obj>Glyphs</obj> is
    					intended for specific decorative or niche language-support scenarios.
    					The <obj>Glyphs</obj> API does not offer as much UIA exposure
    					or the ability to programmatically change typical font properties;
    					the main scenarios for <obj>Glyphs</obj> are to package migrated
    					text content from document formats, or for purely decorative text in
    					a font that is not commonly found on a user system and only the glyphs
    					actually used in the Unicode string are subsetted into the <obj>Glyphs</obj> font
    					payload. If addressing the WCAG criteria, authors should avoid using <obj>Glyphs</obj> API
    					and instead use other text containers such as <obj>TextBox</obj>,
    					along with a font that is supplied in the application package or known
    					to exist on the end user system. </p>
    			</section>
    		</description>
    		<examples>
    			<eg-group>
    				<head>Run time applied font properties, style, and template</head>
    				<description>
    					<p>This example illustrates applying runtime changes to a font property. </p>
    					<p>This example has UI in XAML, and logic in C#. The following is the
    					XAML. </p>
    					<codeblock><![CDATA[<UserControl x:Class="DocumentStructure.MainPage"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
   <UserControl.Resources>
       <Style x:Key="NewStyle" TargetType="Control">
           <Setter Property="FontFamily" Value="Arial"/>
           <Setter Property="FontSize" Value="30"/>
           <Setter Property="Height" Value="40"/>
       </Style>
   </UserControl.Resources>
   <StackPanel x:Name="LayoutRoot" Background="White">
   <RichTextBox IsReadOnly="True" Name="rtb" FontFamily="Algerian" FontSize="20">
           <Paragraph>Call me Ishmael. Some years ago--never mind how long precisely--having little or no money in my purse, 
           and nothing particular to interest me on shore, I thought I would sail about a little 
and see the watery part of the world. It is a way I have of driving off the spleen and 
regulating the circulation. Whenever I find myself growing grim about the mouth; whenever 
it is a damp, drizzly November in my soul; whenever I find myself involuntarily pausing before 
coffin warehouses, and bringing up the rear of every funeral I meet; and especially whenever my 
<Hyperlink NavigateUri="http://en.wiktionary.org/wiki/hypo">hypos</Hyperlink>
get such an upper hand of me, that it requires a strong moral principle to prevent me from deliberately stepping into 
the street, and methodically knocking people's hats off--then, I account it high time to get to sea as soon as I can. 
This is my substitute for pistol and ball. With a philosophical flourish Cato throws himself 
upon his sword; I quietly take to the ship. There is nothing surprising in this. If they but knew it, 
almost all men in their degree, some time or other, cherish very nearly the same 
feelings towards the ocean with me.
           </Paragraph>
           <Paragraph>There now is your
               <Hyperlink 
               NavigateUri="http://en.wikipedia.org/wiki/New_York_Harbor">insular city of the Manhattoes</Hyperlink>
, belted round by wharves as Indian isles by coral reefs--commerce surrounds it 
with her surf. Right and left, the streets take you waterward. Its extreme downtown is the 
battery, where that noble mole is washed by waves, and cooled by breezes, which a few hours 
previous were out of sight of land. Look at the crowds of water-gazers there.
           </Paragraph>
           <Paragraph>Circumambulate the city of a dreamy Sabbath afternoon. 
Go from Corlears Hook to Coenties Slip, and from thence, by Whitehall, northward. What do you see?
--Posted like silent sentinels all around the town, stand thousands upon thousands of mortal men 
fixed in ocean reveries. Some leaning against the spiles; some seated upon the pier-heads; 
some looking over the bulwarks of ships from China; some high aloft in the rigging, as if striving 
to get a still better seaward peep. But these are all landsmen; of week days pent up in lath 
and plaster--tied to counters, nailed to benches, clinched to desks. How 
then is this? Are the green fields gone? What do they here?
           </Paragraph>
       </RichTextBox>
       <Button Name="swapper" Click="swapper_Click" Width="220">Swap styles</Button>
   </StackPanel>
</UserControl>
]]></codeblock>
    					<p>The following is C# code: </p>
    					<codeblock><![CDATA[       private void swapper_Click(object sender, RoutedEventArgs e)
       {
           rtb.Style = this.Resources["NewStyle"] as Style;
       }
]]></codeblock>
    					<p>This example is shown in operation in the <loc href="DocumentStructureTestPage.html" linktype="examples">working example of Document Structure</loc>.</p>
    				</description>
    			</eg-group>
    		</examples>
    		<resources>
    			<see-also>
    				<ulist>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/ee681613%28VS.95%29.aspx">RichTextBox
    					Overview</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc278068%28VS.95%29.aspx">Control
    						Customization</loc> </p></item>
    				</ulist>
    			</see-also>
    		</resources>
    		<related-techniques>
    			<relatedtech idref="G140"/>
    			<relatedtech idref="C22"/>
    		</related-techniques>
    		<tests>
    			<procedure>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. </p></item><item><p> Test that application of font properties as enabled in application
    						UI changes presentation, but does not change semantic meaning of
    						text. </p></item><item><p> Close the browser. Repeat the test with an accessibility framework
    							test tool running. There should be no difference in the structure
    							or relationships in the accessibility view beyond the presentation
    							changes. </p></item></olist>
    			</procedure>
    			<expected-results>
    				<p>#2 and #3 are true. </p>
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href="http://trace.wisc.edu/wcag_wiki/index.php?title=Using_Silverlight_Font_Properties_to_Control_Text_Presentation"/></source>
    		</admin>
    	</technique>
    	<technique id="SL32">
    		<short-name>Using Silverlight Text Elements for Appropriate Accessibility Role</short-name>
    		<applicability>
    			<p use-id="silverlight.applicability.general"/>
    		</applicability>
    		<applies-to>
    			<success-criterion idref="ensure-compat-rsv"/>
    		</applies-to>
    		<ua-issues>
    			<ua-issue use-id="silverlight.ua-issue.general"/>
    			<ua-issue><p>JAWS version 12 misreports a read-only <obj>RichTextBox</obj> as   "edit",
    				despite it reporting its role as "document" to both UIA and
    				MSAA. Text is still read by JAWS 12, but users might expect that they
    				would be able to enter text in an element that JAWS 12 reports as edit,
    				whereas in fact they cannot enter text. </p></ua-issue>
    		</ua-issues>
    		<description>
    			<p>The objective of this technique is to choose a Silverlight text container
    				that provides appropriate behavior and accessibility roles for different
    				types of text content. How those roles interact with existing assistive
    				technologies that are interpreting Silverlight under the larger concept
    				of being an "HTML control part" is also a factor in which
    				Silverlight text container should be used in an application's composition. </p>
    			<p>Text containers can identified by role to accessibility frameworks,
    				and each type of Silverlight text container uses a different role.
    				Application authors should choose text containers that combine the
    				desired behavior in the user interface with an accessibility role that
    				can be consumed by existing assistive technology implementations. </p>
    			<p>The Silverlight core libraries define the following classes that are
    				specifically intended as text containers: </p>
    			<ulist><item><p> <loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.richtextbox%28VS.95%29.aspx">RichTextBox</loc> </p></item><item><p> <loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.textbox%28VS.95%29.aspx">TextBox</loc> </p></item><item><p> <loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.textblock%28VS.95%29.aspx">TextBlock</loc> </p></item></ulist>
    			<section id="SL32_programmatic">
    				<head> UI Automation programmatic access </head>
    				<p>For programming information that is relevant for how Silverlight application
    					authors produce the application, each text container has its own object
    					model/API. That API is documented on MSDN, specifically for each class <loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.textbox%28VS.95%29.aspx">TextBox</loc>; <loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.richtextbox%28VS.95%29.aspx">RichTextBox</loc>; <loc href="http://msdn.microsoft.com/en-us/library/system.windows.controls.textblock%28VS.95%29.aspx">TextBlock</loc>.)
    					However, rather than using the Silverlight-specific object models,
    					most assistive technologies that are capable of reporting on Silverlight
    					will choose to use UI Automation (or MSAA) to obtain information about
    					the Silverlight elements in general. Text containers within the Silverlight
    					content are identified through UIA accessibility roles. This is because
    					the assistive technologies can use UI Automation to query for ANY relevant
    					text items from the content (and chrome) of the user agent / browser
    					host, not just those that come from Silverlight. That can include the
    					HTML content, items created from scripting, CSS or other plugin-internal
    					object models and so on. In other words, text from Silverlight is integrated
    					into the overall UI Automation view of the user agent host as the top-level
    					application in a platform view. Different types of "text" in
    					a general sense might appear as different UI Automation patterns, as
    					is described below. </p>
    			</section>
    			<section id="SL32_textbox">
    				<head> TextBox </head>
    				<p>A <obj>TextBox</obj> within the Silverlight content area is
    					reported to UI Automation as an Edit role (through MSAA, as Editable
    					Text). </p>
    				<p>Edit controls are expected to implement the <loc href="http://msdn.microsoft.com/en-us/library/system.windows.automation.provider.ivalueprovider%28VS.95%29.aspx">Value
    					pattern</loc> for UIA, so that the value of the edit area can be queried
    					or set by a client. Assistive technologies can use this value as
    					a text-string value for screen readers or other purposes. </p>
    				<p>In typical user interface design, a form with an input field also
    					includes a label or other explanatory text that is proximally close
    					to the input field. In order to maintain proper reading order, the
    					label should typically appear immediately before the input field. This
    					general model should also be used for Silverlight user interface design.
    					For more information on labeling for <obj>TextBox</obj> controls,
    					see <specref ref="SL26"/>. </p>
    			</section>
    			<section id="SL32_richtextbox">
    				<head> RichTextBox </head>
    				<p>A <obj>RichTextBox</obj> within the Silverlight content area
    					is reported to UI Automation and MSAA as a Document role. </p>
    				<p>A <obj>RichTextBox</obj> can either be set to be a read-only
    					control, or left as a read-write control. In the latter case, users
    					can insert a text cursor and make changes to the text. It is more common
    					in Silverlight programming to set the <obj>RichTextBox</obj> to
    					be read-only; in this scenario the reason for using <obj>RichTextBox</obj> is
    					because <obj>TextBlock</obj> did not offer the range of text
    					formatting options that are possible from a <obj>RichTextBox</obj>. </p>
    				<p>In UIA, a document is generally expected to support the <loc href="http://msdn.microsoft.com/en-us/library/system.windows.automation.provider.itextprovider%28VS.95%29.aspx">Text
    					pattern</loc> for UI Automation. However, to read the text from a <obj>RichTextBox</obj>,
    					the assistive technology does not necessarily have to implement code
    					that handles the entirety of the information that the Text pattern
    					reports. </p>
    			</section>
    			<section id="SL32_text-pattern">
    				<head> More about the Text pattern </head>
    				<p>The Text pattern provides APIs to iterate over the internal structure
    					of a document and return text ranges. Each such text range can be queried
    					for specific properties, and can return its plain text string value
    					to UI Automation. Ranges can also be programmatically adjusted by the <obj>TextPattern</obj>/<obj>TextRange</obj> APIs.
    					The following is a snippet of a Silverlight-specific UI Automation
    					tree utility to give a general idea of the APIs involved. Note that
    					these are not specifically Silverlight APIs; they are .NET Framework
    					APIs. .NET Framework or Windows Automation APIs are generally what
    					is used for programming a UI Automation client, which runs on a platform
    					runtime rather than the Silverlight runtime. Using the Text pattern
    					is generally what is necessary in order for an assistive technology
    					to obtain a comprehensive view of the "value" for a document
    					role object. </p>
    				<codeblock><![CDATA[private void FindTheTextPatterns_Click(object sender, RoutedEventArgs e)
{
   if (allSilverlight != null && allSilverlight.Count>0)
   {
       //for simplicity just processing item 0, not assuming more than one SL control
       //on the page because this app controls the page being loaded
       AutomationElementCollection documentsList = allSilverlight[0].FindAll(TreeScope.Descendants,
           new PropertyCondition(AutomationElement.ControlTypeProperty,ControlType.Document)
   );
   for (int j=0; j< documentsList.Count;j++) {
       TextPattern targetTextPattern = 
         documentsList[j].GetCurrentPattern(TextPattern.Pattern) as TextPattern;
       if (targetTextPattern!=null) {
           TextPatternRange tr = targetTextPattern.DocumentRange;
           MessageBox.Show(tr.GetText(Int16.MaxValue));
       }
   }
}
private void GetAllSilverlight()
{
   allSilverlight = this._clientAppRootInstance.FindAll(TreeScope.Descendants,
      new PropertyCondition(AutomationElement.ClassNameProperty, "MicrosoftSilverlight"));
}
]]></codeblock>
    				<p>MSAA has only limited possibilities for interacting with a Document
    				role, and MSAA code for attempting to do so is not shown. </p>
    			</section>
    			<section id="SL32_textblock">
    				<head> TextBlock </head>
    				<p><obj>TextBlock</obj> is reported as a Text role in UI Automation. <obj>TextBlock</obj> has
    					several important characteristics: </p>
    				<ulist><item><p> A <obj>TextBlock</obj> is always read-only; only the application
    					author can declare the text, users cannot change it. </p></item><item><p> A <obj>TextBlock</obj> is not considered to be a true control
    						in the Silverlight object model (it is not a class derived from <obj>Control</obj>).
    						The practical implications of this to accessibility scenarios is
    						that a <obj>TextBlock</obj> is not in the default tab sequence,
    						cannot be manually added to any tab sequence, and cannot be keyboard-focused
    						either programatically or by the user. </p></item><item><p> <obj>TextBlock</obj> has a deliberately limited range of
    							block / span formatting options. If the application author desires
    							a wider range of formatting options, for example supporting a "Paragraph" metaphor
    							for blocks of text, a read-only <obj>RichTextBox</obj> should
    							be used instead. </p></item></ulist>
    				<p>If the user relies solely on navigating a Silverlight application
    					using the TAB sequence, such navigation will skip over any <obj>TextBlock</obj> in
    					the interface. This could have implications for how users who use screen
    					readers can interact with the Silverlight content. Screen readers typically
    					read text only from the currently focused element in cases where the
    					user is moving through the TAB sequence or changing focus within the
    					application, and thus cannot read the text from a <obj>TextBlock</obj> in
    					such a mode. However, most screen readers also have modes for reading
    					text that is not necessarily focusable. These are generally the same
    					modes that screen readers use for a conventional non-interactive HTML
    					document text. For example, some screen readers support a mode that
    					reads text by line, or by word. These modes can read text from a <obj>TextBlock</obj>. </p>
    			</section>
    		</description>
    		<examples>
    			<eg-group>
    				<head>Structure from a container that has non-semantic role
    					in UI Automation, and TextBlock for text</head>
    				<description>
    					<p>If viewed as a UI Automation tree, the <obj>StackPanel</obj> and <obj>Grid</obj> do
    						not exist explicitly in the tree view, because they do not serve a
    						semantic role (only a presentation role). Rather, the tree consists
    						of the items that report some kind of semantic control type. The semantic
    						children of the containers are still reported in the order that they
    						were declared, when viewed as children of the next semantic container
    						upwards in the tree, and despite the containers themselves being abstracted
    						out of the tree. This defines the reading order. This example is a
    						large block of text with intentionally simple formatting, where the
    						only formatting is to represent paragraphs as separate <obj>TextBlock</obj> elements
    						to support an adaptive layout, but no <obj>Run</obj> blocks within. </p>
    					<p>When viewed with assistive technologies that represent the contents,
    						each <obj>TextBlock</obj> is a control type of Text. Screen readers
    						can use document reading modes such as virtual cursor modes to read
    						the content from each element and each element's content, following
    						the same reading order as is declared in the XAML. For example, in
    						JAWS 12, readers can read out this text container line by line using
    						(Jaws Key)+DownArrow. It is actually JAWS that determines the line
    						length, because the line length otherwise is defined only by the adaptive
    						layout at runtime, which is not reported to UIA. </p>
    					<codeblock><![CDATA[  <StackPanel x:Name="LayoutRoot" Background="White">
          <TextBlock>Call me Ishmael. Some years ago--never mind how long precisely--
having little or no money in my purse, and
nothing particular to interest me on shore, I thought I would sail about a little 
and see the watery part of the world. It is a way I have of driving off the spleen 
and regulating the circulation. Whenever I find 
myself growing grim about the mouth; whenever it is a damp, drizzly November in 
my soul; whenever I find myself involuntarily pausing before coffin warehouses, 
and bringing up the rear of every funeral I meet;
and especially whenever my hypos get such an upper hand of me, that it requires a strong moral 
principle to prevent me from
deliberately stepping into the street, and methodically knocking people's hats off--then, 
I account it high time to get to sea as
soon as I can. This is my substitute for pistol and ball. With a philosophical flourish Cato 
throws himself 
upon his sword; I quietly take to the ship. There is nothing surprising in this. If they but knew it, 
almost all men in their degree, some time or other, cherish very nearly the same feelings towards the 
ocean with me.
          </TextBlock>
          <TextBlock>There now is your insular city of the Manhattoes, belted round by wharves as Indian isles 
          by coral reefs--
commerce surrounds it with her surf. Right and left, the streets take you waterward. 
Its extreme downtown is the battery, where
that noble mole is washed by waves, and cooled by breezes, which a few hours previous 
were out of sight of land. Look at the crowds of water-gazers there.
          </TextBlock>
          <TextBlock>Circumambulate the city of a dreamy Sabbath afternoon. Go from Corlears Hook 
          to Coenties Slip, and from thence, by Whitehall, northward.
What do you see?--Posted like silent sentinels all around the town, stand thousands 
upon thousands of mortal men fixed in ocean
reveries. Some leaning against the spiles; some seated upon the pier-heads; 
some looking over the bulwarks of ships from China; 
some high aloft in the rigging, as if striving to get a still better seaward peep. 
But these are all landsmen; of week days pent
up in lath and plaster--tied to counters, nailed to benches, clinched to desks. 
How  then is this? Are the green fields gone? What do they here?
          </TextBlock>
  </StackPanel>
]]></codeblock>
    				</description>
    			</eg-group>
    			<eg-group>
    				<head>Text containers and their UIA representation</head>
    				<description>
    					<p>The following example is intended as sample XAML to view in an accessibility
    						framework viewer, to see the various names, roles, and patterns for
    						obtaining value. </p>
    					<codeblock><![CDATA[   <StackPanel x:Name="LayoutRoot">
       <TextBox Text="This is a TextBox"/>
       <RichTextBox>
           <Paragraph>This is a RichTextBox.</Paragraph>
       </RichTextBox>
       <TextBlock Text="This is a TextBlock"/>
   </StackPanel>
]]></codeblock>
    				</description>
    			</eg-group>
    		</examples>
    		<resources>
    			<see-also>
    				<ulist>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc645025%28VS.95%29.aspx">Silverlight
    					Layout System</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc707824%28VS.95%29.aspx">Silverlight
    					Accessibility Overview</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc189034%28VS.95%29.aspx">Silverlight
    					Object Trees</loc> </p></item>
    					<item><p>Tools: <loc href="http://firstfloorsoftware.com/silverlightspy/">SilverlightSpy</loc> or <loc href="http://uiautomationverify.codeplex.com/">UIAVerify</loc> </p></item>
    				</ulist>
    			</see-also>
    		</resources>
    		<related-techniques>
    			<relatedtech idref="G115"/>
    			<relatedtech idref="G135"/>
    			<relatedtech idref="G10"/>
    		</related-techniques>
    		<tests>
    			<procedure>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. To see
    					UI Automation, use Microsoft Windows as platform. </p></item><item><p> Use a verification tool that is capable of showing the full automation
    						tree. (For example, use UIAVerify or Silverlight Spy; see Resources
    						links.) </p></item><item><p> Verify that <obj>TextBox</obj> elements in the Silverlight
    							user interface have the Edit role, that <obj>RichTextBox</obj> elements
    							have the Document role, and <obj>TextBlock</obj> has Text role
    							in UI Automation. </p></item><item><p> Verify that the text content can be programmatically determined
    								by techniques that are appropriate for that role. </p></item></olist>
    			</procedure>
    			<expected-results>
    				<p>#3 and #4 are true. </p>
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href="http://trace.wisc.edu/wcag_wiki/index.php?title=Using_Silverlight_Text_Elements_for_Appropriate_Accessibility_Role"/></source>
    		</admin>
    	</technique>
    	<technique id="SL33">
    		<short-name>Using Well-Formed XAML to Define a Silverlight User Interface</short-name>
    		<applicability>
    			<p use-id="silverlight.applicability.general"/>
    		</applicability>
    		<applies-to>
    			<success-criterion idref="ensure-compat-parses"/>
    		</applies-to>
    		<ua-issues>
    			<ua-issue use-id="silverlight.ua-issue.general"/>
    		</ua-issues>
    		<description>
    			<p>The objective of this technique is to use the characteristics of the
    				XAML language to support basic parsing requirements that both applications
    				and accessibility frameworks rely upon. This technique explains the
    				role of XAML in the overall Silverlight development and application
    				architecture, in particular for defining the elements that make up
    				a Silverlight user interface. This technique also present some basic
    				facts about XAML as a language; more information of this nature is
    				also included in <specref ref="silverlight_notes"/>. </p>
    			<p>XAML is a markup language for object instantiation. XAML can be incorporated
    				into a technology such as Silverlight. A specific XAML vocabulary can
    				be defined by a technology such as Silverlight, and the vocabulary
    				can be extended by anyone that provides suitable backing code. For
    				example, a Silverlight application author can define a custom class,
    				and the application author or potentially other Silverlight application
    				authors can use XAML to instantiate instances of the custom class. </p>
    			<p>XAML has a <loc href="http://go.microsoft.com/fwlink/?LinkId=114525">published
    				language specification</loc>. </p>
    			<p>XAML does not necessarily declare the entirety of the object tree
    				that a Silverlight client runtime loads, but XAML typically declares
    				the majority of the objects/elements that represent the Silverlight
    				application's user interface. The objects and values that are used
    				for accessibility scenarios are often closely related to the standard
    				user interface, and thus accessibility-related properties are typically
    				declared in XAML rather than in code, even though setting the values
    				in code is technically possible. </p>
    			<p>For more information on XAML in Silverlight, see <loc href="http://msdn.microsoft.com/en-us/library/cc189036%28VS.95%29.aspx">Silverlight
    			XAML Overview on MSDN</loc>. </p>
    			<section id="SL33_xaml-xml">
    				<head> XAML and XML </head>
    				<p>XAML is based on XML, and shares many of its language features. Some
    					of the language features that are directly relevant to the stated intent
    					of SC4.1.1 and to 4.1.1 related techniques include: </p>
    				<ulist><item><p> Well-formedness: The definition of well-formed XAML is the same
    					as the XML definition. XAML processors, including the Silverlight
    					runtime XAML parser, will block loading XAML that is not well formed. </p></item><item><p> Duplicate attributes: Unless specially configured for scenarios
    						such as design-time support, XAML processors will block loading XAML
    						where elements contain duplicate attributes. </p></item><item><p> Quote matching: mismatched quote matching for attribute values
    							in XAML constitutes XAML that is not well formed. </p></item></ulist>
    				<p>Some XAML language features that are analogous to XML but have some
    					technology-specific differences include: </p>
    				<ulist><item><p> Identifiers: XAML defines a <prop>Name</prop> directive, which
    					is analogous to <att>xml:id</att> in that <prop>Name</prop> serves
    					as the unique identifier of an element. However, XAML defines an
    					additional concept of a XAML namescope, which permits a XAML document
    					to contain multiple XAML namescopes as a factoring technique. Thus,
    					identical <prop>Name</prop> values are permitted in a XAML document
    					so long as each is defined in a separate XAML namescope. XAML namescopes
    					are associated with elements, such that the extent of each XAML namescope
    					is understood by XAML processors. </p></item><item><p> Schemas and vocabularies: A notable difference between XAML and
    						XML is that a XAML vocabulary is not typically represented in existing
    						XML schema definition formats such as XSD or DTD. XAML includes inheritance
    						and reference features that cannot adequately be expressed in XSD
    						or other existing XML schema representation formats. This affects
    						the "elements are nested according to their specifications"   consideration
    						of SC4.1.1. XAML definitely has the ability to enforce nesting restrictions
    						as represented by a XAML vocabulary. However, XAML validity for a
    						vocabulary is deliberately fluid, in order to support extension by
    						user code. XAML validity is determined by a combination of a XAML
    						processor, a XAML concept known as a XAML schema context, and the
    						code that backs the XAML and defines any objects being instantiated
    						as a parsing result. Typically, design time tools such as Microsoft
    						Visual Studio can adequately duplicate the runtime validity characteristics
    						of a XAML vocabulary. Using these tools, application authors can
    						both verify XAML validity as well as receive design-time information
    						for how to correct any XAML validity errors. </p></item></ulist>
    			</section>
    			<section id="SL33_xaml-html">
    				<head> XAML parsing and HTML parsing </head>
    				<p>In the Silverlight implementation, XAML is like HTML in that it is
    					loaded and parsed just-in-time. Silverlight XAML is not precompiled
    					to binary or MSIL (the language-neutral CLR runtime format). Instead,Silverlight
    					XAML is transmitted or stored as plain text, either loose or packaged
    					as resources in a library. Thus Silverlight XAML is human readable
    					as well as machine readable. </p>
    				<p>However, unlike HTML, Silverlight XAML is only intended to be loaded
    					and interpreted by the Silverlight runtime, rather than multiple possible
    					user agents that each implement an HTML engine. HTML is a language
    					where the behavior is also specified. In contrast, XAML is a language
    					for referencing constructs that are defined in runtime libraries, and
    					the functional specification of the XAML language itself is minimal
    					(intrinsics; language rules; primitive types). Layout, appearance,
    					type-member sets, roles, etc. are all left up to specific frameworks
    					and vocabularies that use XAML. Behavior associated with a given XAML
    					construct is based on type definitions made in a runtime library. For
    					Silverlight XAML, the types are from Silverlight core libraries, but
    					often the definitions come from libraries that are available to the
    					Silverlight runtime as part of an application's packaging for distribution. </p>
    				<p>XAML is generally speaking strict, and will raise parsing errors if
    					XAML contains elements that are not recognized. Such parsing errors
    					generally present the information in the XAML from resulting in any
    					objects being created, which in turn prevents a Silverlight application
    					from running. This is different from typical (non-xHTML) HTML, where
    					implementations are permitted to contain nonrecognized elements or
    					attributes and ignore them. </p>
    			</section>
    		</description>
    		<examples>
    			<eg-group>
    				<head>XAML in design tools for Silverlight</head>
    				<description>
    					<p>A developer utilizes features in their Silverlight XAML authoring
    						tool to ensure that: </p>
    					<ulist><item><p> XAML is well formed </p></item><item><p> XAML is valid according to Silverlight parser and all reference
    					assemblies </p></item><item><p> XAML Names are unique in namescope </p></item><item><p> XAML has no duplicate attributes </p></item></ulist>
    					<section id="SL33_design-tools">
    						<head> More about design tools and XAML </head>
    						<p>Silverlight XAML is able to be loaded by design tools for Silverlight.
    							In the design tool, the XAML is interpreted much like the runtime interprets
    							it, in order to show the visual representation of the Silverlight application.
    							In addition, the design tool might implement design surfaces in which
    							the user interface can be changed, and typically provides a way to
    							save any changes made in the tool back into the loaded XAML. </p>
    						<p>At design time, tools such as Microsoft Visual Studio or Microsoft
    							Expression might provide opportunities to correct any XAML errors before
    							the Silverlight application is compiled and packaged for deployment.
    							This might be implemented by performing static analysis of the XAML,
    							by forwarding the design tool's own parser errors as it renders the
    							design surface, or by forwarding linking errors that are identified
    							by a precompile step (for example, missing event handlers raise a XAML
    							error from precompile). This behavior is sometimes identified as a <emph>design
    								mode</emph> behavior in Microsoft documentation and other documentation
    							about Visual Studio or specific tools. </p>
    						<p>Regardless of how a given XAML file behaves while being interacted
    							with in a design mode, it is the Silverlight runtime XAML parser on
    							each client installation that is the ultimate determinant of whether
    							the XAML is valid or invalid. </p>
    					</section>
    				</description>
    			</eg-group>
    			<eg-group>
    				<head>Silverlight application consumer</head>
    				<description>
    					<p>A consumer views a Silverlight application that is hosted in an HTML
    						page. If the Silverlight application has valid XAML, the Silverlight
    						content loads, and the fact that the XAML-based UI loaded at all is
    						assurance that: </p>
    					<ulist><item><p> XAML is well formed </p></item><item><p> XAML is valid </p></item><item><p> XAML validity is partially based on correct type mapping of all
    						elements referenced in XAML, according to Silverlight XAML parser
    						and all reference assemblies included by that application </p></item><item><p> XAML Names are unique in namescope </p></item><item><p> XAML has no duplicate attributes </p></item><item><p> XAML-defined properties that are relevant for assistive technology
    							(for example <prop>AutomationProperties.Name</prop> as described
    							by other Silverlight techniques) are available </p></item></ulist>
    				</description>
    			</eg-group>
    		</examples>
    		<resources>
    			<see-also>
    				<ulist>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc189036%28VS.95%29.aspx">Silverlight
    						XAML Overview on MSDN</loc> </p></item>
    				</ulist>
    			</see-also>
    		</resources>
    		<related-techniques>
    			<relatedtech idref="G192"/>
    		</related-techniques>
    		<tests>
    			<head>Pass case</head>
    			<procedure>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. That
    					application is known to consume Silverlight XAML. </p></item><item><p> Verify that the application runs correctly and displays user interface. </p></item></olist>
    			</procedure>
    			<expected-results>
    				<p>#2 is true. </p>
    			</expected-results>
    		</tests>
    		<tests>
    			<head>Fail case</head>
    			<procedure>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. That
    					application is known to consume Silverlight XAML, and the XAML is
    					known to be deliberately invalid. </p></item><item><p> Verify that the application did not run. </p></item></olist>
    			</procedure>
    			<expected-results>
    				<olist><item><p>#2 is true. </p></item></olist>
    				<p>Note that it is common that an error message is displayed to users
    					in HTML, which is implemented by handling the JavaScript OnError event
    					emitted by the Silverlight plugin. XAML parse errors are forwarded
    					to JavaScript errors and can be handled in this way. However, it is
    					also possible that the application is production-ready, and deliberately
    					does not expose any JavaScript errors, whether Silverlight managed
    					code errors or not. If seeing the specific error is important, the
    					test might need to be run against a preproduction or debug version
    					of the application. </p>
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href="http://trace.wisc.edu/wcag_wiki/index.php?title=Using_Well-Formed_XAML_to_Define_a_Silverlight_User_Interface"/></source>
    		</admin>
    	</technique>
    	<technique id="SL34">
    		<short-name>Using the Silverlight Default Tab Sequence and Altering Tab Sequences
    			With Properties</short-name>
    		<applicability>
    			<p use-id="silverlight.applicability.general"/>
    		</applicability>
    		<applies-to>
    			<success-criterion idref="content-structure-separation-sequence"/>
    			<success-criterion idref="navigation-mechanisms-focus-order"/>
    		</applies-to>
    		<ua-issues>
    			<ua-issue use-id="silverlight.ua-issue.general"/>
    		</ua-issues>
    		<description>
    			<p>The objective of this technique is to use the default Silverlight
    				tab sequence, or alternatively to apply the options that Silverlight
    				application authors can use for altering the tab sequence. Application
    				authors might alter the tab sequence in cases where the default tab
    				sequence is not desirable for some reason, and those reasons might
    				vary per application or application scenario. The tab sequence can
    				be altered in order to create a meaningful sequence in the tab order,
    				so that assistive technologies that rely on traversal of focusable
    				elements can use and determine the meaningful sequence. </p>
    			<p>Silverlight uses structured definitions for defining its user interface
    				presentations, where the declaration order is significant because it
    				becomes the structure of the run-time visual tree. The structured definitions
    				also define the layout and presentation structure in most cases. The
    				structured definition concept is described in more detail in <specref ref="silverlight_notes"/>. </p>
    			<p>The Silverlight development platform attempts to create an overall
    				system where the logical order of how elements are defined in XAML
    				and code, and then presented in a user interface, will also match a
    				logical tab sequence and logical reading order when presented to the
    				user. In many cases, a Silverlight application author can write an
    				application without necessarily worrying about the tab sequence, can
    				test the tab sequence during a verification and testing phase of development,
    				and will not need to set any specific properties to adjust the tab
    				sequence. As a broad generalization, a Silverlight tab sequence will
    				be constructed so that it traverses elements left to right, and top
    				to bottom, and will behave similarly to how HTML would behave if the
    				HTML analogs of Silverlight elements were constructed and presented
    				in the same way. However, there are specific Silverlight controls that
    				deliberately alter the tab sequence, or whose elements are made keyboard-accessible
    				through a keyboard navigation technique other than TAB. For more information,
    				see <loc href="http://msdn.microsoft.com/en-us/library/cc903954%28VS.95%29.aspx">Focus
    				Overview on MSDN</loc>. </p>
    			<section id="SL34_tab-sequence">
    				<head> How Silverlight implements tab sequence concepts </head>
    				<p>The Silverlight programming model defines a <obj>Control</obj> class
    					that is a base class of many of the practical controls that produce
    					a Silverlight application user interface. One of the behaviors of the <obj>Control</obj> class
    					is that only a <obj>Control</obj> can receive keyboard focus
    					as a discrete element within the Silverlight content area. </p>
    				<p>When a Silverlight application user interface is constructed from
    					the visual tree, a default tab sequence for all Silverlight content
    					is also constructed, using the same principles of order that were used
    					by the visible layout. This default tab sequence is usually adequate
    					as a tab sequence that supports users that press the TAB key to traverse
    					the UI. The same TAB sequence and/or the focusable state of controls
    					is also used by many assistive technologies or modes of assistive technologies
    					to construct the representation of the interface for the Silverlight
    					content. </p>
    				<p>For cases where developers decide that the default tab sequence is
    					not adequate, the developer can take one of two approaches for changing
    					the tab sequence: </p>
    				<ulist><item><p> Change other properties of the control where a change to the tab
    				sequence happens as a secondary effect. </p></item><item><p> Reorder the tab sequence directly. </p></item></ulist>
    			</section>
    			<section id="SL34_control-properties">
    				<head> Changing control properties </head>
    				<ulist><item><p> Setting the <prop>Visibility</prop> property of a control
    					to <prop>Collapsed</prop> causes the control to no longer render
    					in the UI. As a secondary effect, that control is removed from the
    					tab sequence. </p></item><item><p> Setting the <prop>IsEnabled</prop> property of a control to
    						false causes the control to no longer be focusable by keyboard or
    						clickable by the mouse. In many cases, the visual appearance of the
    						control changes also, through a theme style. For example, the control
    						may appear as gray rather than black. As a secondary effect, that
    						control is removed from the tab sequence. </p></item></ulist>
    			</section>
    			<section id="SL34_tab-properties">
    				<head> Changing specific tab properties </head>
    				<ulist><item><p> Setting the <prop>IsTabStop</prop> property of a control to
    					false causes the control to no longer be focusable by keyboard or
    					programmatic focus, and that control is removed from the tab sequence. </p></item><item><p> Setting the <prop>TabIndex</prop> property of a control to
    						a specific index causes the control to be inserted at that position
    						in the tab sequence. The default value of <prop>TabIndex</prop> is
    						Single.MaxValue, therefore any non-default value promotes that control
    						to be first in an otherwise default tab sequence. More typically,
    						authors would specify a <prop>TabIndex</prop> for any controls
    						that are involved in a deliberate segment of tab order re-ordering. </p></item></ulist>
    			</section>
    			<section id="SL34_tab-order">
    				<head> Tab order and language </head>
    				<p>Left-to-right is the default only for languages that use left-to-right
    					reading order. For languages that use right-to-left reading order,
    					right-to-left is also the default tab order as implemented by Silverlight
    					runtime behavior. That language preference is declared by the acting <obj>CultureInfo</obj>.
    					For more information on <obj>CultureInfo</obj>, see <specref  ref="SL27"/>. </p>
    			</section>
    		</description>
    		<examples>
    			<eg-group>
    				<head>Default tab order, based on ordering in the StackPanel</head>
    				<description>
    					<p>In this example, a <obj>StackPanel</obj> has a natural layout
    						order of top-to-bottom, and that will also be the tab order of each <obj>StackPanel</obj> child
    						element (FirstName, then LastName). </p>
    					<codeblock><![CDATA[   <StackPanel x:Name="LayoutRoot" Background="White">
       <StackPanel Orientation="Horizontal">
           <TextBlock Name="lbl_FirstName">First name</TextBlock>
           <TextBox AutomationProperties.LabeledBy="{Binding ElementName=lbl_FirstName}" Name="tbFirstName" Width="100"/>
       </StackPanel>
       <StackPanel Orientation="Horizontal">
           <TextBlock Name="lbl_LastName">First name</TextBlock>
           <TextBox AutomationProperties.LabeledBy="{Binding ElementName=lbl_LastName}" Name="tbLastName" Width="100"/>
       </StackPanel>
   </StackPanel>
]]></codeblock>
    					<p>This example is shown in operation in the <loc href="TabSequenceTestPage.html" linktype="examples">working example of Tab Sequence</loc>.</p>
    				</description>
    			</eg-group>
    			<eg-group>
    				<head>Tab order, modified by TabIndex</head>
    				<description>
    					<p>A form is marked up using a data table that includes the fields of
    						the groom in the first column and the fields of the bride in the second
    						column. The order in the content is row by row but the author feels
    						it is more logical for users to navigate the form column by column.
    						This way, all the groom's criteria can be filled in before moving on
    						to the bride's criteria. The <prop>TabIndex</prop> attributes of
    						the Silverlight elements are used to specify a tab order that navigates
    						column by column. This example specifically illustrates how changing
    						tab order can change the meaningful sequence. </p>
    					<codeblock><![CDATA[ <UserControl x:Class="TabSequence.MainPage"
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 >
   <StackPanel x:Name="LayoutRoot" Background="White">
       <TextBlock>he first column contains the search criteria 
 of the groom, the second column the search criteria of 
 of the bride</TextBlock>
       <Grid>
       <Grid.RowDefinitions>
         <RowDefinition/>
         <RowDefinition/>
         <RowDefinition/>
         <RowDefinition/>
       </Grid.RowDefinitions>
       <Grid.ColumnDefinitions>
         <ColumnDefinition/>
         <ColumnDefinition/>
         <ColumnDefinition/>
       </Grid.ColumnDefinitions>
       <TextBlock>Search criteria</TextBlock>
       <TextBlock Grid.Column="1">Groom</TextBlock>
       <TextBlock Grid.Column="2">Bride</TextBlock>
       <TextBlock Grid.Row="1">First name</TextBlock>
       <TextBox Grid.Row="1" Grid.Column="1" TabIndex="1"/>
       <TextBox Grid.Row="1" Grid.Column="2" TabIndex="4"/>
       <TextBlock Grid.Row="2">Last name</TextBlock>
       <TextBox Grid.Row="2" Grid.Column="1" TabIndex="2"/>
       <TextBox Grid.Row="2" Grid.Column="2" TabIndex="5"/>
       <TextBlock Grid.Row="3" >Place of birth</TextBlock>
       <TextBox Grid.Row="3" Grid.Column="1" TabIndex="3"/>
       <TextBox Grid.Row="3" Grid.Column="2" TabIndex="6"/>
       </Grid>
   </StackPanel>
 </UserControl>
 ]]></codeblock>
    					<p>This example is shown in operation in the <loc href="TabSequence_TabIndexTestPage.html" linktype="examples">working example of Tab Sequence TabIndex</loc>.</p>
    				</description>
    			</eg-group>
    			<eg-group>
    				<head>Tab order, modified by changing runtime Control properties</head>
    				<description>
    					<p>In this example, a radio button choice in a form controls whether
    						certain other fields in the form are relevant or not relevant. The
    						current radio button selection toggles the <prop>IsEnabled</prop> property
    						in such fields to enable or disable them based on how the user selected
    						the preceding logical element, which also affects whether the fields
    						appear in the further tab sequence. The following is UI definition
    						in XAML. </p>
    					<codeblock><![CDATA[<UserControl x:Class="TabSequence.MainPage"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
   <StackPanel x:Name="LayoutRoot" Background="White">
       <TextBlock>Registration</TextBlock>
       <Grid>
       <Grid.RowDefinitions>
         <RowDefinition/>
         <RowDefinition/>
         <RowDefinition/>
         <RowDefinition/>
       </Grid.RowDefinitions>
       <Grid.ColumnDefinitions>
         <ColumnDefinition/>
         <ColumnDefinition/>
         <ColumnDefinition/>
       </Grid.ColumnDefinitions>
           <StackPanel Orientation="Horizontal">
               <RadioButton GroupName="Registration" Checked="RadioButton_CheckedG">Guest</RadioButton>
               <RadioButton GroupName="Registration" Checked="RadioButton_CheckedC">Custom</RadioButton>
           </StackPanel>
               <TextBlock Grid.Row="1">First name</TextBlock>
           <TextBox x:Name="tb_fn" IsEnabled="false" Grid.Row="1" Grid.Column="1" />
           <TextBlock Grid.Row="2">Last name</TextBlock>
           <TextBox  x:Name="tb_ln" IsEnabled="false" Grid.Row="2" Grid.Column="1" />
       </Grid>
   </StackPanel>
</UserControl>
]]></codeblock>
    					<p>The following is event handler code. </p>
    					<codeblock><![CDATA[       private void RadioButton_CheckedC(object sender, RoutedEventArgs e)
       {
           tb_fn.IsEnabled = true;
           tb_ln.IsEnabled = true;
       }
       private void RadioButton_CheckedG(object sender, RoutedEventArgs e)
       {
           tb_fn.IsEnabled = false;
           tb_ln.IsEnabled = false;
       }
       ]]></codeblock>
    					<p>This example is shown in operation in the <loc href="TabSequence_EnabledTestPage.html" linktype="examples">working example of Tab Sequence Enabled</loc>.</p>
    				</description>
    			</eg-group>
    		</examples>
    		<resources>
    			<see-also>
    				<ulist>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc189034%28VS.95%29.aspx">Silverlight
    					Object Trees</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc707824%28VS.95%29.aspx">Silverlight
    					Accessibility Overview</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc903954%28VS.95%29.aspx">Focus
    						Overview</loc> </p></item>
    				</ulist>
    			</see-also>
    		</resources>
    		<tests>
    			<procedure>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. </p></item><item><p> Engage the screen reader. Press the TAB key to traverse the sequence
    						of elements inside the Silverlight content area. </p></item><item><p> Verify that the order in which elements are traversed in a tab
    							sequence is also the expected order of the elements as they are presented
    							visually, particularly in such cases where the order of each element
    							is significant per <loc href="content-structure-separation-sequence" linktype="understanding">SC
    								1.3.2</loc>. </p></item></olist>
    			</procedure>
    			<expected-results>
    				<p>#3 is true. </p>
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href="http://trace.wisc.edu/wcag_wiki/index.php?title=Using_the_Silverlight_Default_Tab_Sequence_and_Altering_Tab_Sequences_With_Properties"/></source>
    		</admin>
    	</technique>
    	<technique id="SL35">
    		<short-name>Using the Validation and ValidationSummary APIs to Implement Client
    			Side Forms Validation in Silverlight</short-name>
    		<applicability>
    			<p use-id="silverlight.applicability.general"/>
    		</applicability>
    		<applies-to>
    			<success-criterion idref="minimize-error-identified"/>
    			<success-criterion idref="minimize-error-suggestions"/>
    			<success-criterion idref="minimize-error-reversible" relationship="advisory"/>
    		</applies-to>
    		<ua-issues>
    			<ua-issue use-id="silverlight.ua-issue.general"/>
    		</ua-issues>
    		<description>
    			<p>The objective of this technique is to use the Silverlight <obj>Validation</obj> API.
    				The <obj>Validation</obj> API associates the validation logic with form input
    				elements that properly support accessible text both for the initial
    				entry and for any error identification and suggestion that is displayed
    				in the user interface. </p>
    			<p>Application authors can either associate <prop>Validation.Errors</prop> output
    				with specific UI elements, include an initially hidden <obj>ValidationSummary</obj> user
    				interface element, or both. The example shown in this technique uses
    				both <obj>ValidationSummary</obj> and <prop>Validation.Errors</prop>.
    				The <obj>ValidationSummary</obj> is the most appropriate technique
    				for providing text feedback after a form submission attempt, because
    				assistive technologies pick it up as a discrete focusable element in
    				the interface representation. The <prop>Validation.Errors</prop> technique
    				is perhaps a better cognitive user experience for sighted users, because
    				it presents the specific error suggestions in closer proximity to the
    				input items that are in error. </p>
    			<p>This technique relies on several Silverlight features: <obj>AutomationProperties</obj>,
    				the <prop>Name</prop> property for identifying specific UI elements,
    				the <obj>Validation</obj> and <obj>ValidationSummary</obj> API,
    				the ElementName variation of Silverlight data binding, and the general
    				behavior of <obj>TextBox</obj> elements. </p>
    			<section id="SL35_validation-states">
    				<head> Contrast for validation states of the Label control </head>
    				<p>Silverlight version 4's default visual styles have a bug where the
    					colors used to indicate an invalid field entry by changing the color
    					of the foreground text do not satisfy the 4.5:1 contrast ratio per
    					SC 1.4.1. To correct for this visual bug, application authors should
    					copy the control template for the <obj>Label</obj> control, and
    					adjust the color used for the validation state. This is shown in Example
    					1; the resource   "LabelStyle1" was generated by copying
    					the default <obj>Label</obj> style using Microsoft Expression
    					Blend. Then, the value was changed in the copied template, and the
    					changed template was referenced and included in the application. The
    					specific changed line is indicated by a comment in the Example 1 sample
    					markup. </p>
    			</section>
    		</description>
    		<examples>
    			<eg-group>
    				<head>Two form fields with validation on Submit, and an error
    					identification/suggestion system and UI on the client side</head>
    				<description>
    					<p>In this example, the form fields correspond to a data object that
    						implements a view model. Silverlight uses the view model and data annotations
    						to generate some of its UI, notably the names of the fields are bound
    						to the original view model names from the data. The <obj>ValidationSummary</obj> 
    							API is defined in a "Client SDK" library System.Windows.Controls.Data.Input.dll,
    						which is included as part of the project and the distributable. </p>
    					<p>This example has a UI defined in XAML and logic defined in C#. The
    					following is the XAML UI. </p>
    					<codeblock><![CDATA[<UserControl x:Class="AccessibleValidation.MainPage"
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk">
<UserControl.Resources>
 <Style x:Key="LabelStyle1" TargetType="sdk:Label">
 <Setter Property="IsTabStop" Value="False"/>
 <Setter Property="HorizontalContentAlignment" Value="Left"/>
 <Setter Property="Template">
  <Setter.Value>
   <ControlTemplate TargetType="sdk:Label">
    <Grid>
     <VisualStateManager.VisualStateGroups>
      <VisualStateGroup x:Name="CommonStates">
       <VisualState x:Name="Normal"/>
       <VisualState x:Name="Disabled"/>
      </VisualStateGroup>
      <VisualStateGroup x:Name="ValidationStates">
       <VisualState x:Name="Valid"/>
       <VisualState x:Name="Invalid">
        <Storyboard>
         <ColorAnimation Duration="0" To="#FFF00000"
         Storyboard.TargetProperty="(Control.Foreground).(SolidColorBrush.Color)"
         Storyboard.TargetName="ContentControl" d:IsOptimized="True"/>
         //above is the line where color was adjusted from default Red to FFF00000, 
         //to satisfy the 4.5:1 contrast requirement
        </Storyboard>
       </VisualState>
      </VisualStateGroup>
      <VisualStateGroup x:Name="RequiredStates">
       <VisualState x:Name="NotRequired"/>
       <VisualState x:Name="Required">
         <Storyboard>
          <ObjectAnimationUsingKeyFrames Duration="0" 
          Storyboard.TargetProperty="FontWeight" 
          Storyboard.TargetName="ContentControl">
           <DiscreteObjectKeyFrame KeyTime="0" Value="SemiBold"/>
          </ObjectAnimationUsingKeyFrames>
         </Storyboard>
        </VisualState>
       </VisualStateGroup>
      </VisualStateManager.VisualStateGroups>
      <Border BorderBrush="{TemplateBinding BorderBrush}" 
      BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" 
      CornerRadius="2" Padding="{TemplateBinding Padding}">
       <ContentControl x:Name="ContentControl" Cursor="{TemplateBinding Cursor}" 
         ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" 
         Foreground="{TemplateBinding Foreground}" FontWeight="{TemplateBinding FontWeight}"
         FontStretch="{TemplateBinding FontStretch}" FontSize="{TemplateBinding FontSize}" 
         FontFamily="{TemplateBinding FontFamily}" HorizontalAlignment="{TemplateBinding HorizontalAlignment}" 
         HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
         IsTabStop="False" VerticalAlignment="{TemplateBinding VerticalAlignment}" 
         VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"/>
      </Border>
     </Grid>
    </ControlTemplate>
   </Setter.Value>
  </Setter>
 </Style>
</UserControl.Resources>
 <Grid x:Name="LayoutRoot" Background="White" Margin="10">
   <Grid.RowDefinitions>
     <RowDefinition Height="Auto"/>
     <RowDefinition Height="Auto"/>
     <RowDefinition Height="Auto"/>
     <RowDefinition Height="Auto"/>
     <RowDefinition Height="Auto"/>
   </Grid.RowDefinitions>
   <Grid.ColumnDefinitions>
     <ColumnDefinition Width="Auto"/>
     <ColumnDefinition Width="200"/>
     <ColumnDefinition Width="Auto"/>
   </Grid.ColumnDefinitions>
   <TextBlock Text="Validating Form" FontSize="16" FontWeight="Bold"
     Grid.Column="1" HorizontalAlignment="Center" />
   <sdk:ValidationSummary x:Name="ErrorSummary" IsTabStop="True"
     Grid.Row="1" Grid.ColumnSpan="2" Margin="3" />
   <sdk:Label x:Name="NameLabel" Target="{Binding ElementName=NameTextBox}"
     Grid.Row="2" Margin="3" HorizontalAlignment="Right" Style="{StaticResource LabelStyle1}"/>    
   <TextBox x:Name="NameTextBox" 
     AutomationProperties.Name="{Binding Content, ElementName=NameLabel}"
     Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=Explicit, 
     NotifyOnValidationError=True, ValidatesOnExceptions=True}"
     Grid.Column="1" Grid.Row="2" Margin="3" />
   <sdk:DescriptionViewer Target="{Binding ElementName=NameTextBox}" 
     Grid.Column="2" Grid.Row="2" />
   <sdk:Label x:Name="AgeLabel" Target="{Binding ElementName=AgeTextBox}"
     Grid.Row="3" Margin="3" HorizontalAlignment="Right" Style="{StaticResource LabelStyle1}"/>
   <TextBox x:Name="AgeTextBox" 
     AutomationProperties.Name="{Binding Content, ElementName=AgeLabel}" 
     Text="{Binding Age, Mode=TwoWay, UpdateSourceTrigger=Explicit, 
     NotifyOnValidationError=True, ValidatesOnExceptions=True}"  
     Grid.Column="1" Grid.Row="3" Margin="3" />
   <sdk:DescriptionViewer Target="{Binding ElementName=AgeTextBox}" 
     Grid.Column="2" Grid.Row="3" />
   <Button x:Name="SubmitButton" Content="Submit" Click="SubmitButton_Click"
     Grid.Column="1" Grid.Row="4" Width="50" Margin="3" />
 </Grid>
</UserControl>
]]></codeblock>
    					<p>The following is the C# logic for the page. Note the call to Focus
    						in the logic; many assistive technologies use focus to determine
    						what area of the interface to report to the user. If code calls Focus
    						to reference the error summary once it is completed, the assistive
    						technology can report the error summary immediately. </p>
    					<codeblock><![CDATA[       public MainPage()
       {
           InitializeComponent();
           LayoutRoot.DataContext = new Product();
       }
       // Commits text box values when the user presses ENTER.
       private void TextBox_KeyDown(object sender, 
           System.Windows.Input.KeyEventArgs e)
       {
           if (e.Key == System.Windows.Input.Key.Enter) (sender as TextBox)
               .GetBindingExpression(TextBox.TextProperty).UpdateSource();
       }
       private void SubmitButton_Click(object sender, System.Windows.RoutedEventArgs e)
       {
           NameTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource();
           AgeTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource();
           if (ErrorSummary.Errors.Count > 0) ErrorSummary.Focus();
           }]]></codeblock>
    					<p>The following is the data class. Note how much of the validation
    						logic is defined within this view model, rather than as part of Silverlight
    						UI logic. </p>
    					<codeblock><![CDATA[  public class Product 
   {
       private string nameValue;
       private const string nameMessage = "Must be 10 characters or less.";
       [Display(Name = "Username", Description = "Required. " + nameMessage)]
       [StringLength(10, ErrorMessage = nameMessage)]
       [Required(ErrorMessage = "Required.")]
       public string Name
       {
           get { return nameValue; }
           set
           {
               if (nameValue != value)
               {
                   Validator.ValidateProperty(value, new ValidationContext(
                       this, null, null) { MemberName = "Name" });
                   nameValue = value;
               }
           }
       }
       private string ageValue;
       private const string ageMessage = "Must be in the 5 to 120 range.";
       [Display(Description = ageMessage)]
       [Range(5, 120, ErrorMessage = ageMessage)]
       [RegularExpression("\\d*", ErrorMessage = "Must be a number.")]
       public string Age
       {
           get { return ageValue; }
           set
           {
               if (ageValue != value)
               {
                   Validator.ValidateProperty(value, new ValidationContext(
                       this, null, null) { MemberName = "Age" });
                   ageValue = value;
               }
           }
       }
       ]]></codeblock>
    					<p>The following image is a screen shot of this simple UI, after two
    						invalid values are entered in the form and Submit is activated: </p>
    					<p><image><img source="working-examples/SL35/validating_screenshot.png" height="382" width="460"/><alt>Form with invalid values</alt></image> </p>
    					<p>The following image is a screen shot of the UIAVerify tree view of
    						this same application. Note the "Text" role items that appear
    						as adjacent peer elements, which describe the validation errors. This
    						Text is actually coming from sdk:DescriptionViewer, and in the visible
    						UI in the screenshot is not currently visible. This text would be visible
    						if any of the following occurs: </p>
    					<ulist><item><p> the user hovers the mouse over the red triangle in the input field
    						corner </p></item><item><p> the user hovers over the "info i" icon </p></item><item><p> the user clicks (or tabs to) the relevant field, which focuses
    							it </p></item></ulist>
    					<p><image><img source="working-examples/SL35/validating_uia.png" height="245" width="490"/><alt>UIAVerify tree view of form with invalid values</alt></image> </p>
    					<p>This example is shown in operation in the <loc href="AccessibleValidationTestPage.html" linktype="examples">working example of Accessible Validation</loc>.</p>
    					<section>
    						<head> Validation style for Label controls </head>
    						<p>The default validation style for the Invalid state of <obj>Label</obj> does
    							not have adequate contrast by default. Application authors can restyle <obj>Label</obj> with
    							a new template that has a 4.5:1 contrast. </p>
    					</section>
    				</description>
    			</eg-group>
    		</examples>
    		<resources>
    			<see-also>
    				<ulist>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/cc278072%28VS.95%29.aspx">Data
    					Binding</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/library/dd901590%28VS.95%29.aspx">Using
    					Data Annotations to Customize Data Classes</loc> </p></item>
    					<item><p>Tools: <loc href="http://firstfloorsoftware.com/silverlightspy/">SilverlightSpy</loc> or <loc href="http://uiautomationverify.codeplex.com/">UIAVerify</loc> </p></item>
    					<item><p><loc href="http://msdn.microsoft.com/en-us/magazine/dd419663.aspx">MSDN
    						article: WPF Apps With The Model-View-ViewModel Design Pattern</loc> </p></item>
    				</ulist>
    			</see-also>
    		</resources>
    		<related-techniques>
    			<relatedtech idref="SCR32"/>
    		</related-techniques>
    		<tests>
    			<procedure>
    				<olist><item><p> Using a browser that supports Silverlight, open an HTML page that
    					references a Silverlight application through an object tag. The application
    					is expected to contain form fields, and a Submit pattern for form
    					interaction as described in <specref  ref="SL10"/>. </p></item><item><p> Navigate through the items of a form until an editable field is
    							read. Enter a value that triggers the validation. </p></item><item><p> Navigate to Submit button and activate it to attempt to submit
    								the form. </p></item><item><p> Verify that a Validation Summary now appears, and is focusable. </p></item><item><p> Verify that the Validation Summary provides enough information
    									to correct any error. </p></item><item><p> Navigate back to input elements that have validation issues. Correct
    										the errors as suggested. </p></item><item><p> Tab to Submit button. Press ENTER to resubmit. </p></item><item><p> Verify that Validation Summary is no longer displayed and that
    											the screen reader does not focus to/read any further validation information. </p></item></olist>
    			</procedure>
    			<expected-results>
    				<p>#4, #5, and #8 are true. </p>
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href="http://trace.wisc.edu/wcag_wiki/index.php?title=Using_the_Validation_and_ValidationSummary_APIs_to_Implement_Client_Side_Forms_Validation_in_Silverlight"/></source>
    		</admin>
    	</technique>
    	<!--
    	<technique id="SL">
    		<short-name></short-name>
    		<applicability>
    			<p use-id="silverlight.applicability.general"/>
    		</applicability>
    		<applies-to>
    			
    		</applies-to>
    		<ua-issues>
    			<ua-issue use-id="silverlight.ua-issue.general"/>
    		</ua-issues>
    		<description>
    			
    		</description>
    		<examples>
    			<eg-group>
    				<head></head>
    				<description>
    					<p>This example is shown in operation in the <loc href="" linktype="examples">working example of @@</loc>.</p>
    				</description>
    			</eg-group>
    		</examples>
    		<tests>
    			<procedure>
    				
    			</procedure>
    			<expected-results>
    				
    			</expected-results>
    		</tests>
    		<admin>
    			<source><loc href=""/></source>
    		</admin>
    	</technique>
    	-->
    </div1>
  </body>
  <back>
    <div1 id="placeholders">
      <!-- note: this can be updated using /misc/id-list.xslt (requires cut and paste)-->
      <head/>
      <p id="UNKNOWN">place holder for idref</p>
        
        <p id="cc1">placeholder for cc1</p>
        <p id="cc2">placeholder for cc2</p>
        <p id="cc3">placeholder for cc3</p>
        <p id="cc4">placeholder for cc4</p>
        <p id="cc5">placeholder for cc5</p>
        
 <p id="text-equiv">placeholder for text-equiv</p>
      <p id="text-equiv-all">placeholder for text-equiv-all</p>

      <p id="media-equiv">placeholder for media-equiv</p>
      <p id="media-equiv-av-only-alt">placeholder for media-equiv-av-only-alt</p>
      <p id="media-equiv-captions">placeholder for media-equiv-captions</p>
      <p id="media-equiv-audio-desc">placeholder for media-equiv-audio-desc</p>
      <p id="media-equiv-real-time-captions">placeholder for media-equiv-real-time-captions</p>
      <p id="media-equiv-audio-desc-only">placeholder for media-equiv-audio-desc-only</p>

      <p id="media-equiv-sign">placeholder for media-equiv-sign</p>
      <p id="media-equiv-extended-ad">placeholder for media-equiv-extended-ad</p>
      <p id="media-equiv-text-doc">placeholder for media-equiv-text-doc</p>
      <p id="media-equiv-live-audio-only">placeholder for media-equiv-live-audio-only</p>
      <p id="content-structure-separation">placeholder for content-structure-separation</p>
      <p id="content-structure-separation-programmatic">placeholder for content-structure-separation-programmatic</p>

      <p id="content-structure-separation-sequence">placeholder for content-structure-separation-sequence</p>
      <p id="content-structure-separation-understanding">placeholder for content-structure-separation-understanding</p>
      <p id="visual-audio-contrast">placeholder for visual-audio-contrast</p>
      <p id="visual-audio-contrast-without-color">placeholder for visual-audio-contrast-without-color</p>
      <p id="visual-audio-contrast-dis-audio">placeholder for visual-audio-contrast-dis-audio</p>
      <p id="visual-audio-contrast-contrast">placeholder for visual-audio-contrast-contrast</p>

      <p id="visual-audio-contrast-scale">placeholder for visual-audio-contrast-scale</p>
      <p id="visual-audio-contrast-text-presentation">placeholder for visual-audio-contrast-text-presentation</p>
      <p id="visual-audio-contrast7">placeholder for visual-audio-contrast7</p>
      <p id="visual-audio-contrast-noaudio">placeholder for visual-audio-contrast-noaudio</p>
      <p id="visual-audio-contrast-visual-presentation">placeholder for visual-audio-contrast-visual-presentation</p>
      <p id="visual-audio-contrast-text-images">placeholder for visual-audio-contrast-text-images</p>

      <p id="keyboard-operation">placeholder for keyboard-operation</p>
      <p id="keyboard-operation-keyboard-operable">placeholder for keyboard-operation-keyboard-operable</p>
      <p id="keyboard-operation-trapping">placeholder for keyboard-operation-trapping</p>
      <p id="keyboard-operation-all-funcs">placeholder for keyboard-operation-all-funcs</p>
      <p id="time-limits">placeholder for time-limits</p>
      <p id="time-limits-required-behaviors">placeholder for time-limits-required-behaviors</p>

      <p id="time-limits-pause">placeholder for time-limits-pause</p>
      <p id="time-limits-no-exceptions">placeholder for time-limits-no-exceptions</p>
      <p id="time-limits-postponed">placeholder for time-limits-postponed</p>
      <p id="time-limits-server-timeout">placeholder for time-limits-server-timeout</p>
      <p id="seizure">placeholder for seizure</p>
      <p id="seizure-does-not-violate">placeholder for seizure-does-not-violate</p>

      <p id="seizure-three-times">placeholder for seizure-three-times</p>
      <p id="navigation-mechanisms">placeholder for navigation-mechanisms</p>
      <p id="navigation-mechanisms-skip">placeholder for navigation-mechanisms-skip</p>
      <p id="navigation-mechanisms-title">placeholder for navigation-mechanisms-title</p>
      <p id="navigation-mechanisms-focus-order">placeholder for navigation-mechanisms-focus-order</p>
      <p id="navigation-mechanisms-refs">placeholder for navigation-mechanisms-refs</p>

      <p id="navigation-mechanisms-mult-loc">placeholder for navigation-mechanisms-mult-loc</p>
      <p id="navigation-mechanisms-descriptive">placeholder for navigation-mechanisms-descriptive</p>
      <p id="navigation-mechanisms-focus-visible">placeholder for navigation-mechanisms-focus-visible</p>
      <p id="navigation-mechanisms-location">placeholder for navigation-mechanisms-location</p>
      <p id="navigation-mechanisms-link">placeholder for navigation-mechanisms-link</p>
      <p id="navigation-mechanisms-headings">placeholder for navigation-mechanisms-headings</p>

      <p id="meaning">placeholder for meaning</p>
      <p id="meaning-doc-lang-id">placeholder for meaning-doc-lang-id</p>
      <p id="meaning-other-lang-id">placeholder for meaning-other-lang-id</p>
      <p id="meaning-idioms">placeholder for meaning-idioms</p>
      <p id="meaning-located">placeholder for meaning-located</p>
      <p id="meaning-supplements">placeholder for meaning-supplements</p>

      <p id="meaning-pronunciation">placeholder for meaning-pronunciation</p>
      <p id="consistent-behavior">placeholder for consistent-behavior</p>
      <p id="consistent-behavior-receive-focus">placeholder for consistent-behavior-receive-focus</p>
      <p id="consistent-behavior-unpredictable-change">placeholder for consistent-behavior-unpredictable-change</p>
      <p id="consistent-behavior-consistent-locations">placeholder for consistent-behavior-consistent-locations</p>
      <p id="consistent-behavior-consistent-functionality">placeholder for consistent-behavior-consistent-functionality</p>

      <p id="consistent-behavior-no-extreme-changes-context">placeholder for consistent-behavior-no-extreme-changes-context</p>
      <p id="minimize-error">placeholder for minimize-error</p>
      <p id="minimize-error-identified">placeholder for minimize-error-identified</p>
      <p id="minimize-error-cues">placeholder for minimize-error-cues</p>
      <p id="minimize-error-suggestions">placeholder for minimize-error-suggestions</p>
      <p id="minimize-error-reversible">placeholder for minimize-error-reversible</p>

      <p id="minimize-error-context-help">placeholder for minimize-error-context-help</p>
      <p id="minimize-error-reversible-all">placeholder for minimize-error-reversible-all</p>
      <p id="ensure-compat">placeholder for ensure-compat</p>
      <p id="ensure-compat-parses">placeholder for ensure-compat-parses</p>
      <p id="ensure-compat-rsv">placeholder for ensure-compat-rsv</p>
      <p id="G1">placeholder for G1</p>

      <p id="G4">placeholder for G4</p>
      <p id="G5">placeholder for G5</p>
      <p id="G8">placeholder for G8</p>
      <p id="G9">placeholder for G9</p>
      <p id="G10">placeholder for G10</p>
      <p id="G11">placeholder for G11</p>

      <p id="G13">placeholder for G13</p>
      <p id="G14">placeholder for G14</p>
      <p id="G15">placeholder for G15</p>
      <p id="G17">placeholder for G17</p>
      <p id="G18">placeholder for G18</p>
      <p id="G19">placeholder for G19</p>

      <p id="G21">placeholder for G21</p>
      <p id="G53">placeholder for G53</p>
      <p id="G54">placeholder for G54</p>
      <p id="G55">placeholder for G55</p>
      <p id="G56">placeholder for G56</p>
      <p id="G57">placeholder for G57</p>

      <p id="G58">placeholder for G58</p>
      <p id="G59">placeholder for G59</p>
      <p id="G60">placeholder for G60</p>
      <p id="G61">placeholder for G61</p>
      <p id="G62">placeholder for G62</p>
      <p id="G63">placeholder for G63</p>

      <p id="G64">placeholder for G64</p>
      <p id="G65">placeholder for G65</p>
      <p id="G68">placeholder for G68</p>
      <p id="G69">placeholder for G69</p>
      <p id="G70">placeholder for G70</p>
      <p id="G71">placeholder for G71</p>

      <p id="G73">placeholder for G73</p>
      <p id="G74">placeholder for G74</p>
      <p id="G75">placeholder for G75</p>
      <p id="G76">placeholder for G76</p>
      <p id="G78">placeholder for G78</p>
      <p id="G79">placeholder for G79</p>

      <p id="G80">placeholder for G80</p>
      <p id="G81">placeholder for G81</p>
      <p id="G82">placeholder for G82</p>
      <p id="G83">placeholder for G83</p>
      <p id="G84">placeholder for G84</p>
      <p id="G85">placeholder for G85</p>

      <p id="G86">placeholder for G86</p>
      <p id="G87">placeholder for G87</p>
      <p id="G88">placeholder for G88</p>
      <p id="G89">placeholder for G89</p>
      <p id="G90">placeholder for G90</p>
      <p id="G91">placeholder for G91</p>

      <p id="G92">placeholder for G92</p>
      <p id="G93">placeholder for G93</p>
      <p id="G94">placeholder for G94</p>
      <p id="G95">placeholder for G95</p>
      <p id="G96">placeholder for G96</p>
      <p id="G97">placeholder for G97</p>

      <p id="G98">placeholder for G98</p>
      <p id="G99">placeholder for G99</p>
      <p id="G100">placeholder for G100</p>
      <p id="G101">placeholder for G101</p>
      <p id="G102">placeholder for G102</p>
      <p id="G103">placeholder for G103</p>

      <p id="G105">placeholder for G105</p>
      <p id="G107">placeholder for G107</p>
      <p id="G108">placeholder for G108</p>
      <p id="G110">placeholder for G110</p>
      <p id="G111">placeholder for G111</p>
      <p id="G112">placeholder for G112</p>

      <p id="G115">placeholder for G115</p>
      <p id="G117">placeholder for G117</p>
      <p id="G120">placeholder for G120</p>
      <p id="G121">placeholder for G121</p>
      <p id="G122">placeholder for G122</p>
      <p id="G123">placeholder for G123</p>

      <p id="G124">placeholder for G124</p>
      <p id="G125">placeholder for G125</p>
      <p id="G126">placeholder for G126</p>
      <p id="G127">placeholder for G127</p>
      <p id="G128">placeholder for G128</p>
      <p id="G130">placeholder for G130</p>

      <p id="G131">placeholder for G131</p>
      <p id="G133">placeholder for G133</p>
      <p id="G134">placeholder for G134</p>
      <p id="G135">placeholder for G135</p>
      <p id="G136">placeholder for G136</p>
      <p id="G138">placeholder for G138</p>

      <p id="G139">placeholder for G139</p>
      <p id="G140">placeholder for G140</p>
      <p id="G141">placeholder for G141</p>
      <p id="G142">placeholder for G142</p>
      <p id="G143">placeholder for G143</p>
      <p id="G144">placeholder for G144</p>

      <p id="G145">placeholder for G145</p>
      <p id="G146">placeholder for G146</p>
      <p id="G147">placeholder for G147</p>
      <p id="G148">placeholder for G148</p>
      <p id="G149">placeholder for G149</p>
      <p id="G150">placeholder for G150</p>

      <p id="G151">placeholder for G151</p>
      <p id="G152">placeholder for G152</p>
      <p id="G153">placeholder for G153</p>
      <p id="G155">placeholder for G155</p>
      <p id="G156">placeholder for G156</p>
      <p id="G157">placeholder for G157</p>

      <p id="G158">placeholder for G158</p>
      <p id="G159">placeholder for G159</p>
      <p id="G160">placeholder for G160</p>
      <p id="G161">placeholder for G161</p>
      <p id="G162">placeholder for G162</p>
      <p id="G163">placeholder for G163</p>

      <p id="G164">placeholder for G164</p>
      <p id="G165">placeholder for G165</p>
      <p id="G166">placeholder for G166</p>
      <p id="G167">placeholder for G167</p>
      <p id="G168">placeholder for G168</p>
      <p id="G169">placeholder for G169</p>

      <p id="G170">placeholder for G170</p>
      <p id="G171">placeholder for G171</p>
      <p id="G172">placeholder for G172</p>
      <p id="G173">placeholder for G173</p>
      <p id="G174">placeholder for G174</p>
      <p id="G175">placeholder for G175</p>

      <p id="G176">placeholder for G176</p>
      <p id="G177">placeholder for G177</p>
      <p id="G178">placeholder for G178</p>
      <p id="G179">placeholder for G179</p>
      <p id="G180">placeholder for G180</p>
      <p id="G181">placeholder for G181</p>

      <p id="G182">placeholder for G182</p>
      <p id="G183">placeholder for G183</p>
      <p id="G184">placeholder for G184</p>
      <p id="G185">placeholder for G185</p>
      <p id="G186">placeholder for G186</p>
      <p id="G187">placeholder for G187</p>

      <p id="G188">placeholder for G188</p>
      <p id="G189">placeholder for G189</p>
      <p id="G190">placeholder for G190</p>
      <p id="G191">placeholder for G191</p>
      <p id="G192">placeholder for G192</p>
      <p id="G193">placeholder for G193</p>

      <p id="G194">placeholder for G194</p>
      <p id="G195">placeholder for G195</p>
      <p id="G196">placeholder for G196</p>
      <p id="G197">placeholder for G197</p>
      <p id="G198">placeholder for G198</p>
      <p id="H2">placeholder for H2</p>

      <p id="H4">placeholder for H4</p>
      <p id="H24">placeholder for H24</p>
      <p id="H25">placeholder for H25</p>
      <p id="H27">placeholder for H27</p>
      <p id="H28">placeholder for H28</p>
      <p id="H30">placeholder for H30</p>

      <p id="H32">placeholder for H32</p>
      <p id="H33">placeholder for H33</p>
      <p id="H34">placeholder for H34</p>
      <p id="H35">placeholder for H35</p>
      <p id="H36">placeholder for H36</p>
      <p id="H37">placeholder for H37</p>

      <p id="H39">placeholder for H39</p>
      <p id="H40">placeholder for H40</p>
      <p id="H42">placeholder for H42</p>
      <p id="H43">placeholder for H43</p>
      <p id="H44">placeholder for H44</p>
      <p id="H45">placeholder for H45</p>

      <p id="H46">placeholder for H46</p>
      <p id="H48">placeholder for H48</p>
      <p id="H49">placeholder for H49</p>
      <p id="H50">placeholder for H50</p>
      <p id="H51">placeholder for H51</p>
      <p id="H53">placeholder for H53</p>

      <p id="H54">placeholder for H54</p>
      <p id="H56">placeholder for H56</p>
      <p id="H57">placeholder for H57</p>
      <p id="H58">placeholder for H58</p>
      <p id="H59">placeholder for H59</p>
      <p id="H60">placeholder for H60</p>

      <p id="H62">placeholder for H62</p>
      <p id="H63">placeholder for H63</p>
      <p id="H64">placeholder for H64</p>
      <p id="H65">placeholder for H65</p>
      <p id="H67">placeholder for H67</p>
      <p id="H69">placeholder for H69</p>

      <p id="H70">placeholder for H70</p>
      <p id="H71">placeholder for H71</p>
      <p id="H73">placeholder for H73</p>
      <p id="H74">placeholder for H74</p>
      <p id="H75">placeholder for H75</p>
      <p id="H76">placeholder for H76</p>

      <p id="H77">placeholder for H77</p>
      <p id="H78">placeholder for H78</p>
      <p id="H79">placeholder for H79</p>
      <p id="H80">placeholder for H80</p>
      <p id="H81">placeholder for H81</p>
      <p id="H82">placeholder for H82</p>

      <p id="H83">placeholder for H83</p>
      <p id="H84">placeholder for H84</p>
      <p id="H85">placeholder for H85</p>
      <p id="H86">placeholder for H86</p>
      <p id="H87">placeholder for H87</p>
      <p id="H88">placeholder for H88</p>

      <p id="H89">placeholder for H89</p>
      <p id="H90">placeholder for H90</p>
      <p id="H91">placeholder for H91</p>

      <p id="SCR1">placeholder for SCR1</p>
      <p id="SCR2">placeholder for SCR2</p>
      <p id="SCR14">placeholder for SCR14</p>
      <p id="SCR16">placeholder for SCR16</p>

      <p id="SCR18">placeholder for SCR18</p>
      <p id="SCR19">placeholder for SCR19</p>
      <p id="SCR20">placeholder for SCR20</p>
      <p id="SCR21">placeholder for SCR21</p>
      <p id="SCR22">placeholder for SCR22</p>
      <p id="SCR24">placeholder for SCR24</p>

      <p id="SCR26">placeholder for SCR26</p>
      <p id="SCR27">placeholder for SCR27</p>
      <p id="SCR28">placeholder for SCR28</p>
      <p id="SCR29">placeholder for SCR29</p>
      <p id="SCR30">placeholder for SCR30</p>
      <p id="SCR31">placeholder for SCR31</p>

      <p id="SCR32">placeholder for SCR32</p>
      <p id="SCR33">placeholder for SCR33</p>
      <p id="SCR34">placeholder for SCR34</p>
      <p id="SCR35">placeholder for SCR35</p>
      <p id="SCR36">placeholder for SCR36</p>
      <p id="SCR37">placeholder for SCR37</p>

      <p id="SVR1">placeholder for SVR1</p>
      <p id="SVR2">placeholder for SVR2</p>
      <p id="SVR3">placeholder for SVR3</p>
      <p id="SVR4">placeholder for SVR4</p>
      <p id="SM1">placeholder for SM1</p>
      <p id="SM2">placeholder for SM2</p>

      <p id="SM6">placeholder for SM6</p>
      <p id="SM7">placeholder for SM7</p>
      <p id="SM11">placeholder for SM11</p>
      <p id="SM12">placeholder for SM12</p>
      <p id="SM13">placeholder for SM13</p>
      <p id="SM14">placeholder for SM14</p>

      <p id="T1">placeholder for T1</p>
      <p id="T2">placeholder for T2</p>
      <p id="T3">placeholder for T3</p>
      <p id="ARIA1">placeholder for ARIA1</p>
      <p id="ARIA2">placeholder for ARIA2</p>
      <p id="ARIA3">placeholder for ARIA3</p>

      <p id="ARIA4">placeholder for ARIA4</p>
      <p id="F1">placeholder for F1</p>
      <p id="F2">placeholder for F2</p>
      <p id="F3">placeholder for F3</p>
      <p id="F4">placeholder for F4</p>
      <p id="F7">placeholder for F7</p>

      <p id="F8">placeholder for F8</p>
      <p id="F9">placeholder for F9</p>
      <p id="F10">placeholder for F10</p>
      <p id="F12">placeholder for F12</p>
      <p id="F13">placeholder for F13</p>
      <p id="F14">placeholder for F14</p>

      <p id="F15">placeholder for F15</p>
      <p id="F16">placeholder for F16</p>
      <p id="F17">placeholder for F17</p>
      <p id="F19">placeholder for F19</p>
      <p id="F20">placeholder for F20</p>
      <p id="F22">placeholder for F22</p>

      <p id="F23">placeholder for F23</p>
      <p id="F24">placeholder for F24</p>
      <p id="F25">placeholder for F25</p>
      <p id="F26">placeholder for F26</p>
      <p id="F30">placeholder for F30</p>
      <p id="F31">placeholder for F31</p>

      <p id="F32">placeholder for F32</p>
      <p id="F33">placeholder for F33</p>
      <p id="F34">placeholder for F34</p>
      <p id="F36">placeholder for F36</p>
      <p id="F37">placeholder for F37</p>
      <p id="F38">placeholder for F38</p>

      <p id="F39">placeholder for F39</p>
      <p id="F40">placeholder for F40</p>
      <p id="F41">placeholder for F41</p>
      <p id="F42">placeholder for F42</p>
      <p id="F43">placeholder for F43</p>
      <p id="F44">placeholder for F44</p>

      <p id="F46">placeholder for F46</p>
      <p id="F47">placeholder for F47</p>
      <p id="F48">placeholder for F48</p>
      <p id="F49">placeholder for F49</p>
      <p id="F50">placeholder for F50</p>
      <p id="F52">placeholder for F52</p>

      <p id="F54">placeholder for F54</p>
      <p id="F55">placeholder for F55</p>
      <p id="F58">placeholder for F58</p>
      <p id="F59">placeholder for F59</p>
      <p id="F60">placeholder for F60</p>
      <p id="F61">placeholder for F61</p>

      <p id="F62">placeholder for F62</p>
      <p id="F63">placeholder for F63</p>
      <p id="F65">placeholder for F65</p>
      <p id="F66">placeholder for F66</p>
      <p id="F67">placeholder for F67</p>
      <p id="F68">placeholder for F68</p>

      <p id="F69">placeholder for F69</p>
      <p id="F70">placeholder for F70</p>
      <p id="F71">placeholder for F71</p>
      <p id="F72">placeholder for F72</p>
      <p id="F73">placeholder for F73</p>
      <p id="F74">placeholder for F74</p>

      <p id="F75">placeholder for F75</p>
      <p id="F76">placeholder for F76</p>
      <p id="F77">placeholder for F77</p>
      <p id="F78">placeholder for F78</p>
      <p id="F79">placeholder for F79</p>
      <p id="F80">placeholder for F80</p>

      <p id="F81">placeholder for F81</p>
      <p id="F82">placeholder for F82</p>
      <p id="F83">placeholder for F83</p>
      <p id="F84">placeholder for F84</p>
      <p id="F85">placeholder for F85</p>
      <p id="F86">placeholder for F86</p>

      <p id="F87">placeholder for F87</p>
      <p id="F88">placeholder for F88</p>
      <p id="F89">placeholder for F89</p>

      <p id="C22">placeholder for C22</p>
      <p id="C29">placeholder for C29</p>
      
    </div1>
    <div1 id="references">
      <head>References</head>
      <blist>
        <bibl id="CSS1" key="CSS1">"Cascading Style Sheets, level 1," B. Bos, H. Wium Lie, eds., W3C Recommendation 17 Dec 1996, revised 11 Jan 1999. Available at <loc href="http://www.w3.org/TR/REC-CSS1/">http://www.w3.org/TR/REC-CSS1/</loc>.</bibl>
        <bibl id="CSS2" key="CSS2">"Cascading Style Sheets, level 2," B. Bos, H. Wium Lie, C. Lilley, and I. Jacobs, eds., W3C Recommendation 12 May 1998. Available at <loc href="http://www.w3.org/TR/CSS2/">http://www.w3.org/TR/CSS2/</loc>.</bibl>
        <bibl id="CSS21" key="CSS21">"Cascading Style Sheets, level 2 revision 1,"  B. Bos, T. Çelik,  I. Hickson,   H. Wium Lie, eds., W3C Candidate Recommendation 25 February 2004.  Available at:  <loc href="http://www.w3.org/TR/CSS21/">http://www.w3.org/TR/CSS21/</loc>
        </bibl>
        <bibl id="CSS3" key="CSS3">
          <titleref href="http://www.w3.org/Style/CSS/current-work#table">[CSS 2.1 and CSS 3] Roadmap</titleref>, CSS WG's table of modules and publication dates.</bibl>
      	<bibl id="PDF" key="PDF">"PDF", Adobe Systems. Available at <loc href="http://www.adobe.com/devnet/pdf.html">http://www.adobe.com/devnet/pdf.html</loc>.</bibl>
      	<bibl id="SILVERLIGHT" key="SILVERLIGHT">"Silverlight", Microsoft. Available at <loc href="http://www.silverlight.net/">http://www.silverlight.net/</loc></bibl>
      	<bibl id="HTML4" key="HTML4">"HTML 4.01 Specification," D. Raggett, A. Le Hors, I. Jacobs, eds.,  W3C Recommendation 24 December 1999. Available at <loc href="http://www.w3.org/TR/html401/">http://www.w3.org/TR/html401/</loc>
        </bibl>
        <bibl id="WCAG20" key="WCAG20">"Web Content Accessibility Guidelines 2.0,"  B. Caldwell, M. Cooper, L. Guarino Reid, and G. Vanderheiden, eds., W3C Working Draft 11 December 2007. This W3C Working Draft is available at <loc href="http://www.w3.org/TR/2007/WD-WCAG20-20071211/">http://www.w3.org/TR/2007/WD-WCAG20-20071211/</loc>.  The latest version of WCAG 2.0 is available at <loc href="http://www.w3.org/TR/WCAG20/">http://www.w3.org/TR/WCAG20/</loc>
        </bibl>
        <bibl id="XHTML1" key="XHTML1">"XHTML 1.0 The Extensible HyperText Markup Language (Second Edition)," S. Pemberton, et al.,  W3C Recommendation 26 January 2000, revised 1 August 2002. Available at:  <loc href="http://www.w3.org/TR/xhtml1/">http://www.w3.org/TR/xhtml1/</loc>.</bibl>
      </blist>
    </div1>
  </back>
</spec>