<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Silverlight &#124; WPF &#124; Microsoft.Net &#187; ToggleButton</title>
	<atom:link href="http://joel.neubeck.net/tag/togglebutton/feed/" rel="self" type="application/rss+xml" />
	<link>http://joel.neubeck.net</link>
	<description>Simplifing structure without changing results</description>
	<lastBuildDate>Fri, 01 Apr 2011 21:34:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>Silverlight Video Player updated to display Closed Captioning</title>
		<link>http://joel.neubeck.net/2008/07/sl2videoplayer-closed-captioning/</link>
		<comments>http://joel.neubeck.net/2008/07/sl2videoplayer-closed-captioning/#comments</comments>
		<pubDate>Sat, 19 Jul 2008 15:02:47 +0000</pubDate>
		<dc:creator>joel</dc:creator>
				<category><![CDATA[CodePlex]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[Closed Captioning]]></category>
		<category><![CDATA[ToggleButton]]></category>
		<category><![CDATA[Video Player]]></category>

		<guid isPermaLink="false">http://joel.neubeck.net/?p=205</guid>
		<description><![CDATA[Yesterday I completed the first version of Closed Captioning support for the Silverlight 2 Video Player on CodePlex.  It definitely in an alpha phase, but with some polish it should be reliable and more usable.  Here is an image of how the captions are being displayed. In this first version I made a decision to [...]]]></description>
			<content:encoded><![CDATA[<p>Yesterday I completed the first version of Closed Captioning support for the <a title="SL2 Video Player" href="http://www.codeplex.com/sl2videoplayer/" target="_blank">Silverlight 2 Video Player</a> on CodePlex.  It definitely in an alpha phase, but with some polish it should be reliable and more usable.  Here is an image of how the captions are being displayed.</p>
<p><a href="http://joel.neubeck.net/wp-content/uploads/2008/07/video_cc.png"><img class="aligncenter size-full wp-image-206" title="video_cc" src="http://joel.neubeck.net/wp-content/uploads/2008/07/video_cc.png" alt="" width="500" height="248" /></a><br style="clear:both"/>In this first version I made a decision to display closed captioning when the volume is muted, but with the right visualization we should be able to find a nice place for a ToggleButton.  Here is a list of a few other things I did to the project.</p>
<ul>
<li>Updated Xml parsing to support markers with multiple types (Marker, CC, etc)</li>
<li>Converted speaker button control to ToggleButton to display a different visualization when the player is muted.</li>
<li>Linked volumeSlider to speaker button so slider drops to zero on mute and back to previous volume when mute is turned off.</li>
<li>Added a new event from mediaControl that is fired when the volume is changed.  This allows the player to control closed captioning display and not the media controller.</li>
<li>Wrote closedCaptioning UserControl that visualizes the scrolling captions.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://joel.neubeck.net/2008/07/sl2videoplayer-closed-captioning/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Silverlight how-to: Video Player</title>
		<link>http://joel.neubeck.net/2008/04/silverlight2-how-to-video-player/</link>
		<comments>http://joel.neubeck.net/2008/04/silverlight2-how-to-video-player/#comments</comments>
		<pubDate>Thu, 10 Apr 2008 17:48:44 +0000</pubDate>
		<dc:creator>joel</dc:creator>
				<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[ControlTemplate]]></category>
		<category><![CDATA[MediaElement]]></category>
		<category><![CDATA[Slider]]></category>
		<category><![CDATA[Style]]></category>
		<category><![CDATA[ToggleButton]]></category>
		<category><![CDATA[Video Player]]></category>
		<category><![CDATA[Xaml]]></category>

		<guid isPermaLink="false">http://joel.neubeck.net/?p=129</guid>
		<description><![CDATA[Please note: This sample was made into a Code Plex project and is maintained there. Please download all source from http://www.codeplex.com/sl2videoplayer/ In my ongoing quest to work with Silverlight 2 I embarked on building my own video player using the standard MediaElement and a few of the new System Controls (ToggleButon, Slider and Button). My [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><strong>Please note</strong>: This sample was made into a Code Plex project and is maintained there.  Please download all source from <a href="http://www.codeplex.com/sl2videoplayer/">http://www.codeplex.com/sl2videoplayer/</a></p></blockquote>
<p>In my ongoing quest to work with Silverlight 2 I embarked on building my own video player using the standard MediaElement and a few of the new System Controls (ToggleButon, Slider and Button). My goal was to build a video player using no custom user controls, but instead leveraging controls styles and templates.&#160; Here is the Video Player I ended up developing.</p>
<p><iframe src="/wp-content/uploads/2008/04/VideoPlayer/default.html" width="480" height="360"></iframe></p>
<p>As you can see from my example, I was able to get a pretty clean look and feel with minimal artistic skills required.&#160;&#160; The way my player is constructed, I have opted to encapsulate the controls for playing video into its own UserControl.&#160; This allowed me to have a single place responsible for managing playback while allowing the main xaml page to control how the MediaElement is presented.&#160; To give the controller access to a specific MediaElement, I pass it to my controller via a public property.</p>
<p>Most of the customization techniques I used are pretty well documented on MSDN.&#160; Nonetheless, mastering controls styles was definitely a challenge. For those unfamiliar with control styles, here is an example of the xaml I used to &quot;skin&quot; my mute button.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;style</span> <span style="color: #000066;">x:key</span>=<span style="color: #ff0000;">&quot;speakerStyle&quot;</span> <span style="color: #000066;">targettype</span>=<span style="color: #ff0000;">&quot;Button&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;setter</span> <span style="color: #000066;">property</span>=<span style="color: #ff0000;">&quot;Template&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;setter.value<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;controltemplate</span> <span style="color: #000066;">targettype</span>=<span style="color: #ff0000;">&quot;Button&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;grid</span> <span style="color: #000066;">x:name</span>=<span style="color: #ff0000;">&quot;RootElement&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;path</span> <span style="color: #000066;">stretch</span>=<span style="color: #ff0000;">&quot;Fill&quot;</span> <span style="color: #000066;">fill</span>=<span style="color: #ff0000;">&quot;#FFFFFFFF&quot;</span> <span style="color: #000066;">data</span>=<span style="color: #ff0000;">&quot;F1 M 23.1457,</span>
<span style="color: #009900;">            26.5056L 23.1457,33.8944l 25.7913,33.8944l 28.8235,37.4722l </span>
<span style="color: #009900;">            30.5346,37.4722l 30.5665,23.0833l 28.8995,23.0833l 25.8679,</span>
<span style="color: #009900;">            26.5056l 23.1457,26.5056 z &quot;</span> <span style="color: #000066;">Width</span>=<span style="color: #ff0000;">&quot;7.42080116271973&quot;</span> </span>
<span style="color: #009900;">            <span style="color: #000066;">height</span>=<span style="color: #ff0000;">&quot;14.3889999389648&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/grid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/controltemplate<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/setter.value<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/setter<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/style<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>This is about as simple a skin as one can get. If I were doing this for a real client I would have certainly choose to give my button multiple states (MouseOver, Down, ect) In Silverlight 2 control states are achieved by including specific named Storyboards in your ControlTemplate resource dictionary. Each control provides a different set of pre defined states. Here is a list of the states available for a ToggleButton.</p>
<ul>
<li><strong>Checked State</strong> &#8211; The normal checked state of the control. </li>
<li><strong>Indeterminate State</strong> &#8211; The normal indeterminate state of the control. </li>
<li><strong>Normal State</strong> &#8211; The normal unchecked state of the control. </li>
<li><strong>MouseOver Checked State</strong> &#8211; The state that is triggered when the mouse pointer is positioned over the checked control. </li>
<li><strong>MouseOver Indeterminate State</strong> &#8211; The state that is triggered when the mouse pointer is positioned over the indeterminate control. </li>
<li><strong>MouseOver Unchecked State</strong> &#8211; The state that is triggered when the mouse pointer is positioned over the unchecked control. </li>
<li><strong>Pressed Checked State</strong> &#8211; The state that is triggered when the checked control is pressed. </li>
<li><strong>Pressed Indeterminate State</strong> &#8211; The state that is triggered when the indeterminate control is pressed. </li>
<li><strong>Pressed Unchecked State</strong> &#8211; The state that is triggered when the unchecked control is pressed. </li>
<li><strong>Disabled Checked State</strong> &#8211; The state that is triggered when the checked control is disabled. </li>
<li><strong>Disabled Indeterminate State</strong> &#8211; The state that is triggered when the indeterminate control is disabled. </li>
<li><strong>Disabled Unchecked State</strong> &#8211; The state that is triggered when the unchecked control is disabled. </li>
</ul>
<p>In my example I use the ToggleButton to control playback of the video.&#160; Instead of creating two buttons, one for play and one for pause, I&#160; choose to use a ToggleButton to combine them into one.&#160; I display a play symbol when the video is stopped or paused, and a pause symbol when the video is playing.&#160; The ToggleButton functions just like a checkbox, clicking it once &quot;check&#8217;s&quot; it while clicking it again &quot;uncheck&#8217;s&quot; it.&#160;&#160; The following&#160; is a sample of one of the Storyboards I used in skinning my ToggleButton. This animation controls which elements are visualized when a users presses the ToggleButton in an previously checked state.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;storyboard</span> <span style="color: #000066;">x:key</span>=<span style="color: #ff0000;">&quot;Pressed Checked State&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;doubleanimation</span> <span style="color: #000066;">duration</span>=<span style="color: #ff0000;">&quot;0:0:0.1&quot;</span> </span>
<span style="color: #009900;">     <span style="color: #000066;">storyboard.targetname</span>=<span style="color: #ff0000;">&quot;playSymbol&quot;</span> </span>
<span style="color: #009900;">     <span style="color: #000066;">storyboard.targetproperty</span>=<span style="color: #ff0000;">&quot;Opacity&quot;</span> <span style="color: #000066;">to</span>=<span style="color: #ff0000;">&quot;0&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;doubleanimation</span> <span style="color: #000066;">duration</span>=<span style="color: #ff0000;">&quot;0:0:0.1&quot;</span> </span>
<span style="color: #009900;">     <span style="color: #000066;">storyboard.targetname</span>=<span style="color: #ff0000;">&quot;pauseSymbol&quot;</span> </span>
<span style="color: #009900;">     <span style="color: #000066;">storyboard.targetproperty</span>=<span style="color: #ff0000;">&quot;Opacity&quot;</span> <span style="color: #000066;">to</span>=<span style="color: #ff0000;">&quot;1&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;doubleanimation</span> <span style="color: #000066;">duration</span>=<span style="color: #ff0000;">&quot;0:0:0.1&quot;</span> </span>
<span style="color: #009900;">    <span style="color: #000066;">storyboard.targetname</span>=<span style="color: #ff0000;">&quot;buttonPressed&quot;</span> </span>
<span style="color: #009900;">    <span style="color: #000066;">storyboard.targetproperty</span>=<span style="color: #ff0000;">&quot;Opacity&quot;</span> <span style="color: #000066;">to</span>=<span style="color: #ff0000;">&quot;1&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/storyboard<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>In the code above, I am ensuring that the play symbol is hidden while I show both a pause symbol and an glow image used to show the button is being pressed.</p>
<p>As for procedural code, all of the heavy lifting is done in the mediaControl.xaml.cs codebehind file.&#160; The majority of code is event handlers responding to user interactions (clicks, drags,etc) or a single DispatcherTimer monitoring progress in the video playback.&#160; My&#160; DispatcherTimer fires a tick every 50 milliseconds which update how much time has played and visualizes on a slider how much time remains.</p>
<p>Code: <a onclick="javascript: pageTracker._trackPageview(&#39;/code/VideoPlayer.zip&#39;);" href="http://www.codeplex.com/sl2videoplayer">Code Plex</a></p>
]]></content:encoded>
			<wfw:commentRss>http://joel.neubeck.net/2008/04/silverlight2-how-to-video-player/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

