<?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; Style</title>
	<atom:link href="http://joel.neubeck.net/tag/style/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 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>

