<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Building a Better User Experience - .NET</title>
    <link>http://www.mindfusioncorp.com/weblog/</link>
    <description>A weblog authored by Keith Rome, with a focus on the User Experience.</description>
    <language>en-us</language>
    <copyright>Keith Rome</copyright>
    <lastBuildDate>Mon, 09 Jun 2008 21:59:22 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>krome@wintellect.com</managingEditor>
    <webMaster>krome@wintellect.com</webMaster>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=ce802397-894c-4772-994b-5d5ba4df3fda</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,ce802397-894c-4772-994b-5d5ba4df3fda.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,ce802397-894c-4772-994b-5d5ba4df3fda.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=ce802397-894c-4772-994b-5d5ba4df3fda</wfw:commentRss>
      <slash:comments>7</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Audio support is all too often one of the last things a developer thinks of when it
comes to building a user interface. Fortunately, Silverlight offers some basic building
blocks that make it fairly trivial to add event-driven sounds to our applications.
I have taken the built-in functionality one step further, and created a simple run-time
audio engine that makes it even easier.
</p>
        <p>
First, I will discuss the requirements that I had in mind when I created this engine.
Second, I will discuss the ideal API for a complete solution. Third, I submit the
simple effects engine that I developed in order to meet those requirements and API.
</p>
        <p>
          <strong>Sound Effects Engine Requirements</strong>
        </p>
        <ul>
          <li>
Must be able to play looping “background music” tracks. 
</li>
          <li>
Must be able to play smaller sound effects on demand. 
</li>
          <li>
Must support concurrent (and overlapping) sounds effects without interfering with
already-playing audio. 
</li>
          <li>
Must adequately handle the possibility of download delays when pulling down external
audio files. 
</li>
          <li>
Should cache audio files between playbacks. 
</li>
          <li>
Should allow serving of audio from high-bandwidth CDN such as Silverlight Streaming. 
</li>
        </ul>
        <p>
          <strong>An Ideal Sound Effects API</strong>
        </p>
        <ul>
          <li>
Should be very approachable. If possible, only a single line of code to play any audio
(similar to PlaySound() API). 
</li>
          <li>
Should support any formats supported by Silverlight. 
</li>
          <li>
Should be efficient. 
</li>
          <li>
Should offer download and playback completion callbacks (for chaining and synchronization). 
</li>
          <li>
Should support aggressive background pre-caching of audio files. 
</li>
        </ul>
        <p>
          <strong>The SilverlightToolbox Solution</strong>
        </p>
        <p>
To address the simplicity requirements, this sound effects engine is implemented as
a single static C# class that can be easily included into any Silverlight project.
It can exist in a referenced class library, or can be linked directly into the main
project.
</p>
        <p>
To address looping background music, a single method SetBackgroundLoop() is supplied.
This will begin playback of a single audio clip, and will automatically repeat it.
Only one track can be played as the background loop – calling this method again will
terminate the running track and start the new one. You can also pass String.Empty
to stop all background music.
</p>
        <p>
To address typical sound effect clips. two overloads of the PlaySoundEffect() method
are supplied. The simpler of the two methods will simply play a clip once it has been
downloaded. The extended version allows you to specify a callback for when the clip
has been downloaded and started playing, and a second callback that can be used for
notification that the clip has ended.
</p>
        <p>
To address the scenario where multiple sound effects might be played at the same time,
the engine internally maintains a queue of MediaElements. When a new sound needs to
played, it pulls an unused element and puts it into service. Once the sound is finished,
the element is returned to the queue. This allows Silverlight itself to handle media
mixing, and by caching those MediaElements, it does so without placing undue stress
on the environment.
</p>
        <p>
To address the issue of download delays, the startedCallback and completedCallback
parameters of PlaySoundEffect() were introduced.
</p>
        <p>
To address caching of audio files, a WebClient is used (which in turn leverages the
browser’s cache). Furthermore, the engine will reuse any downloaded file streams (and
is smart enough to not re-queue the same file if it already queued for download).
</p>
        <p>
By using a MediaElement for playback, audio tracks are automatically supported from
streaming sources and Content Delivery Networks, and can be of any type supported
by Silverlight.
</p>
        <p>
To support chaining of audio effects, and to support synchronization of UI with audio,
the PlaySoundEffect() method accepts callback events that are fired when the clip
has been downloaded, and again when it has completed playback. To further help with
UI synchronization, a second utility class is provided (DelayedAction) which provides
a simple wrapper for BackgroundWorker that can be used to easily delay execution of
a block of code after a specified amount of time.
</p>
        <p>
To support pre-caching of audio files, the PreloadMedia() method can be used.
</p>
        <p>
          <strong>Typical usage:</strong>
        </p>
        <p>
In order for the sound effects engine to function properly, it must be provided with
a top-level XAML container (MediaElement currently will not perform playback without
a parent object). This is done by calling the Initialize() method, typically from
your program’s startup code:
</p>
        <div>
          <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">SoundEffects.Initialize(<span style="color: #0000ff">this</span>.LayoutRoot);</pre>
        </div>
        <p>
 
</p>
        <p>
After this has been done, background music can be played, and we can also queue up
some sound effect clips for later:
</p>
        <div>
          <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">SoundEffects.SetBackgroundLoop(<span style="color: #006080">"cautious-path.wma"</span>);
SoundEffects.PreloadMedia(<span style="color: #006080">"pop1.wma"</span>);</pre>
        </div>
        <p>
 
</p>
        <p>
Then, at various points throughout the application, we can play the sound effect (for
example, in response to a control event):
</p>
        <div>
          <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">SoundEffects.PlaySoundEffect(<span style="color: #006080">"pop1.wma"</span>);</pre>
        </div>
        <p>
 
</p>
        <p>
If at any point we need to delay the sound effect slightly, we can control this be
introducing a short delay:
</p>
        <div>
          <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">DelayedAction.Execute(2.0, () =&gt; SoundEffects.PlaySoundEffect(<span style="color: #006080">"pop1.wma"</span>));</pre>
        </div>
        <p>
 
</p>
        <p>
Complete Source Code for DelayedAction.cs:
</p>
        <div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4">
          <div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 1:</span>
              <span style="color: #0000ff">using</span> System;</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 2:</span>
              <span style="color: #0000ff">using</span> System.ComponentModel;</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 3:</span>
              <span style="color: #0000ff">using</span> System.Threading;</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 4:</span>  </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 5:</span>
              <span style="color: #0000ff">namespace</span> Wintellect.SilverlightToolbox</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 6:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 7:</span>
              <span style="color: #0000ff">public</span>
              <span style="color: #0000ff">class</span> DelayedAction</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 8:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 9:</span>
              <span style="color: #0000ff">class</span> DelayedCallback</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 10:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 11:</span>
              <span style="color: #0000ff">public</span> TimeSpan
Delay { get; set; }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 12:</span>
              <span style="color: #0000ff">public</span> Action
Callback { get; set; }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 13:</span> }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 14:</span>  </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 15:</span>
              <span style="color: #0000ff">public</span>
              <span style="color: #0000ff">static</span>
              <span style="color: #0000ff">void</span> Execute(<span style="color: #0000ff">double</span> seconds,
Action callback)</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 16:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 17:</span> BackgroundWorker
Delay = <span style="color: #0000ff">new</span> BackgroundWorker();</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 18:</span> Delay.DoWork
+= (s, e) =&gt;</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 19:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 20:</span> DelayedCallback
DelayCallback = (DelayedCallback)e.Argument;</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 21:</span> Thread.Sleep(DelayCallback.Delay);</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 22:</span> e.Result
= DelayCallback.Callback;</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 23:</span> };</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 24:</span> Delay.RunWorkerCompleted
+= (s, e) =&gt;</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 25:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 26:</span> Action
Callback = e.Result <span style="color: #0000ff">as</span> Action;</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 27:</span> Callback();</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 28:</span> };</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 29:</span> Delay.RunWorkerAsync(<span style="color: #0000ff">new</span> DelayedCallback</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 30:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 31:</span> Delay
= TimeSpan.FromSeconds(seconds),</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 32:</span> Callback
= callback</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 33:</span> });</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 34:</span> }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 35:</span> }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 36:</span> }</pre>
          </div>
        </div>
        <p>
 
</p>
        <p>
Complete Source Code for SoundEffects.cs:
</p>
        <div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4">
          <div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 1:</span>
              <span style="color: #0000ff">using</span> System;</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 2:</span>
              <span style="color: #0000ff">using</span> System.Collections.Generic;</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 3:</span>
              <span style="color: #0000ff">using</span> System.IO;</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 4:</span>
              <span style="color: #0000ff">using</span> System.Net;</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 5:</span>
              <span style="color: #0000ff">using</span> System.Windows;</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 6:</span>
              <span style="color: #0000ff">using</span> System.Windows.Controls;</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 7:</span>
              <span style="color: #0000ff">using</span> System.Windows.Media;</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 8:</span>  </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 9:</span>
              <span style="color: #0000ff">namespace</span> Wintellect.SilverlightToolbox</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 10:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 11:</span>
              <span style="color: #0000ff">public</span>
              <span style="color: #0000ff">static</span>
              <span style="color: #0000ff">class</span> SoundEffects</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 12:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 13:</span>
              <span style="color: #0000ff">static</span> Panel
Root;</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 14:</span>
              <span style="color: #0000ff">static</span> MediaElement
BackgroundLoop = <span style="color: #0000ff">new</span> MediaElement();</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 15:</span>
              <span style="color: #0000ff">static</span> WebClient
EffectDownloader = <span style="color: #0000ff">new</span> WebClient();</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 16:</span>  </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 17:</span>
              <span style="color: #0000ff">static</span> Queue&lt;MediaElement&gt;
AvailableSoundEffectGenerators = <span style="color: #0000ff">new</span> Queue&lt;MediaElement&gt;();</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 18:</span>
              <span style="color: #0000ff">static</span> Dictionary&lt;<span style="color: #0000ff">string</span>,
Stream&gt; DownloadedEffects = <span style="color: #0000ff">new</span> Dictionary&lt;<span style="color: #0000ff">string</span>,
Stream&gt;();</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 19:</span>
              <span style="color: #0000ff">static</span> Queue&lt;<span style="color: #0000ff">string</span>&gt;
PendingDownloads = <span style="color: #0000ff">new</span> Queue&lt;<span style="color: #0000ff">string</span>&gt;();</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 20:</span>
              <span style="color: #0000ff">static</span> Queue&lt;QueuedEffect&gt;
PendingEffects = <span style="color: #0000ff">new</span> Queue&lt;QueuedEffect&gt;();</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 21:</span>
              <span style="color: #0000ff">static</span> Dictionary&lt;MediaElement,
Action&gt; PendingStartupCallbacks = <span style="color: #0000ff">new</span> Dictionary&lt;MediaElement,
Action&gt;();</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 22:</span>
              <span style="color: #0000ff">static</span> Dictionary&lt;MediaElement,
Action&gt; PendingCompletionCallbacks = <span style="color: #0000ff">new</span> Dictionary&lt;MediaElement,
Action&gt;();</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 23:</span>  </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 24:</span>
              <span style="color: #0000ff">enum</span> TargetType</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 25:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 26:</span> BackgroundMusic,</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 27:</span> SoundEffect,</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 28:</span> }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 29:</span>  </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 30:</span>
              <span style="color: #0000ff">class</span> QueuedEffect</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 31:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 32:</span>
              <span style="color: #0000ff">public</span>
              <span style="color: #0000ff">string</span> MediaName
{ get; set; }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 33:</span>
              <span style="color: #0000ff">public</span> TargetType
Target { get; set; }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 34:</span>
              <span style="color: #0000ff">public</span> Action
StartedCallback { get; set; }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 35:</span>
              <span style="color: #0000ff">public</span> Action
CompletedCallback { get; set; }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 36:</span> }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 37:</span>  </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 38:</span>
              <span style="color: #0000ff">public</span>
              <span style="color: #0000ff">static</span>
              <span style="color: #0000ff">void</span> Initialize(Panel
root)</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 39:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 40:</span> Root
= root;</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 41:</span> InitializeTarget(root,
BackgroundLoop);</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 42:</span> EffectDownloader.OpenReadCompleted
+= (s, e) =&gt;</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 43:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 44:</span> DownloadedEffects[(<span style="color: #0000ff">string</span>)e.UserState]
= e.Result;</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 45:</span> DownloadEffects();</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 46:</span> PlayEffect();</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 47:</span> };</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 48:</span> }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 49:</span>  </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 50:</span>
              <span style="color: #0000ff">static</span>
              <span style="color: #0000ff">void</span> DownloadEffects()</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 51:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 52:</span>
              <span style="color: #0000ff">if</span> (PendingDownloads.Count
== 0)</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 53:</span>
              <span style="color: #0000ff">return</span>;</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 54:</span>
              <span style="color: #0000ff">string</span> MediaName
= PendingDownloads.Dequeue();</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 55:</span> EffectDownloader.OpenReadAsync(<span style="color: #0000ff">new</span> Uri(MediaName,
UriKind.Relative), MediaName);</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 56:</span> }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 57:</span>  </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 58:</span>
              <span style="color: #0000ff">static</span>
              <span style="color: #0000ff">void</span> InitializeTarget(Panel
root, MediaElement target)</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 59:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 60:</span> target.Width
= 0;</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 61:</span> target.Height
= 0;</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 62:</span> target.Visibility
= Visibility.Collapsed;</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 63:</span> root.Children.Add(target);</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 64:</span> target.AutoPlay
= <span style="color: #0000ff">false</span>;</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 65:</span> target.MediaOpened
+= (s, e) =&gt;</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 66:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 67:</span> MediaElement
Target = s <span style="color: #0000ff">as</span> MediaElement;</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 68:</span> Target.Volume
= 0.35;</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 69:</span> Target.Play();</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 70:</span>
              <span style="color: #0000ff">if</span> (PendingStartupCallbacks.ContainsKey(Target))</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 71:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 72:</span> Target.Dispatcher.BeginInvoke(PendingStartupCallbacks[Target]);</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 73:</span> PendingStartupCallbacks.Remove(Target);</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 74:</span> }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 75:</span> };</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 76:</span> target.MediaEnded
+= (s, e) =&gt;</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 77:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 78:</span> MediaElement
Target = s <span style="color: #0000ff">as</span> MediaElement;</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 79:</span> Target.Stop();</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 80:</span>
              <span style="color: #0000ff">if</span> (s
== BackgroundLoop)</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 81:</span> Target.Play();</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 82:</span>
              <span style="color: #0000ff">else</span>
            </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 83:</span> AvailableSoundEffectGenerators.Enqueue(Target);</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 84:</span>  </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 85:</span>
              <span style="color: #0000ff">if</span> (PendingCompletionCallbacks.ContainsKey(Target))</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 86:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 87:</span> Target.Dispatcher.BeginInvoke(PendingCompletionCallbacks[Target]);</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 88:</span> PendingCompletionCallbacks.Remove(Target);</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 89:</span> }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 90:</span> };</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 91:</span> }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 92:</span>  </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 93:</span>
              <span style="color: #0000ff">static</span> MediaElement
GetUnusedEffectGenerator()</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 94:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 95:</span>
              <span style="color: #0000ff">if</span> (AvailableSoundEffectGenerators.Count
&gt; 0)</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 96:</span>
              <span style="color: #0000ff">return</span> AvailableSoundEffectGenerators.Dequeue();</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 97:</span>
              <span style="color: #0000ff">else</span>
            </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 98:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 99:</span> MediaElement
Result = <span style="color: #0000ff">new</span> MediaElement();</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 100:</span> InitializeTarget(Root,
Result);</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 101:</span>
              <span style="color: #0000ff">return</span> Result;</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 102:</span> }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 103:</span> }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 104:</span>  </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 105:</span>
              <span style="color: #0000ff">static</span>
              <span style="color: #0000ff">void</span> PlayEffect()</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 106:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 107:</span>
              <span style="color: #0000ff">lock</span> (PendingEffects)</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 108:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 109:</span>
              <span style="color: #0000ff">if</span> (PendingEffects.Count
== 0)</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 110:</span>
              <span style="color: #0000ff">return</span>;</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 111:</span> QueuedEffect
Effect = PendingEffects.Dequeue();</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 112:</span>
              <span style="color: #0000ff">if</span> (DownloadedEffects.ContainsKey(Effect.MediaName))</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 113:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 114:</span> MediaElement
TargetElement = <span style="color: #0000ff">null</span>;</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 115:</span>
              <span style="color: #0000ff">switch</span> (Effect.Target)</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 116:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 117:</span>
              <span style="color: #0000ff">case</span> TargetType.BackgroundMusic:</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 118:</span> {
TargetElement = BackgroundLoop; <span style="color: #0000ff">break</span>; }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 119:</span>
              <span style="color: #0000ff">case</span> TargetType.SoundEffect:</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 120:</span> {
TargetElement = GetUnusedEffectGenerator(); <span style="color: #0000ff">break</span>;
}</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 121:</span> }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 122:</span>
              <span style="color: #0000ff">if</span> (Effect.StartedCallback
!= <span style="color: #0000ff">null</span>)</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 123:</span> PendingStartupCallbacks.Add(TargetElement,
Effect.StartedCallback);</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 124:</span>
              <span style="color: #0000ff">if</span> (Effect.CompletedCallback
!= <span style="color: #0000ff">null</span>)</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 125:</span> PendingCompletionCallbacks.Add(TargetElement,
Effect.CompletedCallback);</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 126:</span> TargetElement.SetSource(DownloadedEffects[Effect.MediaName]);</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 127:</span> }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 128:</span>
              <span style="color: #0000ff">else</span>
            </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 129:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 130:</span> PendingEffects.Enqueue(Effect);</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 131:</span> }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 132:</span> }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 133:</span> }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 134:</span>  </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 135:</span>
              <span style="color: #0000ff">static</span>
              <span style="color: #0000ff">void</span> PlaySound(TargetType
target, <span style="color: #0000ff">string</span> mediaName, Action startedCallback,
Action completedCallback)</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 136:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 137:</span>
              <span style="color: #0000ff">if</span> (target
== TargetType.BackgroundMusic)</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 138:</span>
              <span style="color: #0000ff">if</span> (BackgroundLoop.CurrentState
!= MediaElementState.Stopped)</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 139:</span> BackgroundLoop.Stop();</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 140:</span>  </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 141:</span>
              <span style="color: #0000ff">if</span> (mediaName
!= String.Empty)</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 142:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 143:</span>
              <span style="color: #0000ff">lock</span> (PendingEffects)</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 144:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 145:</span>
              <span style="color: #0000ff">if</span> (!DownloadedEffects.ContainsKey(mediaName))</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 146:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 147:</span> PendingDownloads.Enqueue(mediaName);</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 148:</span> }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 149:</span> PendingEffects.Enqueue(<span style="color: #0000ff">new</span> QueuedEffect</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 150:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 151:</span> MediaName
= mediaName,</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 152:</span> Target
= target,</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 153:</span> StartedCallback
= startedCallback,</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 154:</span> CompletedCallback
= completedCallback</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 155:</span> });</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 156:</span> }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 157:</span> DownloadEffects();</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 158:</span> PlayEffect();</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 159:</span> }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 160:</span> }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 161:</span>  </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 162:</span>
              <span style="color: #0000ff">public</span>
              <span style="color: #0000ff">static</span>
              <span style="color: #0000ff">void</span> SetBackgroundLoop(<span style="color: #0000ff">string</span> mediaName)</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 163:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 164:</span> PlaySound(TargetType.BackgroundMusic,
mediaName, <span style="color: #0000ff">null</span>, <span style="color: #0000ff">null</span>);</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 165:</span> }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 166:</span>  </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 167:</span>
              <span style="color: #0000ff">public</span>
              <span style="color: #0000ff">static</span>
              <span style="color: #0000ff">void</span> PlaySoundEffect(<span style="color: #0000ff">string</span> effectName)</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 168:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 169:</span> PlaySound(TargetType.SoundEffect,
effectName, <span style="color: #0000ff">null</span>, <span style="color: #0000ff">null</span>);</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 170:</span> }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 171:</span>  </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 172:</span>
              <span style="color: #0000ff">public</span>
              <span style="color: #0000ff">static</span>
              <span style="color: #0000ff">void</span> PlaySoundEffect(<span style="color: #0000ff">string</span> effectName,
Action startedCallback, Action completedCallback)</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 173:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 174:</span> PlaySound(TargetType.SoundEffect,
effectName, startedCallback, completedCallback);</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 175:</span> }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 176:</span>  </pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 177:</span>
              <span style="color: #0000ff">public</span>
              <span style="color: #0000ff">static</span>
              <span style="color: #0000ff">void</span> PreloadMedia(<span style="color: #0000ff">string</span> mediaName)</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 178:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 179:</span>
              <span style="color: #0000ff">if</span> (!DownloadedEffects.ContainsKey(mediaName))</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 180:</span> {</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 181:</span> PendingDownloads.Enqueue(mediaName);</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 182:</span> DownloadEffects();</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 183:</span> }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 184:</span> }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 185:</span> }</pre>
            <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
              <span style="color: #606060"> 186:</span> }</pre>
          </div>
        </div>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=ce802397-894c-4772-994b-5d5ba4df3fda" />
      </body>
      <title>A Simple Sound Effects Engine for Silverlight 2</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,ce802397-894c-4772-994b-5d5ba4df3fda.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2008/06/09/ASimpleSoundEffectsEngineForSilverlight2.aspx</link>
      <pubDate>Mon, 09 Jun 2008 21:59:22 GMT</pubDate>
      <description>&lt;p&gt;
Audio support is all too often one of the last things a developer thinks of when it
comes to building a user interface. Fortunately, Silverlight offers some basic building
blocks that make it fairly trivial to add event-driven sounds to our applications.
I have taken the built-in functionality one step further, and created a simple run-time
audio engine that makes it even easier.
&lt;/p&gt;
&lt;p&gt;
First, I will discuss the requirements that I had in mind when I created this engine.
Second, I will discuss the ideal API for a complete solution. Third, I submit the
simple effects engine that I developed in order to meet those requirements and API.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Sound Effects Engine Requirements&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Must be able to play looping “background music” tracks. 
&lt;/li&gt;
&lt;li&gt;
Must be able to play smaller sound effects on demand. 
&lt;/li&gt;
&lt;li&gt;
Must support concurrent (and overlapping) sounds effects without interfering with
already-playing audio. 
&lt;/li&gt;
&lt;li&gt;
Must adequately handle the possibility of download delays when pulling down external
audio files. 
&lt;/li&gt;
&lt;li&gt;
Should cache audio files between playbacks. 
&lt;/li&gt;
&lt;li&gt;
Should allow serving of audio from high-bandwidth CDN such as Silverlight Streaming. 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;An Ideal Sound Effects API&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Should be very approachable. If possible, only a single line of code to play any audio
(similar to PlaySound() API). 
&lt;/li&gt;
&lt;li&gt;
Should support any formats supported by Silverlight. 
&lt;/li&gt;
&lt;li&gt;
Should be efficient. 
&lt;/li&gt;
&lt;li&gt;
Should offer download and playback completion callbacks (for chaining and synchronization). 
&lt;/li&gt;
&lt;li&gt;
Should support aggressive background pre-caching of audio files. 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;The SilverlightToolbox Solution&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
To address the simplicity requirements, this sound effects engine is implemented as
a single static C# class that can be easily included into any Silverlight project.
It can exist in a referenced class library, or can be linked directly into the main
project.
&lt;/p&gt;
&lt;p&gt;
To address looping background music, a single method SetBackgroundLoop() is supplied.
This will begin playback of a single audio clip, and will automatically repeat it.
Only one track can be played as the background loop – calling this method again will
terminate the running track and start the new one. You can also pass String.Empty
to stop all background music.
&lt;/p&gt;
&lt;p&gt;
To address typical sound effect clips. two overloads of the PlaySoundEffect() method
are supplied. The simpler of the two methods will simply play a clip once it has been
downloaded. The extended version allows you to specify a callback for when the clip
has been downloaded and started playing, and a second callback that can be used for
notification that the clip has ended.
&lt;/p&gt;
&lt;p&gt;
To address the scenario where multiple sound effects might be played at the same time,
the engine internally maintains a queue of MediaElements. When a new sound needs to
played, it pulls an unused element and puts it into service. Once the sound is finished,
the element is returned to the queue. This allows Silverlight itself to handle media
mixing, and by caching those MediaElements, it does so without placing undue stress
on the environment.
&lt;/p&gt;
&lt;p&gt;
To address the issue of download delays, the startedCallback and completedCallback
parameters of PlaySoundEffect() were introduced.
&lt;/p&gt;
&lt;p&gt;
To address caching of audio files, a WebClient is used (which in turn leverages the
browser’s cache). Furthermore, the engine will reuse any downloaded file streams (and
is smart enough to not re-queue the same file if it already queued for download).
&lt;/p&gt;
&lt;p&gt;
By using a MediaElement for playback, audio tracks are automatically supported from
streaming sources and Content Delivery Networks, and can be of any type supported
by Silverlight.
&lt;/p&gt;
&lt;p&gt;
To support chaining of audio effects, and to support synchronization of UI with audio,
the PlaySoundEffect() method accepts callback events that are fired when the clip
has been downloaded, and again when it has completed playback. To further help with
UI synchronization, a second utility class is provided (DelayedAction) which provides
a simple wrapper for BackgroundWorker that can be used to easily delay execution of
a block of code after a specified amount of time.
&lt;/p&gt;
&lt;p&gt;
To support pre-caching of audio files, the PreloadMedia() method can be used.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Typical usage:&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
In order for the sound effects engine to function properly, it must be provided with
a top-level XAML container (MediaElement currently will not perform playback without
a parent object). This is done by calling the Initialize() method, typically from
your program’s startup code:
&lt;/p&gt;
&lt;div&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;SoundEffects.Initialize(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.LayoutRoot);&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
After this has been done, background music can be played, and we can also queue up
some sound effect clips for later:
&lt;/p&gt;
&lt;div&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;SoundEffects.SetBackgroundLoop(&lt;span style="color: #006080"&gt;&amp;quot;cautious-path.wma&amp;quot;&lt;/span&gt;);
SoundEffects.PreloadMedia(&lt;span style="color: #006080"&gt;&amp;quot;pop1.wma&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
Then, at various points throughout the application, we can play the sound effect (for
example, in response to a control event):
&lt;/p&gt;
&lt;div&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;SoundEffects.PlaySoundEffect(&lt;span style="color: #006080"&gt;&amp;quot;pop1.wma&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
If at any point we need to delay the sound effect slightly, we can control this be
introducing a short delay:
&lt;/p&gt;
&lt;div&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;DelayedAction.Execute(2.0, () =&amp;gt; SoundEffects.PlaySoundEffect(&lt;span style="color: #006080"&gt;&amp;quot;pop1.wma&amp;quot;&lt;/span&gt;));&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
Complete Source Code for DelayedAction.cs:
&lt;/p&gt;
&lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; background-color: #f4f4f4"&gt;
&lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.ComponentModel;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Threading;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 4:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 5:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; Wintellect.SilverlightToolbox&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 6:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 7:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; DelayedAction&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 8:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 9:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; DelayedCallback&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 10:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 11:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; TimeSpan
Delay { get; set; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 12:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Action
Callback { get; set; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 13:&lt;/span&gt; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 14:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 15:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Execute(&lt;span style="color: #0000ff"&gt;double&lt;/span&gt; seconds,
Action callback)&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 16:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 17:&lt;/span&gt; BackgroundWorker
Delay = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; BackgroundWorker();&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 18:&lt;/span&gt; Delay.DoWork
+= (s, e) =&amp;gt;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 19:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 20:&lt;/span&gt; DelayedCallback
DelayCallback = (DelayedCallback)e.Argument;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 21:&lt;/span&gt; Thread.Sleep(DelayCallback.Delay);&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 22:&lt;/span&gt; e.Result
= DelayCallback.Callback;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 23:&lt;/span&gt; };&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 24:&lt;/span&gt; Delay.RunWorkerCompleted
+= (s, e) =&amp;gt;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 25:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 26:&lt;/span&gt; Action
Callback = e.Result &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; Action;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 27:&lt;/span&gt; Callback();&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 28:&lt;/span&gt; };&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 29:&lt;/span&gt; Delay.RunWorkerAsync(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; DelayedCallback&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 30:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 31:&lt;/span&gt; Delay
= TimeSpan.FromSeconds(seconds),&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 32:&lt;/span&gt; Callback
= callback&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 33:&lt;/span&gt; });&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 34:&lt;/span&gt; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 35:&lt;/span&gt; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 36:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
&amp;#160;
&lt;/p&gt;
&lt;p&gt;
Complete Source Code for SoundEffects.cs:
&lt;/p&gt;
&lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; background-color: #f4f4f4"&gt;
&lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.IO;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 4:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Net;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 5:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Windows;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 6:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Windows.Controls;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 7:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Windows.Media;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 8:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 9:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; Wintellect.SilverlightToolbox&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 10:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 11:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; SoundEffects&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 12:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 13:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Panel
Root;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 14:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; MediaElement
BackgroundLoop = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; MediaElement();&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 15:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; WebClient
EffectDownloader = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; WebClient();&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 16:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 17:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Queue&amp;lt;MediaElement&amp;gt;
AvailableSoundEffectGenerators = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Queue&amp;lt;MediaElement&amp;gt;();&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 18:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;,
Stream&amp;gt; DownloadedEffects = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;,
Stream&amp;gt;();&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 19:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Queue&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt;
PendingDownloads = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Queue&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt;();&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 20:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Queue&amp;lt;QueuedEffect&amp;gt;
PendingEffects = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Queue&amp;lt;QueuedEffect&amp;gt;();&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 21:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Dictionary&amp;lt;MediaElement,
Action&amp;gt; PendingStartupCallbacks = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Dictionary&amp;lt;MediaElement,
Action&amp;gt;();&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 22:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Dictionary&amp;lt;MediaElement,
Action&amp;gt; PendingCompletionCallbacks = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Dictionary&amp;lt;MediaElement,
Action&amp;gt;();&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 23:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 24:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;enum&lt;/span&gt; TargetType&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 25:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 26:&lt;/span&gt; BackgroundMusic,&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 27:&lt;/span&gt; SoundEffect,&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 28:&lt;/span&gt; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 29:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 30:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; QueuedEffect&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 31:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 32:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; MediaName
{ get; set; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 33:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; TargetType
Target { get; set; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 34:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Action
StartedCallback { get; set; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 35:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Action
CompletedCallback { get; set; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 36:&lt;/span&gt; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 37:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 38:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Initialize(Panel
root)&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 39:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 40:&lt;/span&gt; Root
= root;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 41:&lt;/span&gt; InitializeTarget(root,
BackgroundLoop);&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 42:&lt;/span&gt; EffectDownloader.OpenReadCompleted
+= (s, e) =&amp;gt;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 43:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 44:&lt;/span&gt; DownloadedEffects[(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;)e.UserState]
= e.Result;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 45:&lt;/span&gt; DownloadEffects();&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 46:&lt;/span&gt; PlayEffect();&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 47:&lt;/span&gt; };&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 48:&lt;/span&gt; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 49:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 50:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; DownloadEffects()&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 51:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 52:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (PendingDownloads.Count
== 0)&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 53:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 54:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; MediaName
= PendingDownloads.Dequeue();&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 55:&lt;/span&gt; EffectDownloader.OpenReadAsync(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Uri(MediaName,
UriKind.Relative), MediaName);&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 56:&lt;/span&gt; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 57:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 58:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; InitializeTarget(Panel
root, MediaElement target)&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 59:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 60:&lt;/span&gt; target.Width
= 0;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 61:&lt;/span&gt; target.Height
= 0;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 62:&lt;/span&gt; target.Visibility
= Visibility.Collapsed;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 63:&lt;/span&gt; root.Children.Add(target);&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 64:&lt;/span&gt; target.AutoPlay
= &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 65:&lt;/span&gt; target.MediaOpened
+= (s, e) =&amp;gt;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 66:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 67:&lt;/span&gt; MediaElement
Target = s &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; MediaElement;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 68:&lt;/span&gt; Target.Volume
= 0.35;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 69:&lt;/span&gt; Target.Play();&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 70:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (PendingStartupCallbacks.ContainsKey(Target))&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 71:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 72:&lt;/span&gt; Target.Dispatcher.BeginInvoke(PendingStartupCallbacks[Target]);&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 73:&lt;/span&gt; PendingStartupCallbacks.Remove(Target);&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 74:&lt;/span&gt; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 75:&lt;/span&gt; };&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 76:&lt;/span&gt; target.MediaEnded
+= (s, e) =&amp;gt;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 77:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 78:&lt;/span&gt; MediaElement
Target = s &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; MediaElement;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 79:&lt;/span&gt; Target.Stop();&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 80:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (s
== BackgroundLoop)&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 81:&lt;/span&gt; Target.Play();&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 82:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 83:&lt;/span&gt; AvailableSoundEffectGenerators.Enqueue(Target);&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 84:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 85:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (PendingCompletionCallbacks.ContainsKey(Target))&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 86:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 87:&lt;/span&gt; Target.Dispatcher.BeginInvoke(PendingCompletionCallbacks[Target]);&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 88:&lt;/span&gt; PendingCompletionCallbacks.Remove(Target);&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 89:&lt;/span&gt; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 90:&lt;/span&gt; };&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 91:&lt;/span&gt; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 92:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 93:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; MediaElement
GetUnusedEffectGenerator()&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 94:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 95:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (AvailableSoundEffectGenerators.Count
&amp;gt; 0)&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 96:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; AvailableSoundEffectGenerators.Dequeue();&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 97:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 98:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 99:&lt;/span&gt; MediaElement
Result = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; MediaElement();&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 100:&lt;/span&gt; InitializeTarget(Root,
Result);&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 101:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; Result;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 102:&lt;/span&gt; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 103:&lt;/span&gt; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 104:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 105:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; PlayEffect()&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 106:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 107:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;lock&lt;/span&gt; (PendingEffects)&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 108:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 109:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (PendingEffects.Count
== 0)&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 110:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 111:&lt;/span&gt; QueuedEffect
Effect = PendingEffects.Dequeue();&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 112:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (DownloadedEffects.ContainsKey(Effect.MediaName))&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 113:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 114:&lt;/span&gt; MediaElement
TargetElement = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 115:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;switch&lt;/span&gt; (Effect.Target)&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 116:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 117:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;case&lt;/span&gt; TargetType.BackgroundMusic:&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 118:&lt;/span&gt; {
TargetElement = BackgroundLoop; &lt;span style="color: #0000ff"&gt;break&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 119:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;case&lt;/span&gt; TargetType.SoundEffect:&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 120:&lt;/span&gt; {
TargetElement = GetUnusedEffectGenerator(); &lt;span style="color: #0000ff"&gt;break&lt;/span&gt;;
}&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 121:&lt;/span&gt; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 122:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (Effect.StartedCallback
!= &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 123:&lt;/span&gt; PendingStartupCallbacks.Add(TargetElement,
Effect.StartedCallback);&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 124:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (Effect.CompletedCallback
!= &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 125:&lt;/span&gt; PendingCompletionCallbacks.Add(TargetElement,
Effect.CompletedCallback);&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 126:&lt;/span&gt; TargetElement.SetSource(DownloadedEffects[Effect.MediaName]);&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 127:&lt;/span&gt; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 128:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 129:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 130:&lt;/span&gt; PendingEffects.Enqueue(Effect);&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 131:&lt;/span&gt; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 132:&lt;/span&gt; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 133:&lt;/span&gt; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 134:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 135:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; PlaySound(TargetType
target, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; mediaName, Action startedCallback,
Action completedCallback)&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 136:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 137:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (target
== TargetType.BackgroundMusic)&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 138:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (BackgroundLoop.CurrentState
!= MediaElementState.Stopped)&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 139:&lt;/span&gt; BackgroundLoop.Stop();&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 140:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 141:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (mediaName
!= String.Empty)&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 142:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 143:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;lock&lt;/span&gt; (PendingEffects)&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 144:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 145:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!DownloadedEffects.ContainsKey(mediaName))&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 146:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 147:&lt;/span&gt; PendingDownloads.Enqueue(mediaName);&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 148:&lt;/span&gt; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 149:&lt;/span&gt; PendingEffects.Enqueue(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; QueuedEffect&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 150:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 151:&lt;/span&gt; MediaName
= mediaName,&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 152:&lt;/span&gt; Target
= target,&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 153:&lt;/span&gt; StartedCallback
= startedCallback,&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 154:&lt;/span&gt; CompletedCallback
= completedCallback&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 155:&lt;/span&gt; });&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 156:&lt;/span&gt; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 157:&lt;/span&gt; DownloadEffects();&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 158:&lt;/span&gt; PlayEffect();&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 159:&lt;/span&gt; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 160:&lt;/span&gt; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 161:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 162:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; SetBackgroundLoop(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; mediaName)&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 163:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 164:&lt;/span&gt; PlaySound(TargetType.BackgroundMusic,
mediaName, &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 165:&lt;/span&gt; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 166:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 167:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; PlaySoundEffect(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; effectName)&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 168:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 169:&lt;/span&gt; PlaySound(TargetType.SoundEffect,
effectName, &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 170:&lt;/span&gt; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 171:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 172:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; PlaySoundEffect(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; effectName,
Action startedCallback, Action completedCallback)&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 173:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 174:&lt;/span&gt; PlaySound(TargetType.SoundEffect,
effectName, startedCallback, completedCallback);&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 175:&lt;/span&gt; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 176:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 177:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; PreloadMedia(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; mediaName)&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 178:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 179:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!DownloadedEffects.ContainsKey(mediaName))&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 180:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 181:&lt;/span&gt; PendingDownloads.Enqueue(mediaName);&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 182:&lt;/span&gt; DownloadEffects();&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 183:&lt;/span&gt; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 184:&lt;/span&gt; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 185:&lt;/span&gt; }&lt;/pre&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 186:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=ce802397-894c-4772-994b-5d5ba4df3fda" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,ce802397-894c-4772-994b-5d5ba4df3fda.aspx</comments>
      <category>.NET</category>
      <category>Games</category>
      <category>General</category>
      <category>Media</category>
      <category>Silverlight</category>
      <category>Tips and Tricks</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=837ea3df-c41c-45b4-9dce-24fbae8f03ff</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,837ea3df-c41c-45b4-9dce-24fbae8f03ff.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,837ea3df-c41c-45b4-9dce-24fbae8f03ff.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=837ea3df-c41c-45b4-9dce-24fbae8f03ff</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I finally got around to updating my Gem Blaster game from Silverlight 1.1 alpha to
the 2.0 beta bits. Since there were very heavy changes to the control model and other
aspects of the managed runtime, I had to rewrite a lot of the original code (this
was fully expected by the way). While I was in there, I also took the opportunity
to add a number of other new features such as a simple sound FX engine, a self-playing
"demo mode", and a bunch of other improvements.
</p>
        <p>
I intend to update CodePlex soon with the new source code, but for now you can try
out the game here (embedded below). It is hosted on the Silverlight Streaming service,
so feel free to pass the link around (it won't kill *my* servers). If you like, you
can also directly embed the game using the following embeddable HTML snippet:
</p>
        <div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4">
          <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">&lt;iframe 
    src=<span style="color: #006080">"http://silverlight.services.live.com/invoke/5683/GemBlasterV2/iframe.html"</span> scrolling=<span style="color: #006080">"no"</span> frameborder=<span style="color: #006080">"0"</span> style=<span style="color: #006080">"width:800px;
height:625px"</span>&gt; &lt;/iframe&gt;</pre>
        </div>
        <p>
 
</p>
        <p>
          <iframe style="width: 700px; height: 547px" src="http://silverlight.services.live.com/invoke/5683/GemBlasterV2/iframe.html" frameborder="0" scrolling="no">
          </iframe>
        </p>
        <p>
Now that this project has been updated for Silverlight 2, I can move on to my next
game project idea which (I am hoping) should really push the runtime to its limits
:)
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=837ea3df-c41c-45b4-9dce-24fbae8f03ff" />
      </body>
      <title>Gem Blaster updated and enhanced for Silverlight 2</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,837ea3df-c41c-45b4-9dce-24fbae8f03ff.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2008/05/13/GemBlasterUpdatedAndEnhancedForSilverlight2.aspx</link>
      <pubDate>Tue, 13 May 2008 21:37:56 GMT</pubDate>
      <description>&lt;p&gt;
I finally got around to updating my Gem Blaster game from Silverlight 1.1 alpha to
the 2.0 beta bits. Since there were very heavy changes to the control model and other
aspects of the managed runtime, I had to rewrite a lot of the original code (this
was fully expected by the way). While I was in there, I also took the opportunity
to add a number of other new features such as a simple sound FX engine, a self-playing
"demo mode", and a bunch of other improvements.
&lt;/p&gt;
&lt;p&gt;
I intend to update CodePlex soon with the new source code, but for now you can try
out the game here (embedded below). It is hosted on the Silverlight Streaming service,
so feel free to pass the link around (it won't kill *my* servers). If you like, you
can also directly embed the game using the following embeddable HTML snippet:
&lt;/p&gt;
&lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&amp;lt;iframe 
    src=&lt;span style="color: #006080"&gt;"http://silverlight.services.live.com/invoke/5683/GemBlasterV2/iframe.html"&lt;/span&gt; scrolling=&lt;span style="color: #006080"&gt;"no"&lt;/span&gt; frameborder=&lt;span style="color: #006080"&gt;"0"&lt;/span&gt; style=&lt;span style="color: #006080"&gt;"width:800px;
height:625px"&lt;/span&gt;&amp;gt; &amp;lt;/iframe&amp;gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;iframe style="width: 700px; height: 547px" src="http://silverlight.services.live.com/invoke/5683/GemBlasterV2/iframe.html" frameborder="0" scrolling="no"&gt;
&lt;/iframe&gt;
&lt;/p&gt;
&lt;p&gt;
Now that this project has been updated for Silverlight 2, I can move on to my next
game project idea which (I am hoping) should really push the runtime to its limits
:)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=837ea3df-c41c-45b4-9dce-24fbae8f03ff" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,837ea3df-c41c-45b4-9dce-24fbae8f03ff.aspx</comments>
      <category>.NET</category>
      <category>Games</category>
      <category>General</category>
      <category>Silverlight</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=d675d517-3fd7-4549-b4be-52e7bcebd7b8</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,d675d517-3fd7-4549-b4be-52e7bcebd7b8.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,d675d517-3fd7-4549-b4be-52e7bcebd7b8.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=d675d517-3fd7-4549-b4be-52e7bcebd7b8</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
We are happy to announce that the <a href="http://www.atlantacodecamp.com/">2008 Atlanta
Code Camp</a> is coming up soon. We have confirmed the event date of Saturday, March
29th, and it will be held at the Devry University campus in Decatur (this is the same
place as last year).
</p>
        <p>
We are actively seeking speaker submissions for the event. You can get the speaker
form from our <a href="http://www.atlantamspros.com/codecamp/Speakers/tabid/184/Default.aspx">speakers
page</a>. We are also looking for volunteers to help on the day of the event. If you
are interested in volunteering, please <a href="http://www.atlantamspros.com/codecamp/Volunteer/tabid/120/Default.aspx">sign
up here</a>.
</p>
        <p>
Attendee Registration is not open yet, but check back often because it is likely to
fill up quickly once opened.
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=d675d517-3fd7-4549-b4be-52e7bcebd7b8" />
      </body>
      <title>Atlanta Code Camp 2008</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,d675d517-3fd7-4549-b4be-52e7bcebd7b8.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2008/03/03/AtlantaCodeCamp2008.aspx</link>
      <pubDate>Mon, 03 Mar 2008 02:16:11 GMT</pubDate>
      <description>&lt;p&gt;
We are happy to announce that the &lt;a href="http://www.atlantacodecamp.com/"&gt;2008 Atlanta
Code Camp&lt;/a&gt; is coming up soon. We have confirmed the event date of Saturday, March
29th, and it will be held at the Devry University campus in Decatur (this is the same
place as last year).
&lt;/p&gt;
&lt;p&gt;
We are actively seeking speaker submissions for the event. You can get the speaker
form from our &lt;a href="http://www.atlantamspros.com/codecamp/Speakers/tabid/184/Default.aspx"&gt;speakers
page&lt;/a&gt;. We are also looking for volunteers to help on the day of the event. If you
are interested in volunteering, please &lt;a href="http://www.atlantamspros.com/codecamp/Volunteer/tabid/120/Default.aspx"&gt;sign
up here&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Attendee Registration is not open yet, but check back often because it is likely to
fill up quickly once opened.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=d675d517-3fd7-4549-b4be-52e7bcebd7b8" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,d675d517-3fd7-4549-b4be-52e7bcebd7b8.aspx</comments>
      <category>.NET</category>
      <category>Events</category>
      <category>General</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=82d94d55-0dbe-4654-8da5-6204e1ccfcb9</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,82d94d55-0dbe-4654-8da5-6204e1ccfcb9.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,82d94d55-0dbe-4654-8da5-6204e1ccfcb9.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=82d94d55-0dbe-4654-8da5-6204e1ccfcb9</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Monday night, March 3rd (tomorrow), I am lined up to present on the topic of "Surviving
the Multi-core Revolution". This presentation focuses on the concepts and skills needed
to bring scalability and performance to server-based processing.
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=82d94d55-0dbe-4654-8da5-6204e1ccfcb9" />
      </body>
      <title>Speaking at the Atlanta Cutting Edge / Atlanta MS Professionals Tomorrow</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,82d94d55-0dbe-4654-8da5-6204e1ccfcb9.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2008/03/03/SpeakingAtTheAtlantaCuttingEdgeAtlantaMSProfessionalsTomorrow.aspx</link>
      <pubDate>Mon, 03 Mar 2008 02:06:33 GMT</pubDate>
      <description>&lt;p&gt;
Monday night, March 3rd (tomorrow), I am lined up to present on the topic of "Surviving
the Multi-core Revolution". This presentation focuses on the concepts and skills needed
to bring scalability and performance to server-based processing.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=82d94d55-0dbe-4654-8da5-6204e1ccfcb9" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,82d94d55-0dbe-4654-8da5-6204e1ccfcb9.aspx</comments>
      <category>.NET</category>
      <category>Events</category>
      <category>General</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=be21a35a-d4fb-48b8-9a91-833d10556a44</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,be21a35a-d4fb-48b8-9a91-833d10556a44.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,be21a35a-d4fb-48b8-9a91-833d10556a44.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=be21a35a-d4fb-48b8-9a91-833d10556a44</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This year I will be heading to <a href="http://visitmix.com/2008/default.aspx">MIX
in Vegas</a> along with thousands of other UX enthusiasts. I have always had a deep
interest in all things related to User Experience, and for the past couple years have
wished I could attend a MIX event, and finally this year I get to go!
</p>
        <p>
          <a href="http://visitmix.com/2008/default.aspx">
            <img style="border-right: 0px; border-top: 0px; margin: 0px 20px 0px 0px; border-left: 0px; border-bottom: 0px" height="186" alt="blings_9_25_d[1]" src="http://www.mindfusioncorp.com/weblog/content/binary/HeadingtoMIXthisyear_12AAC/blings_9_25_d1.jpg" width="136" align="left" border="0" />
          </a>
        </p>
        <p>
What will I be doing at MIX? Well I will certainly be soaking up any and all information
related to <a href="http://silverlight.net/default.aspx">Silverlight</a> and <a href="http://msdn2.microsoft.com/en-us/netframework/aa663326.aspx">WPF</a>.
I will also stick my head into some of the designer-oriented sessions. It's a good
thing to see how the other half lives. In between sessions I am hoping to meet all
kinds of people who are also passionate about UX. And of course this is Vegas, so
I am sure I will lose a few dollars in a casino at some point and drink more booze
than is healthy.
</p>
        <p>
Joining me will be a number of <a href="http://www.wintellect.com/">Wintellectuals</a> including <a href="http://www.wintellect.com/cs/blogs/sporter/default.aspx">Steve
Porter</a>, <a href="http://www.wintellect.com/TechnicalBioDetail.aspx?Tech=25">Sergio
Loscialo</a>, <a href="http://www.r2musings.com/">Rik Robinson</a>, <a href="http://www.wintellect.com/ManagmentBioDetail.aspx?Mgmt=11">Sara
Faatz</a>, and <a href="http://toddmichellesadie.spaces.live.com/default.aspx">Todd
Fine</a>. I know of a number of other local Atlanta folks will be making the trip
as well: <a href="http://ideakitchn.com/blogs/sean/default.aspx">Sean Gerety</a>, <a href="http://blogs.msdn.com/dougturn/">Doug
Turnure</a>, and <a href="http://adoguy.com/">Shawn Wildermuth</a> to name a few.
Are you going too? If so, let me know and we can get together for a cup of coffee
or a beer.
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=be21a35a-d4fb-48b8-9a91-833d10556a44" />
      </body>
      <title>Heading to MIX this year</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,be21a35a-d4fb-48b8-9a91-833d10556a44.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2008/02/28/HeadingToMIXThisYear.aspx</link>
      <pubDate>Thu, 28 Feb 2008 02:11:59 GMT</pubDate>
      <description>&lt;p&gt;
This year I will be heading to &lt;a href="http://visitmix.com/2008/default.aspx"&gt;MIX
in Vegas&lt;/a&gt; along with thousands of other UX enthusiasts. I have always had a deep
interest in all things related to User Experience, and for the past couple years have
wished I could attend a MIX event, and finally this year I get to go!
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://visitmix.com/2008/default.aspx"&gt;&lt;img style="border-right: 0px; border-top: 0px; margin: 0px 20px 0px 0px; border-left: 0px; border-bottom: 0px" height="186" alt="blings_9_25_d[1]" src="http://www.mindfusioncorp.com/weblog/content/binary/HeadingtoMIXthisyear_12AAC/blings_9_25_d1.jpg" width="136" align="left" border="0"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
What will I be doing at MIX? Well I will certainly be soaking up any and all information
related to &lt;a href="http://silverlight.net/default.aspx"&gt;Silverlight&lt;/a&gt; and &lt;a href="http://msdn2.microsoft.com/en-us/netframework/aa663326.aspx"&gt;WPF&lt;/a&gt;.
I will also stick my head into some of the designer-oriented sessions. It's a good
thing to see how the other half lives. In between sessions I am hoping to meet all
kinds of people who are also passionate about UX. And of course this is Vegas, so
I am sure I will lose a few dollars in a casino at some point and drink more booze
than is healthy.
&lt;/p&gt;
&lt;p&gt;
Joining me will be a number of &lt;a href="http://www.wintellect.com/"&gt;Wintellectuals&lt;/a&gt; including &lt;a href="http://www.wintellect.com/cs/blogs/sporter/default.aspx"&gt;Steve
Porter&lt;/a&gt;, &lt;a href="http://www.wintellect.com/TechnicalBioDetail.aspx?Tech=25"&gt;Sergio
Loscialo&lt;/a&gt;, &lt;a href="http://www.r2musings.com/"&gt;Rik Robinson&lt;/a&gt;, &lt;a href="http://www.wintellect.com/ManagmentBioDetail.aspx?Mgmt=11"&gt;Sara
Faatz&lt;/a&gt;, and &lt;a href="http://toddmichellesadie.spaces.live.com/default.aspx"&gt;Todd
Fine&lt;/a&gt;. I know of a number of other local Atlanta folks will be making the trip
as well: &lt;a href="http://ideakitchn.com/blogs/sean/default.aspx"&gt;Sean Gerety&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/dougturn/"&gt;Doug
Turnure&lt;/a&gt;, and &lt;a href="http://adoguy.com/"&gt;Shawn Wildermuth&lt;/a&gt; to name a few.
Are you going too? If so, let me know and we can get together for a cup of coffee
or a beer.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=be21a35a-d4fb-48b8-9a91-833d10556a44" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,be21a35a-d4fb-48b8-9a91-833d10556a44.aspx</comments>
      <category>.NET</category>
      <category>Events</category>
      <category>General</category>
      <category>Silverlight</category>
      <category>WPF</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=0e94b645-01f4-4e4e-b3d3-0add3b39cc0d</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,0e94b645-01f4-4e4e-b3d3-0add3b39cc0d.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,0e94b645-01f4-4e4e-b3d3-0add3b39cc0d.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=0e94b645-01f4-4e4e-b3d3-0add3b39cc0d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I have uploaded my slides and associated source code that was demonstrated, for the
benefit of those who were not able to attend my session, or for those who have asked
for copies of the code and slides.
</p>
        <p>
I understand that these will be made available from the Alabama Code Camp web site,
but I am also making them available for download from my server as well: <a title="http://www.mindfusioncorp.com/weblog/content/binary/AlabamaCC6-Silverlight-KeithRome.zip" href="http://www.mindfusioncorp.com/weblog/content/binary/AlabamaCC6-Silverlight-KeithRome.zip">http://www.mindfusioncorp.com/weblog/content/binary/AlabamaCC6-Silverlight-KeithRome.zip</a></p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=0e94b645-01f4-4e4e-b3d3-0add3b39cc0d" />
      </body>
      <title>Slides and Code from Alabama Code Camp 6</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,0e94b645-01f4-4e4e-b3d3-0add3b39cc0d.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2008/02/25/SlidesAndCodeFromAlabamaCodeCamp6.aspx</link>
      <pubDate>Mon, 25 Feb 2008 00:20:18 GMT</pubDate>
      <description>&lt;p&gt;
I have uploaded my slides and associated source code that was demonstrated, for the
benefit of those who were not able to attend my session, or for those who have asked
for copies of the code and slides.
&lt;/p&gt;
&lt;p&gt;
I understand that these will be made available from the Alabama Code Camp web site,
but I am also making them available for download from my server as well: &lt;a title="http://www.mindfusioncorp.com/weblog/content/binary/AlabamaCC6-Silverlight-KeithRome.zip" href="http://www.mindfusioncorp.com/weblog/content/binary/AlabamaCC6-Silverlight-KeithRome.zip"&gt;http://www.mindfusioncorp.com/weblog/content/binary/AlabamaCC6-Silverlight-KeithRome.zip&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=0e94b645-01f4-4e4e-b3d3-0add3b39cc0d" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,0e94b645-01f4-4e4e-b3d3-0add3b39cc0d.aspx</comments>
      <category>.NET</category>
      <category>Events</category>
      <category>General</category>
      <category>Silverlight</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=f97bd6f4-2663-41a2-b79f-1c831de93ff2</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,f97bd6f4-2663-41a2-b79f-1c831de93ff2.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,f97bd6f4-2663-41a2-b79f-1c831de93ff2.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=f97bd6f4-2663-41a2-b79f-1c831de93ff2</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I am packing my bags and heading out to Huntsville AL tonight. In the morning I will
be kicking off the Silverlight Track at the <a href="http://www.alabamacodecamp.com/">Alabama
Code Camp</a> with a presentation titled "Tapping into the power of Silverlight 1.0".
My goal with this presentation is to show that although 2.0 will indeed be a phenomenal
release of the Silverlight platform, the currently shipping version is still very
powerful and offers a tremendous amount of value.
</p>
        <p>
If you are planning on attending this Code Camp event, please stop by and listen in!
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=f97bd6f4-2663-41a2-b79f-1c831de93ff2" />
      </body>
      <title>Heading to Alabama Code Camp 6</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,f97bd6f4-2663-41a2-b79f-1c831de93ff2.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2008/02/22/HeadingToAlabamaCodeCamp6.aspx</link>
      <pubDate>Fri, 22 Feb 2008 16:15:08 GMT</pubDate>
      <description>&lt;p&gt;
I am packing my bags and heading out to Huntsville AL tonight. In the morning I will
be kicking off the Silverlight Track at the &lt;a href="http://www.alabamacodecamp.com/"&gt;Alabama
Code Camp&lt;/a&gt; with a presentation titled "Tapping into the power of Silverlight 1.0".
My goal with this presentation is to show that although 2.0 will indeed be a phenomenal
release of the Silverlight platform, the currently shipping version is still very
powerful and offers a tremendous amount of value.
&lt;/p&gt;
&lt;p&gt;
If you are planning on attending this Code Camp event, please stop by and listen in!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=f97bd6f4-2663-41a2-b79f-1c831de93ff2" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,f97bd6f4-2663-41a2-b79f-1c831de93ff2.aspx</comments>
      <category>.NET</category>
      <category>Events</category>
      <category>Silverlight</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=9f0adeec-0abc-4e4f-95e7-3a3a03ecacbb</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,9f0adeec-0abc-4e4f-95e7-3a3a03ecacbb.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,9f0adeec-0abc-4e4f-95e7-3a3a03ecacbb.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=9f0adeec-0abc-4e4f-95e7-3a3a03ecacbb</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Last fall I showed off a new game that I had built using Silverlight 1.1 at a few
User Group meetings across the southeast. I showed the internal "guts" of the puzzle
game, and I think people generally thought it was a really cool project. I promised
that I would make the code available, but never actually got around to publishing
it.
</p>
        <p>
Until tonight.
</p>
        <p>
Gem Blaster is now (finally!) published to CodePlex at <a title="http://www.codeplex.com/gemblaster" href="http://www.codeplex.com/gemblaster">http://www.codeplex.com/gemblaster</a></p>
        <p>
Full source code is available there.
</p>
        <p>
Also, if you just want to play the game (after all, it IS a game, and somewhat addictive
too), I have a "live demo" posted to the Wintellect server here: <a title="http://demo.wintellect.com/gemblaster/default.html" href="http://demo.wintellect.com/gemblaster/default.html">http://demo.wintellect.com/gemblaster/default.html</a></p>
        <p>
          <a href="http://demo.wintellect.com/gemblaster/default.html">
            <img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="278" alt="image" src="http://www.mindfusioncorp.com/weblog/content/binary/SourceCodeforGemBlasterfinallypublishedt_28/image.png" width="355" border="0" />
          </a>
        </p>
        <p>
Enjoy!
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=9f0adeec-0abc-4e4f-95e7-3a3a03ecacbb" />
      </body>
      <title>Source Code for Gem Blaster finally published to CodePlex</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,9f0adeec-0abc-4e4f-95e7-3a3a03ecacbb.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2008/01/31/SourceCodeForGemBlasterFinallyPublishedToCodePlex.aspx</link>
      <pubDate>Thu, 31 Jan 2008 05:00:56 GMT</pubDate>
      <description>&lt;p&gt;
Last fall I showed off a new game that I had built using Silverlight 1.1 at a few
User Group meetings across the southeast. I showed the internal "guts" of the puzzle
game, and I think people generally thought it was a really cool project. I promised
that I would make the code available, but never actually got around to publishing
it.
&lt;/p&gt;
&lt;p&gt;
Until tonight.
&lt;/p&gt;
&lt;p&gt;
Gem Blaster is now (finally!) published to CodePlex at &lt;a title="http://www.codeplex.com/gemblaster" href="http://www.codeplex.com/gemblaster"&gt;http://www.codeplex.com/gemblaster&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Full source code is available there.
&lt;/p&gt;
&lt;p&gt;
Also, if you just want to play the game (after all, it IS a game, and somewhat addictive
too), I have a "live demo" posted to the Wintellect server here: &lt;a title="http://demo.wintellect.com/gemblaster/default.html" href="http://demo.wintellect.com/gemblaster/default.html"&gt;http://demo.wintellect.com/gemblaster/default.html&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://demo.wintellect.com/gemblaster/default.html"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="278" alt="image" src="http://www.mindfusioncorp.com/weblog/content/binary/SourceCodeforGemBlasterfinallypublishedt_28/image.png" width="355" border="0"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Enjoy!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=9f0adeec-0abc-4e4f-95e7-3a3a03ecacbb" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,9f0adeec-0abc-4e4f-95e7-3a3a03ecacbb.aspx</comments>
      <category>.NET</category>
      <category>Games</category>
      <category>General</category>
      <category>Silverlight</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=f0a81bc2-0d28-42cc-9436-4ed8bad5279d</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,f0a81bc2-0d28-42cc-9436-4ed8bad5279d.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,f0a81bc2-0d28-42cc-9436-4ed8bad5279d.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=f0a81bc2-0d28-42cc-9436-4ed8bad5279d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Yes, you read that right. Silverlight 1.0 - <em>as in unmanaged JavaScript</em> -
and 3D.
</p>
        <p>
Last week I was reminded of the <a href="http://www.codeplex.com/FarseerPhysics">FarSeer
Physics engine for XNA and Silverlight 2.0</a>. I have a strange fascination for 3D
software - stemming back from the years when I was a beta tester and plugin developer
for <a href="http://www.caligari.com/default.asp">Caligari trueSpace 3D</a> - so I
decided to poke around in the source code from CodePlex to see what they were doing.
Turns out it was just mostly linear algebra and some simple mechanics - things I remembered
working with many years ago before the age of managed runtimes and rich visual APIs.
Back then we had to do all the heavy lifting with highly optimized C++ routines and
drawing directly to an HWND. But things are different now, and what seemed incredibly
hard in years past really didn't seem all that hard anymore.
</p>
        <p>
So I was inspired I guess.
</p>
        <p>
I know I could have started with the FarSeer code, and built upon that using C# and
targeting the managed runtime. But oh no - that was too easy! I figured that if it
can be done using simple trig and a solid model design, I bet I could make it work
in JavaScript. After all, JavaScript's Math intrinsic object supports Sin() and Cos(),
extensible objects, and arrays - and at the end of the day, that's all one really
needs in order to create a 3D runtime. Sure, it involves a fair amount of matrix operations
and dot-products and cross-products, but all those things can be learned by reading
up on <a href="http://en.wikipedia.org/wiki/Vector_%28spatial%29">Wikipedia</a> these
days (or <a href="http://www.mathreference.com/">mathreference.com</a>).
</p>
        <p>
So with that, I set out to create an unmanaged 3D visualization engine for Silverlight...
</p>
        <p>
I am making the code freely available and have already published out to CodePlex here: <a title="http://www.codeplex.com/polygraph3d" href="http://www.codeplex.com/polygraph3d">http://www.codeplex.com/polygraph3d</a></p>
        <p>
My efforts so far are looking pretty good (I think). Over the course of about 8 hours
of coding and testing, I have the basics working. I can create a 3-dimensional <a href="http://en.wikipedia.org/wiki/Polyhedron">polyhedron</a> (a
mesh if you will), and I can display the object in a Silverlight Canvas. I can apply
scaling, rotations, and positioning of the polyhedra, and I can also build complex
objects using polyhedron groups, each of which has its own local scaling/rotation/position
transforms. It also supports a movable camera and performs rudimentary perspective
correction as well as small optimizations for backface-culling. It currently only
supports simple brushes for the object faces - I would like to implement a real texture
mapping system, but that will require some very creative use of image skewing to pull
it off.
</p>
        <p>
I have <a href="http://demo.wintellect.com/polygraph3d/default.html">a test page</a> up
that demos a simple 3D cube that you can move around the virtual viewport space...
</p>
        <p>
          <a href="http://demo.wintellect.com/polygraph3d/default.html">
            <img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="217" alt="image" src="http://www.mindfusioncorp.com/weblog/content/binary/PolyGraph3DMaking3DhappenwithSilverlig.0_13C6D/image.png" width="288" border="0" />
          </a>
        </p>
        <p>
For sure, it is a very simple demo. Clicking the red, green, and blue axis bars will
move the cube around. The "spin" button introduces a gradual rotation around the Y
axis... but since my rotation transform code is currently broken, the effect isn't
quite what I had in mind. Hopefully I will figure that particular bug out soon.
</p>
        <p>
One major hurdle I encountered was the fact that Silverlight does not let you draw
directly on a Canvas, nor does it let you create your own controls. This posed a problem
since I wanted to display things that simply could not be expressed using 2D XAML.
I "solved" this problem by performing all of the mathematics needed to project the
3D scene into a 2D viewport, and then I use the vertex data from the projected mesh
to build a series of 2D Path elements. It was indeed a dirty trick - but hey, sometimes
you just have to make do with the capabilities of the platform.
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=f0a81bc2-0d28-42cc-9436-4ed8bad5279d" />
      </body>
      <title>PolyGraph3D: Making 3D happen with Silverlight 1.0!</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,f0a81bc2-0d28-42cc-9436-4ed8bad5279d.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2008/01/31/PolyGraph3DMaking3DHappenWithSilverlight10.aspx</link>
      <pubDate>Thu, 31 Jan 2008 03:33:45 GMT</pubDate>
      <description>&lt;p&gt;
Yes, you read that right. Silverlight 1.0 - &lt;em&gt;as in unmanaged JavaScript&lt;/em&gt; -
and 3D.
&lt;/p&gt;
&lt;p&gt;
Last week I was reminded of the &lt;a href="http://www.codeplex.com/FarseerPhysics"&gt;FarSeer
Physics engine for XNA and Silverlight 2.0&lt;/a&gt;. I have a strange fascination for 3D
software - stemming back from the years when I was a beta tester and plugin developer
for &lt;a href="http://www.caligari.com/default.asp"&gt;Caligari trueSpace 3D&lt;/a&gt; - so I
decided to poke around in the source code from CodePlex to see what they were doing.
Turns out it was just mostly linear algebra and some simple mechanics - things I remembered
working with many years ago before the age of managed runtimes and rich visual APIs.
Back then we had to do all the heavy lifting with highly optimized C++ routines and
drawing directly to an HWND. But things are different now, and what seemed incredibly
hard in years past really didn't seem all that hard anymore.
&lt;/p&gt;
&lt;p&gt;
So I was inspired I guess.
&lt;/p&gt;
&lt;p&gt;
I know I could have started with the FarSeer code, and built upon that using C# and
targeting the managed runtime. But oh no - that was too easy! I figured that if it
can be done using simple trig and a solid model design, I bet I could make it work
in JavaScript. After all, JavaScript's Math intrinsic object supports Sin() and Cos(),
extensible objects, and arrays - and at the end of the day, that's all one really
needs in order to create a 3D runtime. Sure, it involves a fair amount of matrix operations
and dot-products and cross-products, but all those things can be learned by reading
up on &lt;a href="http://en.wikipedia.org/wiki/Vector_%28spatial%29"&gt;Wikipedia&lt;/a&gt; these
days (or &lt;a href="http://www.mathreference.com/"&gt;mathreference.com&lt;/a&gt;).
&lt;/p&gt;
&lt;p&gt;
So with that, I set out to create an unmanaged 3D visualization engine for Silverlight...
&lt;/p&gt;
&lt;p&gt;
I am making the code freely available and have already published out to CodePlex here: &lt;a title="http://www.codeplex.com/polygraph3d" href="http://www.codeplex.com/polygraph3d"&gt;http://www.codeplex.com/polygraph3d&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
My efforts so far are looking pretty good (I think). Over the course of about 8 hours
of coding and testing, I have the basics working. I can create a 3-dimensional &lt;a href="http://en.wikipedia.org/wiki/Polyhedron"&gt;polyhedron&lt;/a&gt; (a
mesh if you will), and I can display the object in a Silverlight Canvas. I can apply
scaling, rotations, and positioning of the polyhedra, and I can also build complex
objects using polyhedron groups, each of which has its own local scaling/rotation/position
transforms. It also supports a movable camera and performs rudimentary perspective
correction as well as small optimizations for backface-culling. It currently only
supports simple brushes for the object faces - I would like to implement a real texture
mapping system, but that will require some very creative use of image skewing to pull
it off.
&lt;/p&gt;
&lt;p&gt;
I have &lt;a href="http://demo.wintellect.com/polygraph3d/default.html"&gt;a test page&lt;/a&gt; up
that demos a simple 3D cube that you can move around the virtual viewport space...
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://demo.wintellect.com/polygraph3d/default.html"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="217" alt="image" src="http://www.mindfusioncorp.com/weblog/content/binary/PolyGraph3DMaking3DhappenwithSilverlig.0_13C6D/image.png" width="288" border="0"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
For sure, it is a very simple demo. Clicking the red, green, and blue axis bars will
move the cube around. The "spin" button introduces a gradual rotation around the Y
axis... but since my rotation transform code is currently broken, the effect isn't
quite what I had in mind. Hopefully I will figure that particular bug out soon.
&lt;/p&gt;
&lt;p&gt;
One major hurdle I encountered was the fact that Silverlight does not let you draw
directly on a Canvas, nor does it let you create your own controls. This posed a problem
since I wanted to display things that simply could not be expressed using 2D XAML.
I "solved" this problem by performing all of the mathematics needed to project the
3D scene into a 2D viewport, and then I use the vertex data from the projected mesh
to build a series of 2D Path elements. It was indeed a dirty trick - but hey, sometimes
you just have to make do with the capabilities of the platform.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=f0a81bc2-0d28-42cc-9436-4ed8bad5279d" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,f0a81bc2-0d28-42cc-9436-4ed8bad5279d.aspx</comments>
      <category>.NET</category>
      <category>General</category>
      <category>Silverlight</category>
      <category>Web 2.0</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=9672e524-aca5-4887-ae32-39b920b186eb</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,9672e524-aca5-4887-ae32-39b920b186eb.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,9672e524-aca5-4887-ae32-39b920b186eb.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=9672e524-aca5-4887-ae32-39b920b186eb</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I have not yet found a workaround for this problem.
</p>
        <p>
The setup is simple: Create two Canvas elements. In one canvas, place a MediaElement.
Point the media element to a valid video source. It doesn't matter if it is set to
AutoPlay or not (but if using manual play, then you will need to initiate playback
in some manner after loading).
</p>
        <p>
Now once that video playback has begun (it doesn't matter how), if you remove the
MediaElement from the original canvas using Children.Remove() and then add it to the
other canvas using Children.Add(), then the playback position will reset and will
start playing from the beginning.
</p>
        <p>
I would possibly expect this behavior if the MediaElement has the AutoPlay property
enabled, but this also happens when AutoPlay is false. Basically, as long as the media
is active, it is restarted if you relocate the element to another parent control.
I am guessing this is a bug in the MediaElement's OnLoad implementation that is not
respecting the AutoPlay setting if the media is currently being played, and is internally
calling Stop() and Start().
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=9672e524-aca5-4887-ae32-39b920b186eb" />
      </body>
      <title>Silverlight Bug: MediaElements will restart if their containment lineage changes</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,9672e524-aca5-4887-ae32-39b920b186eb.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2007/12/01/SilverlightBugMediaElementsWillRestartIfTheirContainmentLineageChanges.aspx</link>
      <pubDate>Sat, 01 Dec 2007 05:24:02 GMT</pubDate>
      <description>&lt;p&gt;
I have not yet found a workaround for this problem.
&lt;/p&gt;
&lt;p&gt;
The setup is simple: Create two Canvas elements. In one canvas, place a MediaElement.
Point the media element to a valid video source. It doesn't matter if it is set to
AutoPlay or not (but if using manual play, then you will need to initiate playback
in some manner after loading).
&lt;/p&gt;
&lt;p&gt;
Now once that video playback has begun (it doesn't matter how), if you remove the
MediaElement from the original canvas using Children.Remove() and then add it to the
other canvas using Children.Add(), then the playback position will reset and will
start playing from the beginning.
&lt;/p&gt;
&lt;p&gt;
I would possibly expect this behavior if the MediaElement has the AutoPlay property
enabled, but this also happens when AutoPlay is false. Basically, as long as the media
is active, it is restarted if you relocate the element to another parent control.
I am guessing this is a bug in the MediaElement's OnLoad implementation that is not
respecting the AutoPlay setting if the media is currently being played, and is internally
calling Stop() and Start().
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=9672e524-aca5-4887-ae32-39b920b186eb" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,9672e524-aca5-4887-ae32-39b920b186eb.aspx</comments>
      <category>.NET</category>
      <category>General</category>
      <category>Silverlight</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=4f8bb2fc-43be-4898-ba71-b2402162a612</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,4f8bb2fc-43be-4898-ba71-b2402162a612.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,4f8bb2fc-43be-4898-ba71-b2402162a612.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=4f8bb2fc-43be-4898-ba71-b2402162a612</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I ran into this nasty little bug today... it is not easy to reproduce, but when it
happens it is very annoying to debug.
</p>
        <p>
First, this bug only occurs when you are using a ZIP file to package your external
resources and using a Silverlight Downloader object to bring the package to the browser,
and subsequently using Image.SetSource() to provide the image files to the visual
elements.
</p>
        <p>
Second, it's not really a <em>bug in functionality</em> exactly, but more of a nuisance
to the viewer. You see, the images get displayed correctly, but Silverlight throws
extra error messages.
</p>
        <p>
The problem occurs when you reuse a single image resource from a downloaded zip archive
for multiple Image elements. And it only happens when the two images are assigned
to the same resource consecutively. Example:
</p>
        <p>
          <code>
            <b>function</b>
            <b> downloadComplete(sender, eventArgs)</b>
            <br />
            <b>{</b>
            <br />
            <b>  // this one is OK</b>
            <br />
            <b>  sender.GetHost().FindName(“Image1”).SetSource(sender, “picture.png”);</b>
            <br />
            <b>  // this one fails</b>
            <br />
            <b>  sender.GetHost().FindName(“Image2”).SetSource(sender, “picture.png”);</b>
            <br />
            <b>}</b>
          </code>
        </p>
        <p>
This is using Silverlight 1.0, but I assume the same issue also happens in 1.1.
</p>
        <p>
The problem appears to be related to referencing the same resource twice consecutively.
If you reference another resource from the Downloader between the two calls to SetSource(),
then the problem goes away. Also, if you simply don't reuse the same resource like
this, then it can be avoided.
</p>
        <p>
          <em>
            <font color="#ff0000">UPDATE January 2008: My previous "fix" of referencing another
resource in between uses of the same resource does not seem to always work. In addition,
some Silverlight installations (not all!) are also raising spurious ImageError 4001
messages. The only complete fix I have found is to implement a custom error handler,
and ignore those ImageErrors:</font>
          </em>
        </p>
        <p>
          <code>
            <strong>function </strong>handleError(sender, errorArgs) 
<br /><b>{</b><br /><strong>  </strong>if (errorArgs.errorType == "ImageError" &amp;&amp; errorArgs.errorCode
== 3002)<br />
    {<br />
      // This error is raised sporadically by SetSource<br />
      return;<br />
    }<br />
    if (errorArgs.errorType == "ImageError" &amp;&amp; errorArgs.errorCode
== 4001)<br />
    {<br />
      // This error is raised sporadically by SetSource<br />
      return;<br />
    }<br />
  Silverlight.default_error_handler(sender, errorArgs); 
<br /><b>}</b></code>
        </p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=4f8bb2fc-43be-4898-ba71-b2402162a612" />
      </body>
      <title>Silverlight Bug: Using a packaged image source for multiple Image elements</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,4f8bb2fc-43be-4898-ba71-b2402162a612.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2007/12/01/SilverlightBugUsingAPackagedImageSourceForMultipleImageElements.aspx</link>
      <pubDate>Sat, 01 Dec 2007 05:15:55 GMT</pubDate>
      <description>&lt;p&gt;
I ran into this nasty little bug today... it is not easy to reproduce, but when it
happens it is very annoying to debug.
&lt;/p&gt;
&lt;p&gt;
First, this bug only occurs when you are using a ZIP file to package your external
resources and using a Silverlight Downloader object to bring the package to the browser,
and subsequently using Image.SetSource() to provide the image files to the visual
elements.
&lt;/p&gt;
&lt;p&gt;
Second, it's not really a &lt;em&gt;bug in functionality&lt;/em&gt; exactly, but more of a nuisance
to the viewer. You see, the images get displayed correctly, but Silverlight throws
extra error messages.
&lt;/p&gt;
&lt;p&gt;
The problem occurs when you reuse a single image resource from a downloaded zip archive
for multiple Image elements. And it only happens when the two images are assigned
to the same resource consecutively. Example:
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;&lt;b&gt;function&lt;/b&gt;&lt;b&gt; downloadComplete(sender, eventArgs)&lt;/b&gt; 
&lt;br&gt;
&lt;b&gt;{&lt;/b&gt; 
&lt;br&gt;
&lt;b&gt;&amp;nbsp; // this one is OK&lt;/b&gt; 
&lt;br&gt;
&lt;b&gt;&amp;nbsp; sender.GetHost().FindName(“Image1”).SetSource(sender, “picture.png”);&lt;/b&gt; 
&lt;br&gt;
&lt;b&gt;&amp;nbsp; // this one fails&lt;/b&gt; 
&lt;br&gt;
&lt;b&gt;&amp;nbsp; sender.GetHost().FindName(“Image2”).SetSource(sender, “picture.png”);&lt;/b&gt; 
&lt;br&gt;
&lt;b&gt;}&lt;/b&gt;&lt;/code&gt; 
&lt;p&gt;
This is using Silverlight 1.0, but I assume the same issue also happens in 1.1.
&lt;/p&gt;
&lt;p&gt;
The problem appears to be related to referencing the same resource twice consecutively.
If you reference another resource from the Downloader between the two calls to SetSource(),
then the problem goes away. Also, if you simply don't reuse the same resource like
this, then it can be avoided.
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;&lt;font color=#ff0000&gt;UPDATE January 2008: My previous "fix" of referencing another
resource in between uses of the same resource does not seem to always work. In addition,
some Silverlight installations (not all!) are also raising spurious ImageError 4001
messages. The only complete fix I have found is to implement a custom error handler,
and ignore those ImageErrors:&lt;/font&gt;&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;&lt;strong&gt;function &lt;/strong&gt;handleError(sender, errorArgs) 
&lt;br&gt;
&lt;b&gt;{&lt;/b&gt; 
&lt;br&gt;
&lt;strong&gt;&amp;nbsp; &lt;/strong&gt;if (errorArgs.errorType == "ImageError" &amp;amp;&amp;amp; errorArgs.errorCode
== 3002)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // This error is raised sporadically by SetSource&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (errorArgs.errorType == "ImageError" &amp;amp;&amp;amp; errorArgs.errorCode
== 4001)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // This error is raised sporadically by SetSource&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;Silverlight.default_error_handler(sender, errorArgs); 
&lt;br&gt;
&lt;b&gt;}&lt;/b&gt;&lt;/code&gt; 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=4f8bb2fc-43be-4898-ba71-b2402162a612" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,4f8bb2fc-43be-4898-ba71-b2402162a612.aspx</comments>
      <category>.NET</category>
      <category>General</category>
      <category>Silverlight</category>
      <category>Tips and Tricks</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=a5e3d644-ee68-48bc-bcf7-3a4ea78d5823</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,a5e3d644-ee68-48bc-bcf7-3a4ea78d5823.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,a5e3d644-ee68-48bc-bcf7-3a4ea78d5823.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=a5e3d644-ee68-48bc-bcf7-3a4ea78d5823</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This coming Monday night would normally be our monthly Atlanta MS Pros / Atlanta Cutting
Edge .NET / Atlanta VB.NET user group meeting, but this month we have a special treat
lined up...
</p>
        <p>
Microsoft (aka <a href="http://blogs.msdn.com/dougturn/">Doug Turnure</a>) will be
providing a <strong>FREE</strong> copy of Visual Studio 2008 (Professional Edition)
to the first 150 people that arrive. This is a GREAT way to get an upgrade right away
without having to convince your boss to buy a license! Well, technically we will be
giving out DVDs with the <em>trial</em> version, but as soon as the Retail Packages
are ready, each person that gets a Trial copy on Monday will receive a full Retail
Boxed copy.
</p>
        <p>
So bring your laptop. Most folks will be loading it up right there, so you might as
well join in and get your upgrade on.
</p>
        <p>
And then, after the LoadFestivities, everyone will be welcome to come join in some
XBOX fun... we have 9 (yes, NINE) xbox 360 consoles and 9 matching big-screen TV's,
so there should be plenty of room for everyone to have a good time. The name of the
game is Halo3, so put on your <a href="http://halo.wikia.com/wiki/MJOLNIR_Armor">MJOLNIR</a> armor
and get ready to frag your buddies! And if <a href="http://halo.wikia.com/wiki/John-117">John-117</a> is
too intense for you, we will also have Guitar Hero cranking on some of the consoles...
so you can come and rock out to some <a href="http://www.youtube.com/watch?v=iCJ2gSZdW4o">Hit
Me With Your Best Shot</a> on Easy.
</p>
        <p>
I hear the Master Chief himself might be there to take on challengers!
</p>
        <p>
Please register in advance, so that we can have an accurate count of attendees. <a href="https://www.clicktoattend.com/invitation.aspx?code=123034">The
registration link is here</a>.
</p>
        <p>
Location:
</p>
        <p>
          <a href="http://www.microsoft.com/About/CompanyInformation/usaoffices/southeast/alpharetta.mspx">Microsoft
Corporation [Alpharetta]</a>
          <br />
1125 Sanctuary Pkwy. 
<br />
Suite 300 
<br />
Atlanta, GA 30004
</p>
        <p>
See you there!
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=a5e3d644-ee68-48bc-bcf7-3a4ea78d5823" />
      </body>
      <title>The Atlanta .NET Doubleheader: Visual Studio 2008 Loadfest and XBox Gaming Night</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,a5e3d644-ee68-48bc-bcf7-3a4ea78d5823.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2007/12/01/TheAtlantaNETDoubleheaderVisualStudio2008LoadfestAndXBoxGamingNight.aspx</link>
      <pubDate>Sat, 01 Dec 2007 04:59:37 GMT</pubDate>
      <description>&lt;p&gt;
This coming Monday night would normally be our monthly Atlanta MS Pros / Atlanta Cutting
Edge .NET / Atlanta VB.NET user group meeting, but this month we have a special treat
lined up...
&lt;/p&gt;
&lt;p&gt;
Microsoft (aka &lt;a href="http://blogs.msdn.com/dougturn/"&gt;Doug Turnure&lt;/a&gt;) will be
providing a &lt;strong&gt;FREE&lt;/strong&gt; copy of Visual Studio 2008 (Professional Edition)
to the first 150 people that arrive. This is a GREAT way to get an upgrade right away
without having to convince your boss to buy a license! Well, technically we will be
giving out DVDs with the &lt;em&gt;trial&lt;/em&gt; version, but as soon as the Retail Packages
are ready, each person that gets a Trial copy on Monday will receive a full Retail
Boxed copy.
&lt;/p&gt;
&lt;p&gt;
So bring your laptop. Most folks will be loading it up right there, so you might as
well join in and get your upgrade on.
&lt;/p&gt;
&lt;p&gt;
And then, after the LoadFestivities, everyone will be welcome to come join in some
XBOX fun... we have 9 (yes, NINE) xbox 360 consoles and 9 matching big-screen TV's,
so there should be plenty of room for everyone to have a good time. The name of the
game is Halo3, so put on your &lt;a href="http://halo.wikia.com/wiki/MJOLNIR_Armor"&gt;MJOLNIR&lt;/a&gt; armor
and get ready to frag your buddies! And if &lt;a href="http://halo.wikia.com/wiki/John-117"&gt;John-117&lt;/a&gt; is
too intense for you, we will also have Guitar Hero cranking on some of the consoles...
so you can come and rock out to some &lt;a href="http://www.youtube.com/watch?v=iCJ2gSZdW4o"&gt;Hit
Me With Your Best Shot&lt;/a&gt; on Easy.
&lt;/p&gt;
&lt;p&gt;
I hear the Master Chief himself might be there to take on challengers!
&lt;/p&gt;
&lt;p&gt;
Please register in advance, so that we can have an accurate count of attendees. &lt;a href="https://www.clicktoattend.com/invitation.aspx?code=123034"&gt;The
registration link is here&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Location:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.microsoft.com/About/CompanyInformation/usaoffices/southeast/alpharetta.mspx"&gt;Microsoft
Corporation [Alpharetta]&lt;/a&gt; 
&lt;br&gt;
1125 Sanctuary Pkwy. 
&lt;br&gt;
Suite 300 
&lt;br&gt;
Atlanta, GA 30004
&lt;/p&gt;
&lt;p&gt;
See you there!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=a5e3d644-ee68-48bc-bcf7-3a4ea78d5823" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,a5e3d644-ee68-48bc-bcf7-3a4ea78d5823.aspx</comments>
      <category>.NET</category>
      <category>Events</category>
      <category>Games</category>
      <category>General</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=6eba2c97-8453-4849-86d4-d83c800317c9</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,6eba2c97-8453-4849-86d4-d83c800317c9.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,6eba2c97-8453-4849-86d4-d83c800317c9.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=6eba2c97-8453-4849-86d4-d83c800317c9</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://www.mindfusioncorp.com/weblog/2007/10/23/How+To+Botch+An+Interview+And+Ensure+That+You+Will+Never+Get+An+Offer.aspx">My
last post</a> was somewhat negative. I acknowledge that. I was annoyed. Let me make
amends by posting some useful, positive information for those who find themselves
on the other end of the interview table (or phone).
</p>
        <ol>
          <li>
            <strong>
              <strike>Google</strike> Live Search your interviewer.</strong> Most recruiters
will tell you who will be performing your interview. If they don't venture the information,
then ask for it - chances are if they know then they will tell you. Take that name
and do some research. Get to know what your interviewer is most likely to be questioning
you about. If they have written a book on security best practices, then there is a
pretty good chance they will ask you questions about security. Do drop subtle hints
that you read their weblog - most tech people like to hear that - just be sparing
in it. You don't want to come off as a stalker. 
</li>
          <li>
            <strong>Be honest about your skill level.</strong> Many interviewers will ask you
how you rate yourself, so that they can judge just how delusional you are. Be honest
here. If you claim to be a 10 out of 10 in a subject area, then you had better be
an absolute expert. A 10 out of 10 is expected to know that subject inside and out,
perhaps even teach the interviewer a thing or two. Don't be too humble though. Rating
yourself as a 2 out of 10 is highly unlikely to get you into the interview room in
the first place. 
</li>
          <li>
            <strong>Don't interrupt.</strong> When the interviewer is speaking, never (and I mean
NEVER) forcibly interrupt them. I have had many interviews where the candidate would
inject words, statements, or questions while I was trying to guide the interview
towards the next topic. Doing that does not impress the interviewer with your profound
wisdom. What it does is send a clear message that you feel your thoughts are more
important than the interviewer's... which is nothing but a fast track to bottom of
the resume stack. 
</li>
          <li>
            <strong>Speak clearly.</strong> No need to shout, but you should be certain that you
speak confidently and with ample volume to be heard clearly. Avoid slang terms - especially
cursing! Try to provide concise and accurate answers, with as few "umms" as possible.
And for heavens sake, if you don't know the answer to a question, just say it rather
than trying to BS your way through it. 
</li>
          <li>
            <strong>Be prepared to ask questions about the employer's business and work environment.</strong> Even
if you already know the answers (you did research the company's website beforehand,
didn't you?). This shows an interest in the company and team. 
</li>
          <li>
            <strong>Be prepared to answer strange, sometimes seemingly irrelevant questions during
the interview.</strong> Good interviewers are not looking for right or wrong answers
to every question - they are looking for clues about how you work your way through
problems and how you are able to handle stressful situations. This is especially true
in the Consulting industry, where your reaction to a crisis is often more visible
and more important than the act of correcting the underlying problem itself. 
</li>
          <li>
            <strong>Follow-up.</strong> If you already did a technical screening and are now in
for the "big face to face" interview, chances are good that you missed at least one
of the questions during the screening. You should note those questions during the
initial interview, and research them before going to the main interview - especially
if the interviewer is the same person. Let them know that you felt compelled to research
the topic on your own time, and that you now have an answer for that missed question
if they would like to hear it. Chances are they won't want to hear the answer, but
they will take notice that you followed up and did your homework in between the interviews. 
</li>
          <li>
            <strong>Be calm.</strong> It is normal to be nervous. Some folks even have obvious
nervous twitches that come out in full color during something as stressful as an interview
(sweating, fast talking, jittering). Take a few steps to defeat those demons beforehand
- exercise rigorously the morning before your interview, this will clear your mind
and stabilize your metabolism, which helps control sweating problems. Learn some deep
breathing exercises if you need help calming down beforehand. Never, under any circumstances,
drink a "Double Vente Latte Machiatto" or other "energy drink" less than an hour before
the interview. All that caffeine will lead to a panicky interviewee that talks WAY
too fast and incoherently, and that is trying to hold their bladder for an hour. Nothing
good can come of that. 
</li>
          <li>
            <strong>Sleep well the night before.</strong> Don't study your "interview cheat sheet"
late into the night. Go to bed early, and go to bed with a clear mind. You will not
sleep well if you spend the night ruminating over those questions and answers. In
fact, I understand that taking an over-the-counter aid (if you are healthy enough)
can help. Seasickness medications such as Bonine can clear nausea from "stomach butterflies"
that might precede a stressful interview, and also have the nice side effect of being
a sleeping aid (causes drowsiness). As always, <em><u>check with your doctor</u></em> before
taking something like that. 
</li>
          <li>
            <strong>Smile.</strong> The interviewer is not only looking to see if you know the
technical answers to their questions, they are also evaluating whether they would
want to work with you on a team or not, and if you know how to enjoy working with
others. When interviewing, the measuring stick I often use is to ask myself "Would
I be comfortable having a beer after work with this person?". You might be surprised
how often the answer to that is "no" (especially in the ultra-bizarre circus of tech
workers).</li>
        </ol>
        <p>
And here is a "bonus" tip submitted by David Daughtrey...
</p>
        <p>
11. <strong>Dont eat at the Wing Factory on the night before an interview.</strong> Or
any hot wing establishment for that matter.
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=6eba2c97-8453-4849-86d4-d83c800317c9" />
      </body>
      <title>10 interview tips that will help you land a better job</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,6eba2c97-8453-4849-86d4-d83c800317c9.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2007/10/23/10InterviewTipsThatWillHelpYouLandABetterJob.aspx</link>
      <pubDate>Tue, 23 Oct 2007 18:22:18 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://www.mindfusioncorp.com/weblog/2007/10/23/How+To+Botch+An+Interview+And+Ensure+That+You+Will+Never+Get+An+Offer.aspx"&gt;My
last post&lt;/a&gt; was somewhat negative. I acknowledge that. I was annoyed. Let me make
amends by posting some useful, positive information for those who find themselves
on the other end of the interview table (or phone).
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;strike&gt;Google&lt;/strike&gt; Live Search&amp;nbsp;your interviewer.&lt;/strong&gt; Most recruiters
will tell you who will be performing your interview. If they don't venture the information,
then ask for it - chances are if they know then they will tell you. Take that name
and do some research. Get to know what your interviewer is most likely to be questioning
you about. If they have written a book on security best practices, then there is a
pretty good chance they will ask you questions about security. Do drop subtle hints
that you read their weblog - most tech people like to hear that - just be sparing
in it. You don't want to come off as a stalker. 
&lt;li&gt;
&lt;strong&gt;Be honest about your skill level.&lt;/strong&gt; Many interviewers will ask you
how you rate yourself, so that they can judge just how delusional you are. Be honest
here. If you claim to be a 10 out of 10 in a subject area, then you had better be
an absolute expert. A 10 out of 10 is expected to know that subject inside and out,
perhaps even teach the interviewer a thing or two. Don't be too humble though. Rating
yourself as a 2 out of 10 is highly unlikely to get you into the interview room in
the first place. 
&lt;li&gt;
&lt;strong&gt;Don't interrupt.&lt;/strong&gt; When the interviewer is speaking, never (and I mean
NEVER) forcibly interrupt them. I have had many interviews where the candidate would
inject words, statements,&amp;nbsp;or questions while I was trying to guide the interview
towards the next topic. Doing that does not impress the interviewer with your profound
wisdom. What it does is send a clear message that you feel your thoughts are more
important than the interviewer's... which is nothing but a fast track to bottom of
the resume stack. 
&lt;li&gt;
&lt;strong&gt;Speak clearly.&lt;/strong&gt; No need to shout, but you should be certain that you
speak confidently and with ample volume to be heard clearly. Avoid slang terms - especially
cursing! Try to provide concise and accurate answers, with as few "umms" as possible.
And for heavens sake, if you don't know the answer to a question, just say it rather
than trying to BS your way through it. 
&lt;li&gt;
&lt;strong&gt;Be prepared to ask questions about the employer's business and work environment.&lt;/strong&gt; Even
if you already know the answers (you did research the company's website beforehand,
didn't you?). This shows an interest in the company and team. 
&lt;li&gt;
&lt;strong&gt;Be prepared to answer strange, sometimes seemingly irrelevant questions during
the interview.&lt;/strong&gt; Good interviewers are not looking for right or wrong answers
to every question - they are looking for clues about how you work your way through
problems and how you are able to handle stressful situations. This is especially true
in the Consulting industry, where your reaction to a crisis is often more visible
and more&amp;nbsp;important than the act of correcting the underlying problem itself. 
&lt;li&gt;
&lt;strong&gt;Follow-up.&lt;/strong&gt; If you already did a technical screening and are now in
for the "big face to face" interview, chances are good that you missed at least one
of the questions during the screening. You should note those questions during the
initial interview, and research them before going to the main interview - especially
if the interviewer is the same person. Let them know that you felt compelled to research
the topic on your own time, and that you now have an answer for that missed question
if they would like to hear it. Chances are they won't want to hear the answer, but
they will take notice that you followed up and did your homework in between the interviews. 
&lt;li&gt;
&lt;strong&gt;Be calm.&lt;/strong&gt; It is normal to be nervous. Some folks even have obvious
nervous twitches that come out in full color during something as stressful as an interview
(sweating, fast talking, jittering). Take a few steps to defeat those demons beforehand
- exercise rigorously the morning before your interview, this will clear your mind
and stabilize your metabolism, which helps control sweating problems. Learn some deep
breathing exercises if you need help calming down beforehand. Never, under any circumstances,
drink a "Double Vente Latte Machiatto" or other "energy drink" less than an hour before
the interview. All that caffeine will lead to a panicky interviewee that talks WAY
too fast and incoherently, and that is trying to hold their bladder for an hour. Nothing
good can come of that. 
&lt;li&gt;
&lt;strong&gt;Sleep well the night before.&lt;/strong&gt; Don't study your "interview cheat sheet"
late into the night. Go to bed early, and go to bed with a clear mind. You will not
sleep well if you spend the night ruminating over those questions and answers. In
fact, I understand that taking an over-the-counter aid (if you are healthy enough)
can help. Seasickness medications such as Bonine can clear nausea from "stomach butterflies"
that might precede a stressful interview, and also have the nice side effect of being
a sleeping aid (causes drowsiness). As always, &lt;em&gt;&lt;u&gt;check with your doctor&lt;/u&gt;&lt;/em&gt; before
taking something like that. 
&lt;li&gt;
&lt;strong&gt;Smile.&lt;/strong&gt; The interviewer is not only looking to see if you know the
technical answers to their questions, they are also evaluating whether they would
want to work with you on a team or not, and if you know how to enjoy working with
others. When interviewing, the measuring stick I often use is to ask myself "Would
I be comfortable having a beer after work with this person?". You might be surprised
how often the answer to that is "no" (especially in the ultra-bizarre circus of tech
workers).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
And here is a "bonus" tip submitted by David Daughtrey...
&lt;/p&gt;
&lt;p&gt;
11. &lt;strong&gt;Dont eat at the Wing Factory on the night before an interview.&lt;/strong&gt; Or
any hot wing establishment for that matter.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=6eba2c97-8453-4849-86d4-d83c800317c9" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,6eba2c97-8453-4849-86d4-d83c800317c9.aspx</comments>
      <category>.NET</category>
      <category>General</category>
      <category>Tips and Tricks</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=8d68ab65-25ed-4518-9f5c-ede73580ed73</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,8d68ab65-25ed-4518-9f5c-ede73580ed73.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,8d68ab65-25ed-4518-9f5c-ede73580ed73.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=8d68ab65-25ed-4518-9f5c-ede73580ed73</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I have been in this industry for quite a while... about 15 years. I have spent the
majority of that time in upper-tier roles, or at least as "upper tier" as it can be
without losing touch with the technology itself. I am one of those "hands-on" folks
that would never ask a person on my team to build something that I wasn't 100% positive
that I could (and would) do myself. As a result, my technical skills have
always been kept sharp.
</p>
        <p>
And because of those very solid technical skills, I have almost always been deeply
involved in the recruitment and interview process at whatever companies I have worked
for. I typically perform several interviews per month, sometimes more, sometimes less,
generally depending on hiring urgency or other market conditions. But this morning
I have had without a doubt the WORST interview I have ever had to participate in.
I will not divulge the name or anything else about this person, as that's not my style,
so please do not ask. But what I can do is provide some advice on things you should
NOT do unless you really want to bomb an interview horribly...
</p>
        <hr />
        <p>
What <strong>NOT</strong> to do in an interview:
</p>
        <ol>
          <li>
If you are asked to "self rate" yourself, give yourself a 9 out of 10 in a new "buzz"
technology that you really don't know much about. The interviewer won't know the difference
anyway.</li>
          <li>
Give the recruiter your cell phone number even though you know you get horrible
reception where you expect to be taking technical screening calls.</li>
          <li>
Before starting a technical screening, be sure to tell the interviewer that your skills
are "more broad than deep" so that they will see just how fabulously excellent you
are even if you miss a bunch of the questions.</li>
          <li>
When the interviewer asks an entry-level question that you don't know, complain that
"those kinds of nitpicking questions are for a more junior person than me", and follow
it by "I usually manage people who would answer those kinds of questions".</li>
          <li>
Try to turn the tables on the interviewer if you don't think you are doing well. Try
to convince them that they are being unreasonable by asking them a technical question
of your own. The idea here is to make sure that they can't answer it correctly - in
fact, just make something up! Here is a good one to try: "what’s the parameter five
of the MoveWindow?". Without a doubt, you will have made your point to the interviewer.</li>
          <li>
Be sure to argue with the interviewer that they are wrong about their own entry-level question.
After all, only a moron would claim that "SQL Server" was one of the three "out of
the box" configurable options for Session State storage in ASP.NET.</li>
          <li>
Remember, nothing can prove you wrong, not even Truth itself. If the interviewer isn't
asking you the questions that you want them to ask, then it is surely because they
are not worth your time. In fact, you should tell them that they ask too many nitpicking
questions, and then hang up on them.</li>
        </ol>
        <p>
What a complete tool.
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=8d68ab65-25ed-4518-9f5c-ede73580ed73" />
      </body>
      <title>How to Botch an Interview and Ensure that you will Never get an offer</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,8d68ab65-25ed-4518-9f5c-ede73580ed73.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2007/10/23/HowToBotchAnInterviewAndEnsureThatYouWillNeverGetAnOffer.aspx</link>
      <pubDate>Tue, 23 Oct 2007 16:56:52 GMT</pubDate>
      <description>&lt;p&gt;
I have been in this industry for quite a while... about 15 years. I have spent the
majority of that time in upper-tier roles, or at least as "upper tier" as it can be
without losing touch with the technology itself. I am one of those "hands-on" folks
that would never ask a person on my team to build something that I wasn't 100% positive
that I could (and would) do myself.&amp;nbsp;As a result,&amp;nbsp;my technical skills have
always been kept sharp.
&lt;/p&gt;
&lt;p&gt;
And because of those very solid technical skills, I have almost always been deeply
involved in the recruitment and interview process at whatever companies I have worked
for. I typically perform several interviews per month, sometimes more, sometimes less,
generally depending on hiring urgency or other market conditions. But this morning
I have had without a doubt the WORST interview I have ever had to participate in.
I will not divulge the name or anything else about this person, as that's not my style,
so please do not ask. But what I can do is provide some advice on things you should
NOT do unless you really want to bomb an interview horribly...
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
What &lt;strong&gt;NOT&lt;/strong&gt; to do in an interview:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
If you are asked to "self rate" yourself, give yourself a 9 out of 10 in a new "buzz"
technology that you really don't know much about. The interviewer won't know the difference
anyway.&lt;/li&gt;
&lt;li&gt;
Give the recruiter&amp;nbsp;your cell&amp;nbsp;phone number even though you know you get horrible
reception where you expect to be taking technical screening calls.&lt;/li&gt;
&lt;li&gt;
Before starting a technical screening, be sure to tell the interviewer that your skills
are "more broad than deep" so that they will see just how fabulously excellent you
are even if you miss a bunch of the questions.&lt;/li&gt;
&lt;li&gt;
When the interviewer asks an entry-level question that you don't know, complain that
"those kinds of nitpicking questions are for a more junior person than me", and follow
it by "I usually manage people who would answer those kinds of questions".&lt;/li&gt;
&lt;li&gt;
Try to turn the tables on the interviewer if you don't think you are doing well. Try
to convince them that they are being unreasonable by asking them a technical question
of your own. The idea here is to make sure that they can't answer it correctly - in
fact, just make something up! Here is a good one to try: "what’s the parameter five
of the MoveWindow?". Without a doubt, you will have made your point to the interviewer.&lt;/li&gt;
&lt;li&gt;
Be sure to argue with the interviewer that they are wrong about their own entry-level&amp;nbsp;question.
After all, only a moron would claim that "SQL Server" was one of the three "out of
the box"&amp;nbsp;configurable options for Session State storage in ASP.NET.&lt;/li&gt;
&lt;li&gt;
Remember, nothing can prove you wrong, not even Truth itself. If the interviewer isn't
asking you the questions that you want them to ask, then it is surely because they
are not worth your time. In fact, you should tell them that they ask too many nitpicking
questions, and then hang up on them.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
What a complete tool.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=8d68ab65-25ed-4518-9f5c-ede73580ed73" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,8d68ab65-25ed-4518-9f5c-ede73580ed73.aspx</comments>
      <category>.NET</category>
      <category>General</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=d62d55f9-70e0-4936-8353-486b65bbdd72</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,d62d55f9-70e0-4936-8353-486b65bbdd72.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,d62d55f9-70e0-4936-8353-486b65bbdd72.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=d62d55f9-70e0-4936-8353-486b65bbdd72</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
While it probably will not get as much attention as a Visual Studio or Windows Service
Pack release, the Expression Team blog announced that there is an <a href="http://blogs.msdn.com/expression/archive/2007/10/17/expression-design-service-pack-1-is-now-available.aspx" target="_blank">SP
now available for Expression Design</a> that solves some very nagging issues with
the RTM version of the product. These problems mostly impacted those of us using Design
and Blend with Silverlight, most were a nuisance and had workarounds, but this update
really improves the "flow" of creating a Silverlight or WPF UI.
</p>
        <p>
Some of the "big" fixes from my perspective:
</p>
        <ul>
          <li>
Gradient Midpoints are now exported (glass fanatics across the globe rejoiced). This
was one of my pet peeves with gradients - you could use Midpoints to create truly
spectacular glass and glow effects in Design - but they would end up more along the
lines of "craptacular" when exported to XAML. The workaround wasn't 100% equivalent,
and was fairly annoying (convert midpoints to new gradient stops before exporting).</li>
          <li>
Exporting to XAML will now emit the correct (forward) slash character in image paths
for Silverlight exports. This was an annoying problem when Silverlight 1.0 was sent
to RTM and no longer supported the backslash.</li>
          <li>
Text exported as TextBlocks instead of Paths. Thatsa verra niiice!</li>
        </ul>
        <p>
One thing that hasn't been addressed that still bugs me is how the exporter handles
layers: Each layer becomes a canvas stacked, each stacked on top of the other. This
isn't inherently troublesome, except that the canvases all start at 0,0 and fill the
workspace... which basically means that only the topmost canvas will recieve mouse
events by default. It would be better if the exported canvases were only as large
as they needed to be, and positioned accordingly.
</p>
        <p>
Then again, I guess I could always file a bug/suggestion report that would be more
likely to be seen by the Expression Team...
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=d62d55f9-70e0-4936-8353-486b65bbdd72" />
      </body>
      <title>Expression Design Service Pack 1</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,d62d55f9-70e0-4936-8353-486b65bbdd72.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2007/10/18/ExpressionDesignServicePack1.aspx</link>
      <pubDate>Thu, 18 Oct 2007 23:23:12 GMT</pubDate>
      <description>&lt;p&gt;
While it probably will not get as much attention as a Visual Studio or Windows Service
Pack release, the Expression Team blog announced that there is an &lt;a href="http://blogs.msdn.com/expression/archive/2007/10/17/expression-design-service-pack-1-is-now-available.aspx" target="_blank"&gt;SP
now available for Expression Design&lt;/a&gt; that solves some very nagging issues with
the RTM version of the product. These problems mostly impacted those of us using Design
and Blend with Silverlight, most were a nuisance and had workarounds, but this update
really improves the "flow" of creating a Silverlight or WPF UI.
&lt;/p&gt;
&lt;p&gt;
Some of the "big" fixes from my perspective:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Gradient Midpoints are now exported (glass fanatics across the globe rejoiced). This
was one of my pet peeves with gradients - you could use Midpoints to create truly
spectacular glass and glow effects in Design - but they would end up more along the
lines of "craptacular" when exported to XAML. The workaround wasn't 100% equivalent,
and was fairly annoying (convert midpoints to new gradient stops before exporting).&lt;/li&gt;
&lt;li&gt;
Exporting to XAML will now emit the correct (forward) slash character in image paths
for Silverlight exports. This was an annoying problem when Silverlight 1.0 was sent
to RTM and no longer supported the backslash.&lt;/li&gt;
&lt;li&gt;
Text exported as TextBlocks instead of Paths. Thatsa verra niiice!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
One thing that hasn't been addressed that still bugs me is how the exporter handles
layers: Each layer becomes a canvas stacked, each stacked on top of the other. This
isn't inherently troublesome, except that the canvases all start at 0,0 and fill the
workspace... which basically means that only the topmost canvas will recieve mouse
events by default. It would be better if the exported canvases were only as large
as they needed to be, and positioned accordingly.
&lt;/p&gt;
&lt;p&gt;
Then again, I guess I could always file a bug/suggestion report that would be more
likely to be seen by the Expression Team...
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=d62d55f9-70e0-4936-8353-486b65bbdd72" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,d62d55f9-70e0-4936-8353-486b65bbdd72.aspx</comments>
      <category>.NET</category>
      <category>General</category>
      <category>Silverlight</category>
      <category>WPF</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=6b36aa50-8e18-4a13-96e1-2305314d6fa7</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,6b36aa50-8e18-4a13-96e1-2305314d6fa7.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,6b36aa50-8e18-4a13-96e1-2305314d6fa7.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=6b36aa50-8e18-4a13-96e1-2305314d6fa7</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
John Robbins, the wizard of debugging, is looking for suggestions for the <a href="http://www.devscovery.com/" target="_blank">Devscovery
2008</a> Keynotes. To encourage submissions, he is offering a FREE conference pass
to the person with the best idea. Full price for such a pass is $900, which is a bargain
in itself, but FREE is even BETTER!
</p>
        <p>
The spring Devscovery will be in New York, and the fall Devscovery will be held in
Redmond - the winner will get to choose which event they prefer to attend. Having
attended the fall Redmond conference this year, I HIGHLY recommend it! Even if I weren't
a <a href="http://www.wintellect.com/" target="_blank">Wintellect</a> employee, I
would still be comfortable claiming that this is hands-down the best way to spend
your training time and budget.
</p>
        <p>
To submit a keynote idea, please either <a href="http://www.wintellect.com/cs/blogs/jrobbins/archive/2007/10/17/what-keynote-do-you-want-to-see-devscovery.aspx" target="_blank">comment
on John's post here</a> or email your suggestion directly to him. You can submit as
many ideas as you like.
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=6b36aa50-8e18-4a13-96e1-2305314d6fa7" />
      </body>
      <title>Win a free pass to Devscovery 2008!</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,6b36aa50-8e18-4a13-96e1-2305314d6fa7.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2007/10/18/WinAFreePassToDevscovery2008.aspx</link>
      <pubDate>Thu, 18 Oct 2007 02:16:43 GMT</pubDate>
      <description>&lt;p&gt;
John Robbins, the wizard of debugging, is looking for suggestions for the &lt;a href="http://www.devscovery.com/" target="_blank"&gt;Devscovery
2008&lt;/a&gt; Keynotes. To encourage submissions, he is offering a FREE conference pass
to the person with the best idea. Full price for such a pass is $900, which is a bargain
in itself, but FREE is even BETTER!
&lt;/p&gt;
&lt;p&gt;
The spring Devscovery will be in New York, and the fall Devscovery will be held in
Redmond - the winner will get to choose which event they prefer to attend. Having
attended the fall Redmond conference this year, I HIGHLY recommend it! Even if I weren't
a &lt;a href="http://www.wintellect.com/" target="_blank"&gt;Wintellect&lt;/a&gt; employee, I
would still be comfortable claiming that this is hands-down the best way to spend
your training time and budget.
&lt;/p&gt;
&lt;p&gt;
To submit a keynote idea, please either &lt;a href="http://www.wintellect.com/cs/blogs/jrobbins/archive/2007/10/17/what-keynote-do-you-want-to-see-devscovery.aspx" target="_blank"&gt;comment
on John's post here&lt;/a&gt; or email your suggestion directly to him. You can submit as
many ideas as you like.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=6b36aa50-8e18-4a13-96e1-2305314d6fa7" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,6b36aa50-8e18-4a13-96e1-2305314d6fa7.aspx</comments>
      <category>.NET</category>
      <category>Events</category>
      <category>General</category>
      <category>Silverlight</category>
      <category>WPF</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=2dc2f406-9986-47c6-9f61-75fec96abdc2</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,2dc2f406-9986-47c6-9f61-75fec96abdc2.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,2dc2f406-9986-47c6-9f61-75fec96abdc2.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=2dc2f406-9986-47c6-9f61-75fec96abdc2</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
We have not sent out a bulletin message yet, but we will not be meeting on Monday
9/3 due to the holiday. The next Atlanta Cutting Edge / VBUG / AMP meeting will take
place in October.
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=2dc2f406-9986-47c6-9f61-75fec96abdc2" />
      </body>
      <title>No user group meeting Monday night</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,2dc2f406-9986-47c6-9f61-75fec96abdc2.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2007/09/01/NoUserGroupMeetingMondayNight.aspx</link>
      <pubDate>Sat, 01 Sep 2007 20:52:14 GMT</pubDate>
      <description>&lt;p&gt;
We have not sent out a bulletin message yet, but we will not be meeting on Monday
9/3 due to the holiday. The next Atlanta Cutting Edge / VBUG / AMP meeting will take
place in October.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=2dc2f406-9986-47c6-9f61-75fec96abdc2" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,2dc2f406-9986-47c6-9f61-75fec96abdc2.aspx</comments>
      <category>.NET</category>
      <category>Events</category>
      <category>General</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=89704d6e-be42-4ffa-a84c-09e11ca08b2c</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,89704d6e-be42-4ffa-a84c-09e11ca08b2c.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,89704d6e-be42-4ffa-a84c-09e11ca08b2c.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=89704d6e-be42-4ffa-a84c-09e11ca08b2c</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Steve Porter and myself are driving up to Charlotte tonight to present on Silverlight
at the <a href="http://www.developersguild.org/" target="_blank">Developers Guild</a> meeting.
Steve will be giving an overview of Silverlight features and development, and of course
I will be deconstructing my newest Silverlight game - Gem Blaster!
</p>
        <p>
If you remember Popper!, this is the next generation of that game engine, upgraded
to work with the newer Alpha 1.1 Refresh, and with better graphics and gameplay. You
can also go directly here to play the game: <a title="http://www.mindfusioncorp.com/gemblaster/" href="http://www.mindfusioncorp.com/gemblaster/">http://www.mindfusioncorp.com/gemblaster/</a></p>
        <p>
          <em>
            <strong>EDIT: The game has been moved to the Wintellect servers at: </strong>
          </em>
          <a href="http://www.wintellect.com/gemblaster/">
            <em>
              <strong>http://www.wintellect.com/gemblaster/</strong>
            </em>
          </a>
        </p>
        <p>
          <em>
            <strong>I am also working on getting the source code published to CodePlex, but
it has taken a while due to my very busy work schedule.</strong>
          </em>
        </p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=89704d6e-be42-4ffa-a84c-09e11ca08b2c" />
      </body>
      <title>Speaking in Charlotte tonight</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,89704d6e-be42-4ffa-a84c-09e11ca08b2c.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2007/08/28/SpeakingInCharlotteTonight.aspx</link>
      <pubDate>Tue, 28 Aug 2007 15:14:12 GMT</pubDate>
      <description>&lt;p&gt;
Steve Porter and myself are driving up to Charlotte tonight to present on Silverlight
at the &lt;a href="http://www.developersguild.org/" target=_blank&gt;Developers Guild&lt;/a&gt; meeting.
Steve will be giving an overview of Silverlight features and development, and of course
I will be deconstructing my newest Silverlight game - Gem Blaster!
&lt;/p&gt;
&lt;p&gt;
If you remember Popper!, this is the next generation of that game engine, upgraded
to work with the newer Alpha 1.1 Refresh, and with better graphics and gameplay. You
can also go directly here to play the game: &lt;a title=http://www.mindfusioncorp.com/gemblaster/ href="http://www.mindfusioncorp.com/gemblaster/"&gt;http://www.mindfusioncorp.com/gemblaster/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;&lt;strong&gt;EDIT: The game has been moved to the Wintellect servers at: &lt;/strong&gt;&lt;/em&gt;&lt;a href="http://www.wintellect.com/gemblaster/"&gt;&lt;em&gt;&lt;strong&gt;http://www.wintellect.com/gemblaster/&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;&lt;strong&gt;I am also working on getting the source code published to CodePlex, but
it has taken a while due to my very busy work schedule.&lt;/strong&gt;&lt;/em&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=89704d6e-be42-4ffa-a84c-09e11ca08b2c" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,89704d6e-be42-4ffa-a84c-09e11ca08b2c.aspx</comments>
      <category>.NET</category>
      <category>Events</category>
      <category>General</category>
      <category>Silverlight</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=fdb5fc22-059b-43c3-98d9-e8b4170b94b0</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,fdb5fc22-059b-43c3-98d9-e8b4170b94b0.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,fdb5fc22-059b-43c3-98d9-e8b4170b94b0.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=fdb5fc22-059b-43c3-98d9-e8b4170b94b0</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Using the August CTP of Expression Blend 2? Worried about the lack of a registration
key and that ever-decreasing "remaining days" counter at startup?
</p>
        <p>
The Expression team has released a new refresh build to address that. This build is
supposed to not expire until January 2008. It also has a refreshed Silverlight template
that creates projects compatible with the Alpha 1.1 refresh that shipped earlier this
month. You can go <a title="Blend 2 August CTP Refresh" href="http://www.microsoft.com/expression/products/download.aspx?key=blend2preview" target="_blank">here
to find out more</a>.
</p>
        <p>
Too bad they didn't get in a quick fix for the clipped menus bug too...
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=fdb5fc22-059b-43c3-98d9-e8b4170b94b0" />
      </body>
      <title>Blend 2 August CTP Refresh</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,fdb5fc22-059b-43c3-98d9-e8b4170b94b0.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2007/08/15/Blend2AugustCTPRefresh.aspx</link>
      <pubDate>Wed, 15 Aug 2007 14:05:39 GMT</pubDate>
      <description>&lt;p&gt;
Using the August CTP of Expression Blend 2? Worried about the lack of a registration
key and that ever-decreasing "remaining days" counter at startup?
&lt;/p&gt;
&lt;p&gt;
The Expression team has released a new refresh build to address that. This build is
supposed to not expire until January 2008. It also has a refreshed Silverlight template
that creates projects compatible with the Alpha 1.1 refresh that shipped earlier this
month. You can go &lt;a title="Blend 2 August CTP Refresh" href="http://www.microsoft.com/expression/products/download.aspx?key=blend2preview" target="_blank"&gt;here
to find out more&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Too bad they didn't get in a quick fix for the clipped menus bug too...
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=fdb5fc22-059b-43c3-98d9-e8b4170b94b0" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,fdb5fc22-059b-43c3-98d9-e8b4170b94b0.aspx</comments>
      <category>.NET</category>
      <category>General</category>
      <category>Silverlight</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=d37b340a-b353-4464-8aa5-d5b57f4daa10</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,d37b340a-b353-4464-8aa5-d5b57f4daa10.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,d37b340a-b353-4464-8aa5-d5b57f4daa10.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=d37b340a-b353-4464-8aa5-d5b57f4daa10</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Here is a second Silverlight demo you may or may not have seen already... this one
is from a former colleage, <a title="John West" href="http://johnwest.spaces.live.com/default.aspx" target="_blank">John
West</a>. AirportWait (<a title="http://www.airportwait.com/" href="http://www.airportwait.com/" target="_blank">http://www.airportwait.com/</a>)
is a website that provides congestion data for the various checkpoints in your local
airport (where provided). It basically lets you get an idea of just how early you
should plan on getting to that gate in order to make your flight. Silverlight is being
used to create the polar (circular) charts.
</p>
        <p>
          <a href="http://www.mindfusioncorp.com/weblog/content/binary/AirportWaitSilverlightDemo_10881/image03.png" atomicselection="true">
            <img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="196" src="http://www.mindfusioncorp.com/weblog/content/binary/AirportWaitSilverlightDemo_10881/image0_thumb1.png" width="430" border="0" />
          </a>
        </p>
        <p>
Check it out!
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=d37b340a-b353-4464-8aa5-d5b57f4daa10" />
      </body>
      <title>AirportWait (Silverlight Demo)</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,d37b340a-b353-4464-8aa5-d5b57f4daa10.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2007/08/08/AirportWaitSilverlightDemo.aspx</link>
      <pubDate>Wed, 08 Aug 2007 22:48:16 GMT</pubDate>
      <description>&lt;p&gt;
Here is a second Silverlight demo you may or may not have seen already... this one
is from a former colleage, &lt;a title="John West" href="http://johnwest.spaces.live.com/default.aspx" target="_blank"&gt;John
West&lt;/a&gt;. AirportWait (&lt;a title="http://www.airportwait.com/" href="http://www.airportwait.com/" target="_blank"&gt;http://www.airportwait.com/&lt;/a&gt;)
is a website that provides congestion data for the various checkpoints in your local
airport (where provided). It basically lets you get an idea of just how early you
should plan on getting to that gate in order to make your flight. Silverlight is being
used to create the polar (circular)&amp;nbsp;charts.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.mindfusioncorp.com/weblog/content/binary/AirportWaitSilverlightDemo_10881/image03.png" atomicselection="true"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="196" src="http://www.mindfusioncorp.com/weblog/content/binary/AirportWaitSilverlightDemo_10881/image0_thumb1.png" width="430" border="0"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Check it out!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=d37b340a-b353-4464-8aa5-d5b57f4daa10" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,d37b340a-b353-4464-8aa5-d5b57f4daa10.aspx</comments>
      <category>.NET</category>
      <category>General</category>
      <category>Silverlight</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=5f84a9f0-daef-451d-9e5f-6bf817e64e9c</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,5f84a9f0-daef-451d-9e5f-6bf817e64e9c.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,5f84a9f0-daef-451d-9e5f-6bf817e64e9c.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=5f84a9f0-daef-451d-9e5f-6bf817e64e9c</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Jeff Prosise just published a <a title="Introducing SilverLife" href="http://www.wintellect.com/cs/blogs/jprosise/archive/2007/08/08/introducing-silverlife.aspx" target="_blank">new
code sample</a> to his Wintellect blog to show his Silverlight adaptation of
the classic Game of Life, which he calls "<a title="SilverLife" href="http://www.wintellect.com/silverlife/" target="_blank">SilverLife</a>".
</p>
        <p>
It's a really cool demo of Silverlight capabilities and programming model, and pretty
fun to play with as well. Best of all, he has the source code available to download
as well so you can see exactly how things are being done under the hood.
</p>
        <p>
Go check it out!
</p>
        <p>
          <a href="http://www.mindfusioncorp.com/weblog/content/binary/SilverLifeSilverlightDemoposted_F36C/image03.png" atomicselection="true">
            <img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="347" src="http://www.mindfusioncorp.com/weblog/content/binary/SilverLifeSilverlightDemoposted_F36C/image0_thumb1.png" width="294" border="0" />
          </a>
        </p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=5f84a9f0-daef-451d-9e5f-6bf817e64e9c" />
      </body>
      <title>SilverLife (Silverlight Demo) posted</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,5f84a9f0-daef-451d-9e5f-6bf817e64e9c.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2007/08/08/SilverLifeSilverlightDemoPosted.aspx</link>
      <pubDate>Wed, 08 Aug 2007 21:19:14 GMT</pubDate>
      <description>&lt;p&gt;
Jeff Prosise just published a &lt;a title="Introducing SilverLife" href="http://www.wintellect.com/cs/blogs/jprosise/archive/2007/08/08/introducing-silverlife.aspx" target="_blank"&gt;new
code sample&lt;/a&gt; to&amp;nbsp;his Wintellect blog to show his Silverlight adaptation of
the classic Game of Life, which he calls "&lt;a title="SilverLife" href="http://www.wintellect.com/silverlife/" target="_blank"&gt;SilverLife&lt;/a&gt;".
&lt;/p&gt;
&lt;p&gt;
It's a really cool demo of Silverlight capabilities and programming model, and pretty
fun to play with as well. Best of all, he has the source code available to download
as well so you can see exactly how things are being done under the hood.
&lt;/p&gt;
&lt;p&gt;
Go check it out!
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.mindfusioncorp.com/weblog/content/binary/SilverLifeSilverlightDemoposted_F36C/image03.png" atomicselection="true"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="347" src="http://www.mindfusioncorp.com/weblog/content/binary/SilverLifeSilverlightDemoposted_F36C/image0_thumb1.png" width="294" border="0"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=5f84a9f0-daef-451d-9e5f-6bf817e64e9c" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,5f84a9f0-daef-451d-9e5f-6bf817e64e9c.aspx</comments>
      <category>.NET</category>
      <category>General</category>
      <category>Silverlight</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=bd069e0d-b93f-471c-a0b7-f95d2e0b67f5</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,bd069e0d-b93f-471c-a0b7-f95d2e0b67f5.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,bd069e0d-b93f-471c-a0b7-f95d2e0b67f5.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=bd069e0d-b93f-471c-a0b7-f95d2e0b67f5</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This year, both <a href="http://devcow.com/blogs/jdattis/default.aspx" target="_blank">Dan
Attis</a> and myself recieved <a href="https://mvp.support.microsoft.com/mvpexecsum" target="_blank">MVP
awards</a> from Microsoft. I am very honored that my contributions to the developer
community have been recognized, and I hope to continue giving to the local community
in the years to come... but at least now my wife can see something tangible to show
for all of my involvement (she has a hard time with the fact that I spend almost every
monday night out at UG meetings instead of being home with her).
</p>
        <p>
Anyways, I am very pleased to have been given this award. Special thanks go to <a href="http://blogs.msdn.com/dougturn/default.aspx" target="_blank">Doug
Turnure</a> for supporting us local guys, and also thanks to my wife for putting up
with it all, and both my current (<a href="http://www.wintellect.com/" target="_blank">Wintellect</a>)
and former (<a href="http://www.intellinet.com/" target="_blank">Intellinet</a>) employers
for having the vision to support involvement in the community.
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=bd069e0d-b93f-471c-a0b7-f95d2e0b67f5" />
      </body>
      <title>MVP Award - C#</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,bd069e0d-b93f-471c-a0b7-f95d2e0b67f5.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2007/07/09/MVPAwardC.aspx</link>
      <pubDate>Mon, 09 Jul 2007 15:53:33 GMT</pubDate>
      <description>&lt;p&gt;
This year, both &lt;a href="http://devcow.com/blogs/jdattis/default.aspx" target="_blank"&gt;Dan
Attis&lt;/a&gt; and myself&amp;nbsp;recieved&amp;nbsp;&lt;a href="https://mvp.support.microsoft.com/mvpexecsum" target="_blank"&gt;MVP
awards&lt;/a&gt; from Microsoft. I am very honored that my contributions to the developer
community have been recognized, and I hope to continue giving to the local community
in the years to come... but at least now my wife can see something tangible to show
for all of my involvement (she has a hard time with the fact that I spend almost every
monday night out at UG meetings instead of being home with her).
&lt;/p&gt;
&lt;p&gt;
Anyways, I am very pleased to have been given this award. Special thanks go to &lt;a href="http://blogs.msdn.com/dougturn/default.aspx" target="_blank"&gt;Doug
Turnure&lt;/a&gt; for supporting us local guys, and also thanks to my wife for putting up
with it all, and both my current (&lt;a href="http://www.wintellect.com/" target="_blank"&gt;Wintellect&lt;/a&gt;)
and former (&lt;a href="http://www.intellinet.com/" target="_blank"&gt;Intellinet&lt;/a&gt;) employers
for having the vision to support involvement in the community.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=bd069e0d-b93f-471c-a0b7-f95d2e0b67f5" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,bd069e0d-b93f-471c-a0b7-f95d2e0b67f5.aspx</comments>
      <category>.NET</category>
      <category>General</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=7c6c9e1e-d14e-4942-825c-ea16fb82be32</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,7c6c9e1e-d14e-4942-825c-ea16fb82be32.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,7c6c9e1e-d14e-4942-825c-ea16fb82be32.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=7c6c9e1e-d14e-4942-825c-ea16fb82be32</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
On Monday, July 9th (thats today!), Microsoft is trucking in a bunch of evangelists
who will participate in an impromptu user group meeting at the Microsoft campus.
</p>
        <p>
There will be three "tracks" of sessions, one covering Vista Internals (by Brian Hitney
- NC), another covering Silverlight (by David Isbitski - PA), and the third covering
the ASP.NET Provider Model (by Danilo Diaz - PA). After the main presentations, there
will be an open Q&amp;A period followed by "Whose Slide is it Anyway?" featuring Dev
Evangelists being asked to present for a couple minutes based on a slide from someone
else's decks that they have never seen before.
</p>
        <p>
The festivities will begin as 6:30pm. If you have been to a Microsoft User Group meeting
in the past 2 years, then you already know the place. If not, then the map and directions
from <a href="http://www.atlantace.com/MeetingLocation.aspx" target="_blank">this
page on the Cutting Edge User Group website</a> should get you there.
</p>
        <p>
          <a href="http://blogs.msdn.com/dougturn/archive/2007/07/06/whose-slide-is-it-anyway-atlanta.aspx" target="_blank">Doug
Turnure has more information about the event on his weblog here</a>.
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=7c6c9e1e-d14e-4942-825c-ea16fb82be32" />
      </body>
      <title>Whose Slide is it anyway?</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,7c6c9e1e-d14e-4942-825c-ea16fb82be32.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2007/07/09/WhoseSlideIsItAnyway.aspx</link>
      <pubDate>Mon, 09 Jul 2007 15:41:13 GMT</pubDate>
      <description>&lt;p&gt;
On Monday, July 9th (thats today!), Microsoft is trucking in a bunch of evangelists
who will participate in an impromptu user group meeting at the Microsoft campus.
&lt;/p&gt;
&lt;p&gt;
There will be three "tracks" of sessions, one covering Vista Internals (by Brian Hitney
- NC), another covering Silverlight (by David Isbitski - PA), and the third covering
the ASP.NET Provider Model (by Danilo Diaz - PA). After the main presentations, there
will be an open Q&amp;amp;A period followed by "Whose Slide is it Anyway?" featuring Dev
Evangelists being asked to present for a couple minutes based on a slide from someone
else's decks that they have never seen before.
&lt;/p&gt;
&lt;p&gt;
The festivities will begin as 6:30pm. If you have been to a Microsoft User Group meeting
in the past 2 years, then you already know the place. If not, then the map and directions
from &lt;a href="http://www.atlantace.com/MeetingLocation.aspx" target="_blank"&gt;this
page on the Cutting Edge User Group website&lt;/a&gt; should get you there.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blogs.msdn.com/dougturn/archive/2007/07/06/whose-slide-is-it-anyway-atlanta.aspx" target="_blank"&gt;Doug
Turnure has more information about the event on his weblog here&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=7c6c9e1e-d14e-4942-825c-ea16fb82be32" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,7c6c9e1e-d14e-4942-825c-ea16fb82be32.aspx</comments>
      <category>.NET</category>
      <category>Events</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=6a776eeb-8caa-4e90-800e-d05db67598b1</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,6a776eeb-8caa-4e90-800e-d05db67598b1.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,6a776eeb-8caa-4e90-800e-d05db67598b1.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=6a776eeb-8caa-4e90-800e-d05db67598b1</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Popper! is a simple Silverlight puzzle game. I wrote it as an exercise of my own skill
with the platform, but then decided it was a rather fun (at least for a little while...)
little game, so I am sharing it with the rest of the developer community. Popper!
is written against Silverlight 1.1 alpha, and is mostly in C#, although the initial
splash screen is done using unmanaged javaScript (yes, on purpose).
</p>
        <p>
I will be walking through the innards of Popper! at the <a title="Atlanta Cutting Edge .NET" href="http://www.atlantace.com/" target="_blank">Atlanta
Cutting Edge .NET User Group</a> meeting tonight. So if you will be attending, then
come check it out. Or if you just want to kill some time at "work" today... then play
with it a little and let me know how it goes (good or bad)...
</p>
        <p>
          <a title="Popper!" href="http://www.mindfusioncorp.com/popper/" target="_blank">http://www.mindfusioncorp.com/popper/</a>
        </p>
        <p>
I know of one minor bug so far: if you try to click around while a set of bubbles
is in the process of "popping", then an error is raised internally, and the game pretty
much stops working. I just haven't had the time to get that bug addressed yet.
</p>
        <p>
          <a href="http://www.mindfusioncorp.com/weblog/content/binary/Popper_25A4/image04.png" atomicselection="true">
            <img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="235" src="http://www.mindfusioncorp.com/weblog/content/binary/Popper_25A4/image0_thumb2.png" width="379" border="0" />
          </a>
        </p>
        <p>
I intend to post the source for this sometime after this month's meeting. Pretty much
that equates to "when I have time to do it".
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=6a776eeb-8caa-4e90-800e-d05db67598b1" />
      </body>
      <title>Popper!</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,6a776eeb-8caa-4e90-800e-d05db67598b1.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2007/07/02/Popper.aspx</link>
      <pubDate>Mon, 02 Jul 2007 06:40:42 GMT</pubDate>
      <description>&lt;p&gt;
Popper! is a simple Silverlight puzzle game. I wrote it as an exercise of my own skill
with the platform, but then decided it was a rather fun (at least for a little while...)
little game, so I am sharing it with the rest of the developer community. Popper!
is written against Silverlight 1.1 alpha, and is mostly in C#, although the initial
splash screen is done using unmanaged javaScript (yes, on purpose).
&lt;/p&gt;
&lt;p&gt;
I will be&amp;nbsp;walking through the innards of Popper!&amp;nbsp;at the &lt;a title="Atlanta Cutting Edge .NET" href="http://www.atlantace.com/" target="_blank"&gt;Atlanta
Cutting Edge .NET User Group&lt;/a&gt; meeting tonight. So if you will be attending, then
come check it out. Or if you just want to kill some time at "work" today... then play
with it a little and let me know how it goes (good or bad)...
&lt;/p&gt;
&lt;p&gt;
&lt;a title="Popper!" href="http://www.mindfusioncorp.com/popper/" target="_blank"&gt;http://www.mindfusioncorp.com/popper/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
I know of one minor bug so far: if you try to click around while a set of bubbles
is in the process of "popping", then an error is raised internally, and the game pretty
much stops working. I just haven't had the time to get that bug addressed yet.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.mindfusioncorp.com/weblog/content/binary/Popper_25A4/image04.png" atomicselection="true"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="235" src="http://www.mindfusioncorp.com/weblog/content/binary/Popper_25A4/image0_thumb2.png" width="379" border="0"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
I intend to post the source for this sometime after this month's meeting. Pretty much
that equates to "when I have time to do it".
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=6a776eeb-8caa-4e90-800e-d05db67598b1" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,6a776eeb-8caa-4e90-800e-d05db67598b1.aspx</comments>
      <category>.NET</category>
      <category>Events</category>
      <category>General</category>
      <category>Silverlight</category>
      <category>Web 2.0</category>
      <category>WPF</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=15d7ab03-1ca0-4728-bdba-3640657e6d19</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,15d7ab03-1ca0-4728-bdba-3640657e6d19.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,15d7ab03-1ca0-4728-bdba-3640657e6d19.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=15d7ab03-1ca0-4728-bdba-3640657e6d19</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <em>
            <strong>UPDATE 10/25/2007:</strong> Updated this sample to function correctly
with the Silverlight 1.0 release. The main changes necessary were the typical 0.9
to 1.0 changes (remove "Sys.", isWindowless now takes a string and not a boolean,
event handlers no longer string based), and I also had to explicitly set the z-index
of the INPUT element. Thank you Erik for bringing it to my attention.</em>
        </p>
        <p>
 
</p>
        <p>
I have seen a lot of questions and confusion regarding capturing input when using
Silverlight. There are no Button, TextBox, or other similar controls to work with.
I see many folks asking for help with building their own directly within Silverlight
- and bless their hearts, that is a daunting task indeed! The UI model currently does
not offer basic input capture features such as "focus" or "tabbing", or even control-level
keystroke capture. So folks tend to start building those basic services first, before
they ever even get to writing code and xaml to support that simple textbox they need.
</p>
        <p>
If you read that first paragraph and thought "thats crazy, it shouldn't be that hard!",
then I would agree with you. Fortunately, there is a FAR easier and more robust way
to achieve the same thing. In fact, its something that is not new to Silverlight at
all, it's been with us for years. I am of course talking about the tried-and-true
html &lt;input&gt; tag.
</p>
        <p>
One of the most overlooked aspects of Silverlight is that it is a component, not a
platform. Your browser is the platform. It can do a lot of stuff, if you just ask
it to. Nobody wants an entire site as a single Silverlight canvas, just like nobody
wants an entire site as a Flash canvas (unless possibly it is a mini-game or rich
media application)... Flash designers realized this fact years ago. And as a component,
a <em>part</em> of the solution if you will, Silverlight can play nicely with it's
neighbors. With just a little bit of effort and sprinkling a very minimal amount of
javascript pixie dust, we can get a Silverlight applet talking to the rest of
our html DOM. And that's exactly what I am going to show in this topic...
</p>
        <p>
          <em>
            <strong>You can download the code demonstrated in this article here (<a href="http://www.mindfusioncorp.com/weblog/content/binary/QuickTip-TextboxesInSilverlight.zip">QuickTip-TextboxesInSilverlight.zip</a>).</strong>
          </em>
        </p>
        <p>
First of all, I am doing this with Silverlight 1.0 beta (the javascript one), as I
think the 1.1 alpha is far too likely to change, and this technique <em>should</em> work
with either. That, and I am lazy and don't want to come back and revisit this post
later to correct the code...
</p>
        <p>
Secondly, I am using the current CTP builds of Visual Studio Orcas and Blend 2 (the
May 2007 bits), both with the Silverlight extensions. If you are using something else,
then your mileage may vary.
</p>
        <p>
          <em>
            <strong>UPDATE 10/25/2007:</strong> Code updated for VS2008 beta2 and the RTM
version of Silverlight 1.0.</em>
        </p>
        <p>
Now on to the code... to be sure we are on the same page, I am creating a new project
from scratch...
</p>
        <p>
First, Create a new project in Blend. Select the Silverlight 1.0 (JavaScript) project
type. It does not matter what you name the project, but for this example I went with
"TextboxesInSilverlight".
</p>
        <p>
          <a href="http://www.mindfusioncorp.com/weblog/content/binary/QuickTipInputControlsinSilverlight_E5E5/image06.png" atomicselection="true">
            <img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="142" src="http://www.mindfusioncorp.com/weblog/content/binary/QuickTipInputControlsinSilverlight_E5E5/image0_thumb4.png" width="419" border="0" />
          </a>
        </p>
        <p>
Switch to XAML view and replace the default canvas with this markup:<font color="#0000ff" size="2"><br /></font></p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p>
            <font color="#0000ff" size="2">
              <font face="Courier New" color="#ff0000">
                <font color="#0000ff">&lt;</font>
                <font color="#a52a2a">Canvas</font>
                <br />
 xmlns<font color="#0000ff">=</font><font color="#000000">"</font></font>
              <a href="http://schemas.microsoft.com/client/2007">
                <font face="Courier New" color="#0000ff">http://schemas.microsoft.com/client/2007</font>
              </a>
              <font face="Courier New" color="#ff0000">
                <font color="#000000">"</font>
                <br />
 xmlns:x<font color="#0000ff">=</font><font color="#000000">"</font></font>
              <a href="http://schemas.microsoft.com/winfx/2006/xaml">
                <font face="Courier New" color="#0000ff">http://schemas.microsoft.com/winfx/2006/xaml</font>
              </a>
              <font face="Courier New" color="#ff0000">
                <font color="#000000">"</font>
                <br />
 Width<font color="#0000ff">=<font color="#000000">"</font>252</font><font color="#000000">"</font> Height<font color="#0000ff">=<font color="#000000">"</font>272</font><font color="#000000">"</font><br />
 Background<font color="#0000ff">=<font color="#000000">"</font>#FFFF2121</font><font color="#000000">"</font><br />
 <font color="#0000ff">&gt;</font><br />
  <font color="#0000ff">&lt;</font><font color="#a52a2a">TextBlock</font> Width<font color="#0000ff">=<font color="#000000">"</font>64</font><font color="#000000">"</font> Height<font color="#0000ff">=<font color="#000000">"</font>24</font><font color="#000000">"</font> Canvas.Left<font color="#0000ff">=<font color="#000000">"</font>8</font><font color="#000000">"</font> Canvas.Top<font color="#0000ff">=<font color="#000000">"</font>8</font><font color="#000000">"</font><br />
             Text<font color="#0000ff">=<font color="#000000">"</font>Opacity</font><font color="#000000">"</font> TextWrapping<font color="#0000ff">=<font color="#000000">"</font>Wrap<font color="#000000">"</font>/&gt;</font><br />
  <font color="#0000ff">&lt;</font><font color="#a52a2a">Ellipse</font> Opacity<font color="#0000ff">=<font color="#000000">"</font>1</font><font color="#000000">"</font> Fill<font color="#0000ff">=<font color="#000000">"</font>#FF0406FF</font><font color="#000000">"</font> Stroke<font color="#0000ff">=<font color="#000000">"</font>#FF000000</font><font color="#000000">"</font><br />
           x:Name<font color="#0000ff">=<font color="#000000">"</font>TheCircle</font><font color="#000000">"</font> Width<font color="#0000ff">=<font color="#000000">"</font>180</font><font color="#000000">"</font> Height<font color="#0000ff">=<font color="#000000">"</font>180</font><font color="#000000">"</font> <br />
           Canvas.Left<font color="#0000ff">=<font color="#000000">"</font>36</font><font color="#000000">"</font> Canvas.Top<font color="#0000ff">=<font color="#000000">"</font>64<font color="#000000">"</font>/&gt;</font><br /><font color="#0000ff">&lt;/</font><font color="#a52a2a">Canvas</font><font color="#0000ff">&gt;</font></font>
            </font>
          </p>
        </blockquote>
        <p>
This will create a simple red canvas, with a blue circle.
</p>
        <p>
At this point, I generally switch over to Visual Studio Orcas since Blend does not
have Intellisense nor does it really know how to deal with JavaScript. You can do
this easily by right-clicking a project item (such as the xaml file) and selecting
"Edit in Visual Studio".
</p>
        <p>
          <a href="http://www.mindfusioncorp.com/weblog/content/binary/QuickTipInputControlsinSilverlight_E5E5/image011.png" atomicselection="true">
            <img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="214" src="http://www.mindfusioncorp.com/weblog/content/binary/QuickTipInputControlsinSilverlight_E5E5/image0_thumb7.png" width="217" border="0" />
          </a>
        </p>
        <p>
Next, we need to do one small housekeeping chore to make sure that our Silverlight
canvas plays nicely - specifically, we need to ask it to operate "windowless", which
will allow other dhtml elements to overlay it, Open the Default.html.js file, and
modify the call to Silverlight.createObjectEx(). We want to add the parameter for
isWindowless...
</p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p>
            <font face="Courier New"> Silverlight.createObjectEx({<br />
  source: <font color="#a52a2a">"Scene.xaml"</font>,<br />
  parentElement: document.getElementById(<font color="#a52a2a">"</font><font color="#a52a2a">SilverlightControlHost</font><font color="#a52a2a">"</font>),<br />
  id: <font color="#a52a2a">"SilverlightControl"</font>,<br />
  properties: {<br />
   width: <font color="#a52a2a">"100%"</font>,<br />
   height: <font color="#a52a2a">"100%"</font>,<br />
   version: <font color="#a52a2a">"0.9"</font>,<br />
   isWindowless: <font color="#a52a2a">"true"</font><br />
  },<br />
  events: {<br />
   onLoad: sceneLoaded<br />
  }<br />
 });</font>
            <br />
          </p>
        </blockquote>
        <p>
To make things a bit more "clean", we will create the input element directly from
code, however it's always good to control visual styling with CSS. Therefore, open
up the Default.html, and alter the &lt;style&gt; tag to match the following: 
</p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p>
            <font face="Courier New"> <font color="#0000ff">&lt;</font><font color="#a52a2a">style</font><font color="#ff0000">type</font><font color="#0000ff">="text/css"&gt;</font><br />
  <font color="#a52a2a">div</font>, <font color="#a52a2a">body</font>, <font color="#a52a2a">input</font><br />
  {<br />
   <font color="#ff0000">margin</font>: <font color="#0000ff">0</font>;<br />
   <font color="#ff0000">padding</font>: <font color="#0000ff">0</font>;<br />
  }<br />
  <font color="#a52a2a">#opacity</font><br />
  {<br />
   <font color="#ff0000">margin</font>: -<font color="#0000ff">272px
0 0 75px</font>;<br />
   <font color="#ff0000">z-index<font color="#000000">:</font></font><font color="#000000"><font color="#0000ff">100</font>;</font><br />
  }<br />
  <font color="#a52a2a">.silverlightHost</font><br />
  {<br />
   <font color="#ff0000">margin</font>: <font color="#0000ff">40px
auto auto auto</font>;<br />
   <font color="#ff0000">height</font>: <font color="#0000ff">272px</font>;<br />
   <font color="#ff0000">width</font>: <font color="#0000ff">252px</font>;<br />
  }<br />
 &lt;/<font color="#a52a2a">style</font>&gt;</font>
          </p>
        </blockquote>
        <p>
This will handle the placement and sizing of the silverlight container &lt;div&gt;
as well as the input control itself. The negative margin is not a typo - this is used
to pull the input control "on top" of the silverlight canvas. We could have also used
absolute positioning, but that is much more brittle, relative positioning FTW. Also,
notice the use of "auto" margins for the main Silverlight Host &lt;div&gt;. This is
how you can center content without resorting to using &lt;center&gt; or &lt;table&gt;...
if you take nothing away from this post, at least remember that one trick. 
</p>
        <p>
The last thing we must do is wire the whole thing up. This can be done in many places,
in many ways. I consider this particular TextBox to be an extension of the Xaml "scene",
so I will add my code to the TextboxesInSilverlight.Scene class which was created
for us by the Blend project template. This is not the only place you could do this
kind of code, but I found that in this particular example it made the most sense.
Had I been building a dialog for a game engine, I might have this code in a seperate
script file that manages my game mechanics (but thats another article...). 
</p>
        <p>
First, we need to capture a global reference to the Scene object that is created (this
object is instantiated by the createSilverlight() function of the Default.html.js
script file we edited in a previous step). The purpose of capturing this reference
is that we will need it later in an event handler. This will allow our html &lt;input&gt;
control to communicate back with the silverlight content. This is easier done than
said. Open the Scene.xaml.js file. Just before the definition of the TextboxesInSilverlight.Scene.prototype
(look up javascript prototype for what this is if you are interested, but that discussion
is out of scope for this article), add a line of code to declare the global reference: 
</p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p>
            <font face="Courier New">
              <font color="#0000ff">var</font> globalScene = <font color="#0000ff">null</font>; </font>
          </p>
        </blockquote>
        <p>
Now we will create a callback function that will be used to create our JavaScript
object and initialize it: 
</p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <pre>
            <font color="#0000ff">function</font> sceneLoaded(control,
userContext, rootElement)<br />
{<br />
    globalScene = <font color="#0000ff">new</font> TextboxesInSilverlight.Scene();<br />
    globalScene.handleLoad(control, userContext, rootElement);<br />
}; </pre>
        </blockquote>
        <p>
Now, the idea for this example is that the value of the text box will determine the
"Opacity" Xaml property of the Ellipse shape in our markup. In order for the event
handler we are about to add to be able to do this, we will capture a reference to
the circle object (technically we can wait and use findName() later during the event
handler, but I prefer to capture it only once - its just my style of coding). Add
this line to the handleLoad function: 
</p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p>
            <font face="Courier New">
              <font color="#0000ff">this</font>.circle = control.content.findName(<font color="#a52a2a">"TheCircle"</font>);</font>
          </p>
        </blockquote>
        <p>
Next, we will create the input control and add it to the DHTML document. We will add
it directly to the same &lt;div&gt; that Silverlight has injected itself into, and
therefore any layout or positioning that affects the Silverlight canvas will also
affect our &lt;input&gt; box. Add this code to the end of the handleLoad function: 
</p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p>
            <font face="Courier New">
              <font color="#0000ff">var</font> opacityEdit = window.document.createElement(<font color="#a52a2a">"input"</font>);<br />
opacityEdit.type = <font color="#a52a2a">"text"</font>;<br />
opacityEdit.id = <font color="#a52a2a">"opacity"</font>;<br />
opacityEdit.name = <font color="#a52a2a">"opacity"</font>;<br />
opacityEdit.value = <font color="#a52a2a">"1.0"</font></font>;
</p>
        </blockquote>
        <p>
We are almost done - only two more steps and then we can fire this thing up! First,
we need to add an event handler to react to changes in the value property of the input
control. Add this code to the very end of the handleLoad function: 
</p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p>
            <font face="Courier New">opacityEdit.onpropertychange = <font color="#0000ff">function</font>()<br />
    {<br />
        <font color="#0000ff">if</font> (<font color="#0000ff">event</font>.propertyName
== <font color="#a52a2a">"value"</font>)<br />
        {<br />
            globalScene.circle.Opacity
= <font color="#0000ff">event</font>.srcElement.value;<br />
        }<br />
    }</font>
          </p>
        </blockquote>
        <p>
This effectively creates an anonymous function to handle property change events on
the &lt;input&gt; control, which in turn updates the Opacity property of the circle
shape. Cool, huh? 
</p>
        <p>
The last thing to do is finally add the new &lt;input&gt; element to the page, otherwise
all the work until this point will have had no discernable impact at all... add this
one last line to the handleLoad function: 
</p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p>
            <font face="Courier New">
              <font color="#0000ff">this</font>.control.parentElement.appendChild(opacityEdit);</font>
          </p>
        </blockquote>
        <p>
At this point, your Scene.xaml.js file should look like this: 
</p>
        <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
          <p>
            <font face="Courier New">
              <font color="#0000ff">if</font> (!window.TextboxesInSilverlight)<br />
 window.TextboxesInSilverlight = {};</font>
          </p>
          <p>
            <font face="Courier New">TextboxesInSilverlight.Scene = <font color="#0000ff">function</font>() 
<br />
{<br />
}</font>
          </p>
          <p>
            <font face="Courier New">
              <font color="#0000ff">var</font> globalScene = <font color="#0000ff">null</font>;</font>
          </p>
          <p>
            <font face="Courier New">
              <font color="#0000ff">function</font> sceneLoaded(control,
userContext, rootElement)<br />
{<br />
    globalScene = <font color="#0000ff">new</font> TextboxesInSilverlight.Scene();<br />
    globalScene.handleLoad(control, userContext, rootElement);<br />
}</font>
          </p>
          <p>
            <font face="Courier New">TextboxesInSilverlight.Scene.prototype =<br />
{<br />
 handleLoad: <font color="#0000ff">function</font>(control, userContext, rootElement) 
<br />
 {<br />
  <font color="#0000ff">this</font>.control = control;<br />
  <br />
  <font color="#0000ff">this</font>.circle = control.content.findName<font color="#a52a2a">("TheCircle"</font>);<br />
  <br />
  <font color="#0000ff">var</font> opacityEdit = window.document.createElement(<font color="#a52a2a">"input"</font>);<br />
  opacityEdit.type = <font color="#a52a2a">"text"</font>;<br />
  opacityEdit.id = <font color="#a52a2a">"opacity"</font>;<br />
  opacityEdit.name = <font color="#a52a2a">"opacity"</font>;<br />
  opacityEdit.value = <font color="#a52a2a">"1.0"</font>;<br />
  opacityEdit.onpropertychange = <font color="#0000ff">function</font>()<br />
    {<br />
      <font color="#0000ff">if</font> (<font color="#0000ff">event</font>.propertyName
== <font color="#a52a2a">"value"</font>)<br />
      {<br />
        globalScene.circle.Opacity = <font color="#0000ff">event</font>.srcElement.value;<br />
      }<br />
    }<br />
  </font>
            <font face="Courier New">
              <font color="#0000ff">this</font>.control.parentElement.appendChild(opacityEdit);<br />
 } <br />
}</font>
          </p>
        </blockquote>
        <p>
        </p>
        <p>
If the typo gods favor you, then you should be able to use F5 to run the page and
see it all working together: 
</p>
        <p>
          <a href="http://www.mindfusioncorp.com/weblog/content/binary/QuickTipInputControlsinSilverlight_E5E5/image015.png" atomicselection="true">
            <img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="240" src="http://www.mindfusioncorp.com/weblog/content/binary/QuickTipInputControlsinSilverlight_E5E5/image0_thumb9.png" width="228" border="0" />
          </a>
          <a href="http://www.mindfusioncorp.com/weblog/content/binary/QuickTipInputControlsinSilverlight_E5E5/image017.png" atomicselection="true">
            <img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="240" src="http://www.mindfusioncorp.com/weblog/content/binary/QuickTipInputControlsinSilverlight_E5E5/image016.png" width="226" border="0" />
          </a>
        </p>
        <p>
Notice the positioning of the input textboxes, and the interaction of them with the
underlying Silverlight canvas. This is just a simple example, but can be a very powerful
way to "plug in" Silverlight into the surrounding DHTML. 
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=15d7ab03-1ca0-4728-bdba-3640657e6d19" />
      </body>
      <title>Quick Tip - Input Controls in Silverlight</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,15d7ab03-1ca0-4728-bdba-3640657e6d19.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2007/06/14/QuickTipInputControlsInSilverlight.aspx</link>
      <pubDate>Thu, 14 Jun 2007 20:25:05 GMT</pubDate>
      <description>&lt;p&gt;
&lt;em&gt;&lt;strong&gt;UPDATE 10/25/2007:&lt;/strong&gt; Updated this sample to function correctly
with the Silverlight 1.0 release. The main changes necessary were the typical 0.9
to 1.0 changes (remove "Sys.", isWindowless now takes a string and not a boolean,
event handlers no longer string based), and I also had to explicitly set the z-index
of the INPUT element. Thank you Erik for bringing it to my attention.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
I have seen a lot of questions and confusion regarding capturing input when using
Silverlight. There are no Button, TextBox, or other similar controls to work with.
I see many folks asking for help with building their own directly within Silverlight
- and bless their hearts, that is a daunting task indeed! The UI model currently does
not offer basic input capture features such as "focus" or "tabbing", or even control-level
keystroke capture. So folks tend to start building those basic services first, before
they ever even get to writing code and xaml to support that simple textbox they need.
&lt;/p&gt;
&lt;p&gt;
If you read that first paragraph and thought "thats crazy, it shouldn't be that hard!",
then I would agree with you. Fortunately, there is a FAR easier and more robust way
to achieve the same thing. In fact, its something that is not new to Silverlight at
all, it's been with us for years. I am of course talking about the tried-and-true
html &amp;lt;input&amp;gt; tag.
&lt;/p&gt;
&lt;p&gt;
One of the most overlooked aspects of Silverlight is that it is a component, not a
platform. Your browser is the platform. It can do a lot of stuff, if you just ask
it to. Nobody wants an entire site as a single Silverlight canvas, just like nobody
wants an entire site as a Flash canvas (unless possibly it is a mini-game or rich
media application)... Flash designers realized this fact years ago. And as a component,
a &lt;em&gt;part&lt;/em&gt; of the solution if you will, Silverlight can play nicely with it's
neighbors. With just a little bit of effort and sprinkling a very minimal amount of
javascript pixie dust, we can&amp;nbsp;get a Silverlight applet talking to the rest of
our html DOM. And that's exactly what I am going to show in this topic...
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;&lt;strong&gt;You can download the code demonstrated in this article here (&lt;a href="http://www.mindfusioncorp.com/weblog/content/binary/QuickTip-TextboxesInSilverlight.zip"&gt;QuickTip-TextboxesInSilverlight.zip&lt;/a&gt;).&lt;/strong&gt;&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
First of all, I am doing this with Silverlight 1.0 beta (the javascript one), as I
think the 1.1 alpha is far too likely to change, and this technique &lt;em&gt;should&lt;/em&gt; work
with either. That, and I am lazy and don't want to come back and revisit this post
later to correct the code...
&lt;/p&gt;
&lt;p&gt;
Secondly, I am using the current CTP builds of Visual Studio Orcas and Blend 2 (the
May 2007 bits), both with the Silverlight extensions. If you are using something else,
then your mileage may vary.
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;&lt;strong&gt;UPDATE 10/25/2007:&lt;/strong&gt; Code updated for VS2008 beta2 and the RTM
version of Silverlight 1.0.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
Now on to the code... to be sure we are on the same page, I am creating a new project
from scratch...
&lt;/p&gt;
&lt;p&gt;
First, Create a new project in Blend. Select the Silverlight 1.0 (JavaScript) project
type. It does not matter what you name the project, but for this example I went with
"TextboxesInSilverlight".
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.mindfusioncorp.com/weblog/content/binary/QuickTipInputControlsinSilverlight_E5E5/image06.png" atomicselection="true"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=142 src="http://www.mindfusioncorp.com/weblog/content/binary/QuickTipInputControlsinSilverlight_E5E5/image0_thumb4.png" width=419 border=0&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Switch to XAML view and replace the default canvas with this markup:&lt;font color=#0000ff size=2&gt;
&lt;br&gt;
&lt;/font&gt;
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
&lt;font color=#0000ff size=2&gt;&lt;font face="Courier New" color=#ff0000&gt;&lt;font color=#0000ff&gt;&amp;lt;&lt;/font&gt;&lt;font color=#a52a2a&gt;Canvas&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;xmlns&lt;font color=#0000ff&gt;=&lt;/font&gt;&lt;font color=#000000&gt;"&lt;/font&gt;&lt;/font&gt;&lt;a href="http://schemas.microsoft.com/client/2007"&gt;&lt;font face="Courier New" color=#0000ff&gt;http://schemas.microsoft.com/client/2007&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New" color=#ff0000&gt;&lt;font color=#000000&gt;"&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;xmlns:x&lt;font color=#0000ff&gt;=&lt;/font&gt;&lt;font color=#000000&gt;"&lt;/font&gt;&lt;/font&gt;&lt;a href="http://schemas.microsoft.com/winfx/2006/xaml"&gt;&lt;font face="Courier New" color=#0000ff&gt;http://schemas.microsoft.com/winfx/2006/xaml&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New" color=#ff0000&gt;&lt;font color=#000000&gt;"&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;Width&lt;font color=#0000ff&gt;=&lt;font color=#000000&gt;"&lt;/font&gt;252&lt;/font&gt;&lt;font color=#000000&gt;"&lt;/font&gt; Height&lt;font color=#0000ff&gt;=&lt;font color=#000000&gt;"&lt;/font&gt;272&lt;/font&gt;&lt;font color=#000000&gt;"&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;Background&lt;font color=#0000ff&gt;=&lt;font color=#000000&gt;"&lt;/font&gt;#FFFF2121&lt;/font&gt;&lt;font color=#000000&gt;"&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&lt;font color=#0000ff&gt;&amp;gt;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp; &lt;font color=#0000ff&gt;&amp;lt;&lt;/font&gt;&lt;font color=#a52a2a&gt;TextBlock&lt;/font&gt; Width&lt;font color=#0000ff&gt;=&lt;font color=#000000&gt;"&lt;/font&gt;64&lt;/font&gt;&lt;font color=#000000&gt;"&lt;/font&gt; Height&lt;font color=#0000ff&gt;=&lt;font color=#000000&gt;"&lt;/font&gt;24&lt;/font&gt;&lt;font color=#000000&gt;"&lt;/font&gt; Canvas.Left&lt;font color=#0000ff&gt;=&lt;font color=#000000&gt;"&lt;/font&gt;8&lt;/font&gt;&lt;font color=#000000&gt;"&lt;/font&gt; Canvas.Top&lt;font color=#0000ff&gt;=&lt;font color=#000000&gt;"&lt;/font&gt;8&lt;/font&gt;&lt;font color=#000000&gt;"&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Text&lt;font color=#0000ff&gt;=&lt;font color=#000000&gt;"&lt;/font&gt;Opacity&lt;/font&gt;&lt;font color=#000000&gt;"&lt;/font&gt; TextWrapping&lt;font color=#0000ff&gt;=&lt;font color=#000000&gt;"&lt;/font&gt;Wrap&lt;font color=#000000&gt;"&lt;/font&gt;/&amp;gt;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp; &lt;font color=#0000ff&gt;&amp;lt;&lt;/font&gt;&lt;font color=#a52a2a&gt;Ellipse&lt;/font&gt; Opacity&lt;font color=#0000ff&gt;=&lt;font color=#000000&gt;"&lt;/font&gt;1&lt;/font&gt;&lt;font color=#000000&gt;"&lt;/font&gt; Fill&lt;font color=#0000ff&gt;=&lt;font color=#000000&gt;"&lt;/font&gt;#FF0406FF&lt;/font&gt;&lt;font color=#000000&gt;"&lt;/font&gt; Stroke&lt;font color=#0000ff&gt;=&lt;font color=#000000&gt;"&lt;/font&gt;#FF000000&lt;/font&gt;&lt;font color=#000000&gt;"&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x:Name&lt;font color=#0000ff&gt;=&lt;font color=#000000&gt;"&lt;/font&gt;TheCircle&lt;/font&gt;&lt;font color=#000000&gt;"&lt;/font&gt;&amp;nbsp;Width&lt;font color=#0000ff&gt;=&lt;font color=#000000&gt;"&lt;/font&gt;180&lt;/font&gt;&lt;font color=#000000&gt;"&lt;/font&gt; Height&lt;font color=#0000ff&gt;=&lt;font color=#000000&gt;"&lt;/font&gt;180&lt;/font&gt;&lt;font color=#000000&gt;"&lt;/font&gt;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Canvas.Left&lt;font color=#0000ff&gt;=&lt;font color=#000000&gt;"&lt;/font&gt;36&lt;/font&gt;&lt;font color=#000000&gt;"&lt;/font&gt; Canvas.Top&lt;font color=#0000ff&gt;=&lt;font color=#000000&gt;"&lt;/font&gt;64&lt;font color=#000000&gt;"&lt;/font&gt;/&amp;gt;&lt;/font&gt;
&lt;br&gt;
&lt;font color=#0000ff&gt;&amp;lt;/&lt;/font&gt;&lt;font color=#a52a2a&gt;Canvas&lt;/font&gt;&lt;font color=#0000ff&gt;&amp;gt;&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/blockquote&gt;&gt; 
&lt;p&gt;
This will create a simple red canvas, with a blue circle.
&lt;/p&gt;
&lt;p&gt;
At this point, I generally switch over to Visual Studio Orcas since Blend does not
have Intellisense nor does it really know how to deal with JavaScript. You can do
this easily by right-clicking a project item (such as the xaml file) and selecting
"Edit in Visual Studio".
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.mindfusioncorp.com/weblog/content/binary/QuickTipInputControlsinSilverlight_E5E5/image011.png" atomicselection="true"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=214 src="http://www.mindfusioncorp.com/weblog/content/binary/QuickTipInputControlsinSilverlight_E5E5/image0_thumb7.png" width=217 border=0&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Next, we need to do one small housekeeping chore to make sure that our Silverlight
canvas plays nicely - specifically, we need to ask it to operate "windowless", which
will allow other dhtml elements to overlay it, Open the Default.html.js file, and
modify the call to Silverlight.createObjectEx(). We want to add the parameter for
isWindowless...
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;&amp;nbsp;Silverlight.createObjectEx({&lt;br&gt;
&amp;nbsp;&amp;nbsp;source: &lt;font color=#a52a2a&gt;"Scene.xaml"&lt;/font&gt;,&lt;br&gt;
&amp;nbsp;&amp;nbsp;parentElement: document.getElementById(&lt;font color=#a52a2a&gt;"&lt;/font&gt;&lt;font color=#a52a2a&gt;SilverlightControlHost&lt;/font&gt;&lt;font color=#a52a2a&gt;"&lt;/font&gt;),&lt;br&gt;
&amp;nbsp;&amp;nbsp;id: &lt;font color=#a52a2a&gt;"SilverlightControl"&lt;/font&gt;,&lt;br&gt;
&amp;nbsp;&amp;nbsp;properties: {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;width: &lt;font color=#a52a2a&gt;"100%"&lt;/font&gt;,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;height: &lt;font color=#a52a2a&gt;"100%"&lt;/font&gt;,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;version: &lt;font color=#a52a2a&gt;"0.9"&lt;/font&gt;,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;isWindowless: &lt;font color=#a52a2a&gt;"true"&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;},&lt;br&gt;
&amp;nbsp;&amp;nbsp;events: {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;onLoad: sceneLoaded&lt;br&gt;
&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;});&lt;/font&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
To make things a bit more "clean", we will create the input element directly from
code, however it's always good to control visual styling with CSS. Therefore, open
up the Default.html, and alter the &amp;lt;style&amp;gt; tag to match the following: &lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;&amp;nbsp;&lt;font color=#0000ff&gt;&amp;lt;&lt;/font&gt;&lt;font color=#a52a2a&gt;style&lt;/font&gt; &lt;font color=#ff0000&gt;type&lt;/font&gt;&lt;font color=#0000ff&gt;="text/css"&amp;gt;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;font color=#a52a2a&gt;div&lt;/font&gt;, &lt;font color=#a52a2a&gt;body&lt;/font&gt;, &lt;font color=#a52a2a&gt;input&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=#ff0000&gt;margin&lt;/font&gt;: &lt;font color=#0000ff&gt;0&lt;/font&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=#ff0000&gt;padding&lt;/font&gt;: &lt;font color=#0000ff&gt;0&lt;/font&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;font color=#a52a2a&gt;#opacity&lt;/font&gt; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=#ff0000&gt;margin&lt;/font&gt;: -&lt;font color=#0000ff&gt;272px 0
0 75px&lt;/font&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=#ff0000&gt;z-index&lt;font color=#000000&gt;:&lt;/font&gt;&lt;/font&gt;&lt;font color=#000000&gt; &lt;font color=#0000ff&gt;100&lt;/font&gt;;&lt;/font&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;font color=#a52a2a&gt;.silverlightHost&lt;/font&gt; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=#ff0000&gt;margin&lt;/font&gt;: &lt;font color=#0000ff&gt;40px auto
auto auto&lt;/font&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=#ff0000&gt;height&lt;/font&gt;: &lt;font color=#0000ff&gt;272px&lt;/font&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=#ff0000&gt;width&lt;/font&gt;: &lt;font color=#0000ff&gt;252px&lt;/font&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;lt;/&lt;font color=#a52a2a&gt;style&lt;/font&gt;&amp;gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
This will handle the placement and sizing of the silverlight container &amp;lt;div&amp;gt;
as well as the input control itself. The negative margin is not a typo - this is used
to pull the input control "on top" of the silverlight canvas. We could have also used
absolute positioning, but that is much more brittle, relative positioning FTW. Also,
notice the use of "auto" margins for the main Silverlight Host &amp;lt;div&amp;gt;. This is
how you can center content without resorting to using &amp;lt;center&amp;gt; or &amp;lt;table&amp;gt;...
if you take nothing away from this post, at least remember that one trick. 
&lt;p&gt;
The last thing we must do is wire the whole thing up. This can be done in many places,
in many ways. I consider this particular TextBox to be an extension of the Xaml "scene",
so I will add my code to the TextboxesInSilverlight.Scene class which was created
for us by the Blend project template. This is not the only place you could do this
kind of code, but I found that in this particular example it made the most sense.
Had I been building a dialog for a game engine, I might have this code in a seperate
script file that manages my game mechanics (but thats another article...). 
&lt;p&gt;
First, we need to capture a global reference to the Scene object that is created (this
object is instantiated by the createSilverlight() function of the Default.html.js
script file we edited in a previous step). The purpose of capturing this reference
is that we will need it later in an event handler. This will allow our html &amp;lt;input&amp;gt;
control to communicate back with the silverlight content. This is easier done than
said. Open the Scene.xaml.js file. Just before the definition of the TextboxesInSilverlight.Scene.prototype
(look up javascript prototype for what this is if you are interested, but that discussion
is out of scope for this article), add a line of code to declare the global reference: &lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;&lt;font color=#0000ff&gt;var&lt;/font&gt; globalScene = &lt;font color=#0000ff&gt;null&lt;/font&gt;; &lt;/font&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Now we will create a callback function that will be used to create our JavaScript
object and initialize it: &lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt;&lt;pre&gt;&lt;font color=#0000ff&gt;function&lt;/font&gt; sceneLoaded(control,
userContext, rootElement)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; globalScene = &lt;font color=#0000ff&gt;new&lt;/font&gt; TextboxesInSilverlight.Scene();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; globalScene.handleLoad(control, userContext, rootElement);&lt;br&gt;
}; &lt;/pre&gt;&lt;/blockquote&gt; 
&lt;p&gt;
Now, the idea for this example is that the value of the text box will determine the
"Opacity" Xaml property of the Ellipse shape in our markup. In order for the event
handler we are about to add to be able to do this, we will capture a reference to
the circle object (technically we can wait and use findName() later during the event
handler, but I prefer to capture it only once - its just my style of coding). Add
this line to the handleLoad function: &lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;&lt;font color=#0000ff&gt;this&lt;/font&gt;.circle = control.content.findName(&lt;font color=#a52a2a&gt;"TheCircle"&lt;/font&gt;);&lt;/font&gt; 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Next, we will create the input control and add it to the DHTML document. We will add
it directly to the same &amp;lt;div&amp;gt; that Silverlight has injected itself into, and
therefore any layout or positioning that affects the Silverlight canvas will also
affect our &amp;lt;input&amp;gt; box. Add this code to the end of the handleLoad function: &lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;&lt;font color=#0000ff&gt;var&lt;/font&gt; opacityEdit = window.document.createElement(&lt;font color=#a52a2a&gt;"input"&lt;/font&gt;);&lt;br&gt;
opacityEdit.type = &lt;font color=#a52a2a&gt;"text"&lt;/font&gt;;&lt;br&gt;
opacityEdit.id = &lt;font color=#a52a2a&gt;"opacity"&lt;/font&gt;;&lt;br&gt;
opacityEdit.name = &lt;font color=#a52a2a&gt;"opacity"&lt;/font&gt;;&lt;br&gt;
opacityEdit.value = &lt;font color=#a52a2a&gt;"1.0"&lt;/font&gt;&lt;/font&gt;;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
We are almost done - only two more steps and then we can fire this thing up! First,
we need to add an event handler to react to changes in the value property of the input
control. Add this code to the very end of the handleLoad function: &lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;opacityEdit.onpropertychange = &lt;font color=#0000ff&gt;function&lt;/font&gt;()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=#0000ff&gt;if&lt;/font&gt; (&lt;font color=#0000ff&gt;event&lt;/font&gt;.propertyName
== &lt;font color=#a52a2a&gt;"value"&lt;/font&gt;)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; globalScene.circle.Opacity
= &lt;font color=#0000ff&gt;event&lt;/font&gt;.srcElement.value;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt; 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
This effectively creates an anonymous function to handle property change events on
the &amp;lt;input&amp;gt; control, which in turn updates the Opacity property of the circle
shape. Cool, huh? 
&lt;p&gt;
The last thing to do is finally add the new &amp;lt;input&amp;gt; element to the page, otherwise
all the work until this point will have had no discernable impact at all... add this
one last line to the handleLoad function: &lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;&lt;font color=#0000ff&gt;this&lt;/font&gt;.control.parentElement.appendChild(opacityEdit);&lt;/font&gt; 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
At this point, your Scene.xaml.js file should look like this: &lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;&lt;font color=#0000ff&gt;if&lt;/font&gt; (!window.TextboxesInSilverlight)&lt;br&gt;
&amp;nbsp;window.TextboxesInSilverlight = {};&lt;/font&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;TextboxesInSilverlight.Scene = &lt;font color=#0000ff&gt;function&lt;/font&gt;() 
&lt;br&gt;
{&lt;br&gt;
}&lt;/font&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;&lt;font color=#0000ff&gt;var&lt;/font&gt; globalScene = &lt;font color=#0000ff&gt;null&lt;/font&gt;;&lt;/font&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;&lt;font color=#0000ff&gt;function&lt;/font&gt; sceneLoaded(control,
userContext, rootElement)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; globalScene = &lt;font color=#0000ff&gt;new&lt;/font&gt; TextboxesInSilverlight.Scene();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; globalScene.handleLoad(control, userContext, rootElement);&lt;br&gt;
}&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;TextboxesInSilverlight.Scene.prototype =&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;handleLoad: &lt;font color=#0000ff&gt;function&lt;/font&gt;(control, userContext, rootElement) 
&lt;br&gt;
&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;font color=#0000ff&gt;this&lt;/font&gt;.control = control;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;font color=#0000ff&gt;this&lt;/font&gt;.circle = control.content.findName&lt;font color=#a52a2a&gt;("TheCircle"&lt;/font&gt;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;font color=#0000ff&gt;var&lt;/font&gt; opacityEdit = window.document.createElement(&lt;font color=#a52a2a&gt;"input"&lt;/font&gt;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;opacityEdit.type = &lt;font color=#a52a2a&gt;"text"&lt;/font&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;opacityEdit.id = &lt;font color=#a52a2a&gt;"opacity"&lt;/font&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;opacityEdit.name = &lt;font color=#a52a2a&gt;"opacity"&lt;/font&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;opacityEdit.value = &lt;font color=#a52a2a&gt;"1.0"&lt;/font&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;opacityEdit.onpropertychange = &lt;font color=#0000ff&gt;function&lt;/font&gt;()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=#0000ff&gt;if&lt;/font&gt; (&lt;font color=#0000ff&gt;event&lt;/font&gt;.propertyName
== &lt;font color=#a52a2a&gt;"value"&lt;/font&gt;)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;globalScene.circle.Opacity = &lt;font color=#0000ff&gt;event&lt;/font&gt;.srcElement.value;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font color=#0000ff&gt;this&lt;/font&gt;.control.parentElement.appendChild(opacityEdit);&lt;br&gt;
&amp;nbsp;}&amp;nbsp;&lt;br&gt;
}&lt;/font&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;p&gt;
If the typo gods favor you, then you should be able to use F5 to run the page and
see it all working together: 
&lt;p&gt;
&lt;a href="http://www.mindfusioncorp.com/weblog/content/binary/QuickTipInputControlsinSilverlight_E5E5/image015.png" atomicselection="true"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=240 src="http://www.mindfusioncorp.com/weblog/content/binary/QuickTipInputControlsinSilverlight_E5E5/image0_thumb9.png" width=228 border=0&gt;&lt;/a&gt; &lt;a href="http://www.mindfusioncorp.com/weblog/content/binary/QuickTipInputControlsinSilverlight_E5E5/image017.png" atomicselection="true"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=240 src="http://www.mindfusioncorp.com/weblog/content/binary/QuickTipInputControlsinSilverlight_E5E5/image016.png" width=226 border=0&gt;&lt;/a&gt; 
&lt;p&gt;
Notice the positioning of the input textboxes, and the interaction of them with the
underlying Silverlight canvas. This is just a simple example, but can be a very powerful
way to "plug in"&amp;nbsp;Silverlight&amp;nbsp;into the surrounding&amp;nbsp;DHTML. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=15d7ab03-1ca0-4728-bdba-3640657e6d19" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,15d7ab03-1ca0-4728-bdba-3640657e6d19.aspx</comments>
      <category>.NET</category>
      <category>General</category>
      <category>Silverlight</category>
      <category>Tips and Tricks</category>
      <category>Web 2.0</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=009b2b8b-6ddf-4e0f-bc1a-d9d7a0d39d7a</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,009b2b8b-6ddf-4e0f-bc1a-d9d7a0d39d7a.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,009b2b8b-6ddf-4e0f-bc1a-d9d7a0d39d7a.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=009b2b8b-6ddf-4e0f-bc1a-d9d7a0d39d7a</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
The past few months I have been diving deeper and deeper into the two main pillars
of .NET 3.0 - WPF and WCF. <a title="Hitting the Curve: On WPF and Productivity" href="http://blogs.msdn.com/karstenj/archive/2006/04/05/curve.aspx" target="_blank">This
post</a> by Karsten Januszewski, although a year old, totally resonates even today.
</p>
        <p>
I always laugh a little (on the inside) when I hear "senior" developers claim how
all the difficult "real" work is to be found in back-end services and components.
They assert that all UI development is easy, and doesn't even require much developer
skill. Nothing could be further from the truth, and the new UI framwork (WPF)
makes this glaringly obvious.
</p>
        <p>
Basic concepts can be difficult to grasp like the layout system - where controls
get to "vote" on their size and position, but it is really up to their container to
make the decision. Another one that is hard to get a handle on - control templates
and data templates... very powerful indeed, but a completely new approach to build
an interface. Or just the whole concept of resources and style resolution. It feels
a little bit like CSS... until you realize that nothing really cascades, it only overrides.
</p>
        <p>
Now, don't misinterpret this as a bash towards WPF... I really feel the complexity
and learning curve are warranted, and that the platform is above and beyond anything
that was available before. But XAML is HARD until you get the swing of it, and don't
let anyone try to convince you otherwise.
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=009b2b8b-6ddf-4e0f-bc1a-d9d7a0d39d7a" />
      </body>
      <title>Understanding what it means to &amp;quot;hit the curve&amp;quot;</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,009b2b8b-6ddf-4e0f-bc1a-d9d7a0d39d7a.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2007/05/23/UnderstandingWhatItMeansToQuothitTheCurvequot.aspx</link>
      <pubDate>Wed, 23 May 2007 17:56:33 GMT</pubDate>
      <description>&lt;p&gt;
The past few months I have been diving deeper and deeper into the two main pillars
of .NET 3.0 - WPF and WCF. &lt;a title="Hitting the Curve: On WPF and Productivity" href="http://blogs.msdn.com/karstenj/archive/2006/04/05/curve.aspx" target="_blank"&gt;This
post&lt;/a&gt; by Karsten Januszewski, although a year old, totally resonates even today.
&lt;/p&gt;
&lt;p&gt;
I always laugh a little (on the inside) when I hear "senior" developers claim how
all the difficult "real" work is to be found in back-end services and components.
They assert that all UI development is easy, and doesn't even require much developer
skill.&amp;nbsp;Nothing could be further from the truth, and the new UI framwork (WPF)
makes this glaringly obvious.
&lt;/p&gt;
&lt;p&gt;
Basic concepts can be difficult to grasp&amp;nbsp;like the layout system - where controls
get to "vote" on their size and position, but it is really up to their container to
make the decision. Another one that is hard to get a handle on - control templates
and data templates... very powerful indeed, but a completely new approach to build
an interface. Or just the whole concept of resources and style resolution. It feels
a little bit like CSS... until you realize that nothing really cascades, it only overrides.
&lt;/p&gt;
&lt;p&gt;
Now, don't misinterpret this as a bash towards WPF... I really feel the complexity
and learning curve are warranted, and that the platform is above and beyond anything
that was available before. But XAML is HARD until you get the swing of it, and don't
let anyone try to convince you otherwise.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=009b2b8b-6ddf-4e0f-bc1a-d9d7a0d39d7a" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,009b2b8b-6ddf-4e0f-bc1a-d9d7a0d39d7a.aspx</comments>
      <category>.NET</category>
      <category>WPF</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=df63d782-14fa-4322-b131-29040cf3d3d2</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,df63d782-14fa-4322-b131-29040cf3d3d2.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,df63d782-14fa-4322-b131-29040cf3d3d2.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=df63d782-14fa-4322-b131-29040cf3d3d2</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Tomorrow night is the Atlanta Cutting Edge .NET User Group meeting for May. Actually,
it's also the May meeting for the Atlanta MS Pros and VB.NET groups as well. We will
all be sharing the facility and sponsorship, as well as having a combined networking
period before the meeting and a combined "keynote" presentation for the first half
hour. After that, we will split up into 3 rooms (well technically, we will probably
just close the walls and divide the main room into individual sections), each of which
will offer a seperate track of material. We have a track for Cutting Edge, one for
VB.NET, and one for MS Pros.
</p>
        <p>
For more details, including the topics and speakers that are scheduled, please refer
to the user group website at <a href="http://www.atlantace.com/">http://www.atlantace.com/</a></p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=df63d782-14fa-4322-b131-29040cf3d3d2" />
      </body>
      <title>Atlanta Cutting Edge .NET - May 2007</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,df63d782-14fa-4322-b131-29040cf3d3d2.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2007/05/07/AtlantaCuttingEdgeNETMay2007.aspx</link>
      <pubDate>Mon, 07 May 2007 00:30:37 GMT</pubDate>
      <description>&lt;p&gt;
Tomorrow night is the Atlanta Cutting Edge .NET User Group meeting for May. Actually,
it's also the May meeting for the Atlanta MS Pros and VB.NET groups as well. We will
all be sharing the facility and sponsorship, as well as having a combined networking
period before the meeting and a combined "keynote" presentation for the first half
hour. After that, we will split up into 3 rooms (well technically, we will probably
just close the walls and divide the main room into individual sections), each of which
will offer a seperate track of material. We have a track for Cutting Edge, one for
VB.NET, and one for MS Pros.
&lt;/p&gt;
&lt;p&gt;
For more details, including the topics and speakers that are scheduled, please refer
to the user group website at &lt;a href="http://www.atlantace.com/"&gt;http://www.atlantace.com/&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=df63d782-14fa-4322-b131-29040cf3d3d2" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,df63d782-14fa-4322-b131-29040cf3d3d2.aspx</comments>
      <category>.NET</category>
      <category>Events</category>
      <category>General</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=92aaf646-bcf9-4a05-91f0-9ac12749ab1f</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,92aaf646-bcf9-4a05-91f0-9ac12749ab1f.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,92aaf646-bcf9-4a05-91f0-9ac12749ab1f.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=92aaf646-bcf9-4a05-91f0-9ac12749ab1f</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
It has been a good while since this industry has had a significant shake-up, where
the world as we know it changes almost overnight, and our skills and practices are
all made obsolete. We generally seem to have one every few years or so, and according
to my calculations, it has been about 7 or 8 years since the last one.
</p>
        <p>
I am sure there were other events, but the first I can recall was the introduction
of Object Oriented programming in the 80's. This paradigm shift left multitudes of
mainframe COBOL and RPG analysts behind, forever to toil in a world of green on black
terminal displays. Then in the early and mid 90's there was an explosion of "client-server"
and "N-Tier" applications in the business world. These were all the rage, and
again the flock was divided. Many OOP purists were left in the dust, trying to fend
off the "younger kids" that embraced the 3GL and 4GL tools of the day. But as luck
would have it, only a few years later the terms "client-server" and "N-Tier" took
a back seat to the newest technology explosion - the age of the Web. Right or Wrong,
everyone wanted to be on the web. Try as they might, the n-tier supporters could not
withstand this assault. To this day, there remains a contingent of developers that
cling to the world before the web - in the Microsoft kingdom, we call them "Windows
Forms Programmers", or perhaps the slightly more dignified "Smart Client Developers".
But the significant majority of development work admittedly goes into Web applications.
</p>
        <p>
So for the last few generations of the industry, roughly every five to seven years,
we experienced a wholesale disruption in the status quo. Things are no longer what
we thought they were. Skills become unmarketable. Management becomes confused. Projects
get scrapped. We have to retool - retool or else go the way of the Do-Do Bird (extinct).
</p>
        <p>
The only problem is - it has been about eight years now since the last paradigm shift
(I do not count .NET as a paradigm shift - it is simply a consolidation and improvement
on ideas and methods already in place). It has been eight years, and I fear that
we are long overdue. More than that though - I feel that perhaps, just perhaps, the
paradigm shift has already begun - and that I can't see it due to my own Myopia. And
what if the shift has already passed me by, and I have missed it entirely?
</p>
        <p>
In conclusion, I think the shift is just now underway. I have smelled the crispness
in the air that precedes a thunderstorm. I think the industry is about to change again,
in a very significant way, and I hope to be a small part of it yet again. But
in order to accept and participate in a significant change, a person must adapt to
the new way of things. To that end I have begun the arduous task of retooling and
rebranding myself. This will not be the first time, nor likely the last. As a as/400
specialist, converted to PC technician, converted to Delphi developer, converted to
DBA, converted to Web Developer, and finally to .NET windows/web developer, I can
say that I have definately been through this process before, and it does not scare
me. What scares me is the thought of <em>not</em> adapting.
</p>
        <p>
Some of the people I know and trust feel that they too have "seen the light". Some
have their own theories about where to be when the music stops playing. My good friend <a href="http://devcow.com/blogs/jdattis/default.aspx" target="_blank">Scooter</a> seems
to think that Sharepoint is the entire future. I don't necessarily agree with that.
I have heard similar theories about the grand direction of things from others as well
("Linux is the future!", "Everything will be AJAX!", "OMGZ It's all going to
Pocket PC format!") - most of which I cannot find reason with either. Everyone
seems to agree that the winds are changing, only nobody appears to agree on the
direction. But I have my own ideas and theories and will once again be betting the
next half-decade or longer of my career on that insight. It hasn't let me down in
the past - I trust it will not let me down this time either.
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=92aaf646-bcf9-4a05-91f0-9ac12749ab1f" />
      </body>
      <title>A storm is brewing</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,92aaf646-bcf9-4a05-91f0-9ac12749ab1f.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2007/04/30/AStormIsBrewing.aspx</link>
      <pubDate>Mon, 30 Apr 2007 20:29:00 GMT</pubDate>
      <description>&lt;p&gt;
It has been a good while since this industry has had a significant shake-up, where
the world as we know it changes almost overnight, and our skills and practices are
all made obsolete. We generally seem to have one every few years or so, and according
to my calculations, it has been about 7 or 8 years since the last one.
&lt;/p&gt;
&lt;p&gt;
I am sure there were other events, but the first I can recall was the introduction
of Object Oriented programming in the 80's. This paradigm shift left multitudes of
mainframe COBOL and RPG analysts behind, forever to toil in a world of green on black
terminal displays. Then in the early and mid 90's there was an explosion of "client-server"
and "N-Tier"&amp;nbsp;applications in the business world. These were all the rage, and
again the flock was divided. Many OOP purists were left in the dust, trying to fend
off the "younger kids" that embraced the 3GL and 4GL tools of the day. But as luck
would have it, only a few years later the terms "client-server" and "N-Tier" took
a back seat to the newest technology explosion - the age of the Web. Right or Wrong,
everyone wanted to be on the web. Try as they might, the n-tier supporters could not
withstand this assault. To this day, there remains a contingent of developers that
cling to the world before the web - in the Microsoft kingdom, we call them "Windows
Forms Programmers", or perhaps the slightly more dignified "Smart Client Developers".
But the significant majority of development work admittedly goes into Web applications.
&lt;/p&gt;
&lt;p&gt;
So for the last few generations of the industry, roughly every five to seven years,
we experienced a wholesale disruption in the status quo. Things are no longer what
we thought they were. Skills become unmarketable. Management becomes confused. Projects
get scrapped. We have to retool - retool or else go the way of the Do-Do Bird (extinct).
&lt;/p&gt;
&lt;p&gt;
The only problem is - it has been about eight years now since the last paradigm shift
(I do not count .NET as a paradigm shift - it is simply a consolidation and improvement
on ideas and methods already in place). It has been&amp;nbsp;eight years, and I fear that
we are long overdue. More than that though - I feel that perhaps, just perhaps, the
paradigm shift has already begun - and that I can't see it due to my own Myopia. And
what if the shift has already passed me by, and I have missed it entirely?
&lt;/p&gt;
&lt;p&gt;
In conclusion, I think the shift is just now underway. I have smelled the crispness
in the air that precedes a thunderstorm. I think the industry is about to change again,
in a very significant way, and&amp;nbsp;I hope to be a small part of it yet again. But
in order to accept and participate in a significant change, a person must adapt to
the new way of things. To that end I have begun the arduous task of retooling and
rebranding myself. This will not be the first time, nor likely the last. As a&amp;nbsp;as/400
specialist, converted to PC technician, converted to Delphi developer, converted to
DBA, converted to Web Developer, and finally to .NET windows/web developer, I can
say that I have definately been through this process before, and it does not scare
me. What scares me is the thought of &lt;em&gt;not&lt;/em&gt; adapting.
&lt;/p&gt;
&lt;p&gt;
Some of the people I know and trust feel that they too have "seen the light". Some
have their own theories about where to be when the music stops playing. My good friend &lt;a href="http://devcow.com/blogs/jdattis/default.aspx" target="_blank"&gt;Scooter&lt;/a&gt; seems
to think that Sharepoint is the entire future. I don't necessarily agree with that.
I have heard similar theories about the grand direction of things from others as well
("Linux&amp;nbsp;is the future!", "Everything will be AJAX!", "OMGZ It's all going to
Pocket PC format!")&amp;nbsp;- most of which I cannot find reason with either. Everyone
seems to agree that the winds are changing,&amp;nbsp;only nobody appears to agree on the
direction. But I have my own ideas and theories and will once again be betting the
next half-decade or longer of my career on that insight. It hasn't let me down in
the past - I trust it will not let me down this time either.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=92aaf646-bcf9-4a05-91f0-9ac12749ab1f" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,92aaf646-bcf9-4a05-91f0-9ac12749ab1f.aspx</comments>
      <category>.NET</category>
      <category>General</category>
      <category>Silverlight</category>
      <category>Web 2.0</category>
      <category>WPF</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=4f3d067c-66d2-4182-81fb-c3d297a97148</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,4f3d067c-66d2-4182-81fb-c3d297a97148.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,4f3d067c-66d2-4182-81fb-c3d297a97148.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=4f3d067c-66d2-4182-81fb-c3d297a97148</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
        <p>
          <a href="http://blogs.msdn.com/somasegar/archive/2007/04/15/silverlight-the-next-generation-web-media-experiences.aspx">Soma
tells us</a> that WPF/E has finally recieved a more inspiring name. The announcement
was made at the National Association of Broadcasters (NAB) conference in Vegas.
</p>
        <p>
What's the new name? <a href="http://www.microsoft.com/silverlight/" target="_blank">Silverlight</a>.
They even have a slick logo for it:
</p>
        <p>
          <a href="http://www.mindfusioncorp.com/weblog/content/binary/WPFEGetsaName_D4D7/image02.png" atomicselection="true">
            <img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="102" src="http://www.mindfusioncorp.com/weblog/content/binary/WPFEGetsaName_D4D7/image0_thumb.png" width="92" border="0" />
          </a>
        </p>
        <p>
You can also <a href="http://blogs.msdn.com/lokeuei/archive/2007/04/16/microsoft-announces-silverlight.aspx" target="_blank">see
how it stacks up against Flash here</a>.
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=4f3d067c-66d2-4182-81fb-c3d297a97148" />
      </body>
      <title>WPF/E Gets a Name</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,4f3d067c-66d2-4182-81fb-c3d297a97148.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2007/04/16/WPFEGetsAName.aspx</link>
      <pubDate>Mon, 16 Apr 2007 19:09:06 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blogs.msdn.com/somasegar/archive/2007/04/15/silverlight-the-next-generation-web-media-experiences.aspx"&gt;Soma
tells us&lt;/a&gt; that WPF/E has finally recieved a more inspiring name. The announcement
was made at the National Association of Broadcasters (NAB) conference in Vegas.
&lt;/p&gt;
&lt;p&gt;
What's the new name? &lt;a href="http://www.microsoft.com/silverlight/" target=_blank&gt;Silverlight&lt;/a&gt;.
They even have a slick logo for it:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.mindfusioncorp.com/weblog/content/binary/WPFEGetsaName_D4D7/image02.png" atomicselection="true"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=102 src="http://www.mindfusioncorp.com/weblog/content/binary/WPFEGetsaName_D4D7/image0_thumb.png" width=92 border=0&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
You can also &lt;a href="http://blogs.msdn.com/lokeuei/archive/2007/04/16/microsoft-announces-silverlight.aspx" target=_blank&gt;see
how it stacks up against Flash here&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=4f3d067c-66d2-4182-81fb-c3d297a97148" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,4f3d067c-66d2-4182-81fb-c3d297a97148.aspx</comments>
      <category>.NET</category>
      <category>Silverlight</category>
      <category>Web 2.0</category>
      <category>WPF</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=22381878-dc8a-4021-b807-fcf50c668a9a</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,22381878-dc8a-4021-b807-fcf50c668a9a.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,22381878-dc8a-4021-b807-fcf50c668a9a.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=22381878-dc8a-4021-b807-fcf50c668a9a</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
        <p>
Today I was on MSDN Subscriber Downloads to pull down an ISO that I needed. First
I noticed this in the Partner VLA Keys section:
</p>
        <p>
          <a href="http://www.mindfusioncorp.com/weblog/content/binary/ExpressiontoolsforMSDNSubscribersandPart_10584/image01.png" atomicselection="true">
            <img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="61" src="http://www.mindfusioncorp.com/weblog/content/binary/ExpressiontoolsforMSDNSubscribersandPart_10584/image0.png" width="240" border="0" />
          </a>
        </p>
        <p>
Then I noticed the new download in the downloads area:
</p>
        <p>
          <a href="http://www.mindfusioncorp.com/weblog/content/binary/ExpressiontoolsforMSDNSubscribersandPart_10584/image07.png" atomicselection="true">
            <img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="125" src="http://www.mindfusioncorp.com/weblog/content/binary/ExpressiontoolsforMSDNSubscribersandPart_10584/image0_thumb1.png" width="364" border="0" />
          </a>
        </p>
        <p>
Then I checked my RSS Reader and saw these posts by <a href="http://blogs.msdn.com/somasegar/archive/2007/04/03/listening-to-your-feedback-expression-and-msdn.aspx" target="_blank">Somasegar</a>, <a href="http://wpfwonderland.wordpress.com/2007/04/03/its-official-now-expression-blend-to-be-included-in-msdn-subscriptions/">Walt</a>, <a href="http://timheuer.com/blog/archive/2007/04/03/14029.aspx" target="_blank">Tim</a>,
and <a href="http://keyux.spaces.live.com/blog/cns!343B76C11AF2DD0F!179.entry">Forest</a>.
</p>
        <p>
To make a long story short, Expression Web is now available to folks with MSDN Premium
subscriptions, and Expression Blend will be available upon release. If you have one
of the flavors of VS Team Suite w/ MSDN Premium then you will also have access to
the full Expression Suite (I think this includes Expression Design and Expression
Media?).
</p>
        <p>
And while it was not reported on any of the above blogs, I assume that Certified and
Gold level Microsoft Partners will also be granted a certain number of licenses for
internal use - since I currently see it listed in that section.
</p>
        <p>
This is great news for WPF fans. Tool availability is one of the biggest things holding
back adoption of Fx 3.5, and this move to make Expression tools available to MSDN
subscribers (without jacking up the price ala TFS) will help smooth the transition.
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=22381878-dc8a-4021-b807-fcf50c668a9a" />
      </body>
      <title>Expression tools for MSDN Subscribers and Partners</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,22381878-dc8a-4021-b807-fcf50c668a9a.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2007/04/04/ExpressionToolsForMSDNSubscribersAndPartners.aspx</link>
      <pubDate>Wed, 04 Apr 2007 22:45:43 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
Today I was on MSDN Subscriber Downloads to pull down an ISO that I needed. First
I noticed this in the Partner VLA Keys section:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.mindfusioncorp.com/weblog/content/binary/ExpressiontoolsforMSDNSubscribersandPart_10584/image01.png" atomicselection="true"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="61" src="http://www.mindfusioncorp.com/weblog/content/binary/ExpressiontoolsforMSDNSubscribersandPart_10584/image0.png" width="240" border="0"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Then I noticed the new download in the downloads area:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.mindfusioncorp.com/weblog/content/binary/ExpressiontoolsforMSDNSubscribersandPart_10584/image07.png" atomicselection="true"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="125" src="http://www.mindfusioncorp.com/weblog/content/binary/ExpressiontoolsforMSDNSubscribersandPart_10584/image0_thumb1.png" width="364" border="0"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Then I checked my RSS Reader and saw these posts by &lt;a href="http://blogs.msdn.com/somasegar/archive/2007/04/03/listening-to-your-feedback-expression-and-msdn.aspx" target="_blank"&gt;Somasegar&lt;/a&gt;, &lt;a href="http://wpfwonderland.wordpress.com/2007/04/03/its-official-now-expression-blend-to-be-included-in-msdn-subscriptions/"&gt;Walt&lt;/a&gt;, &lt;a href="http://timheuer.com/blog/archive/2007/04/03/14029.aspx" target="_blank"&gt;Tim&lt;/a&gt;,
and &lt;a href="http://keyux.spaces.live.com/blog/cns!343B76C11AF2DD0F!179.entry"&gt;Forest&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
To make a long story short, Expression Web is now available to folks with MSDN Premium
subscriptions, and Expression Blend will be available upon release. If you have one
of the flavors of VS Team Suite w/ MSDN Premium then you will also have access to
the full Expression Suite (I think this includes Expression Design and Expression
Media?).
&lt;/p&gt;
&lt;p&gt;
And while it was not reported on any of the above blogs, I assume that Certified and
Gold level Microsoft Partners will also be granted a certain number of licenses for
internal use - since I currently see it listed in that section.
&lt;/p&gt;
&lt;p&gt;
This is great news for WPF fans. Tool availability is one of the biggest things holding
back adoption of Fx 3.5, and this move to make Expression tools available to MSDN
subscribers (without jacking up the price&amp;nbsp;ala TFS) will help smooth the transition.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=22381878-dc8a-4021-b807-fcf50c668a9a" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,22381878-dc8a-4021-b807-fcf50c668a9a.aspx</comments>
      <category>.NET</category>
      <category>General</category>
      <category>WPF</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=b135c44e-3577-4665-bb4c-e3afca5d44b0</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,b135c44e-3577-4665-bb4c-e3afca5d44b0.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,b135c44e-3577-4665-bb4c-e3afca5d44b0.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=b135c44e-3577-4665-bb4c-e3afca5d44b0</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In case you missed the highly successful Atlanta Code Camp, there is another one coming
up in Mobile, Alabame on April 14th. Registration is currently open, and I do not
think they are sold out (yet). Like always, this Code Camp is a free event and it
is jam-packed with lots of great topics being delivered by great speakers.
</p>
        <p>
If you are anywheres near Mobile that weekend, it would be worth signing up for.
</p>
        <p>
          <a title="http://www.alabamacodecamp.com/" href="http://www.alabamacodecamp.com/">http://www.alabamacodecamp.com/</a>
        </p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=b135c44e-3577-4665-bb4c-e3afca5d44b0" />
      </body>
      <title>Alabama .NET Code Camp</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,b135c44e-3577-4665-bb4c-e3afca5d44b0.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2007/03/31/AlabamaNETCodeCamp.aspx</link>
      <pubDate>Sat, 31 Mar 2007 00:56:22 GMT</pubDate>
      <description>&lt;p&gt;
In case you missed the highly successful Atlanta Code Camp, there is another one coming
up in Mobile, Alabame on April 14th. Registration is currently open, and I do not
think they are sold out (yet). Like always, this Code Camp is a free event and it
is jam-packed with lots of great topics being delivered by great speakers.
&lt;/p&gt;
&lt;p&gt;
If you are anywheres near Mobile that weekend, it would be worth signing up for.
&lt;/p&gt;
&lt;p&gt;
&lt;a title="http://www.alabamacodecamp.com/" href="http://www.alabamacodecamp.com/"&gt;http://www.alabamacodecamp.com/&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=b135c44e-3577-4665-bb4c-e3afca5d44b0" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,b135c44e-3577-4665-bb4c-e3afca5d44b0.aspx</comments>
      <category>.NET</category>
      <category>Events</category>
      <category>General</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=a7054160-92e3-46da-9fda-eb2cc9cd9294</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,a7054160-92e3-46da-9fda-eb2cc9cd9294.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,a7054160-92e3-46da-9fda-eb2cc9cd9294.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=a7054160-92e3-46da-9fda-eb2cc9cd9294</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I catch a lot of crap from my peers about the length of my posts and their apparent
lack of reasonable brevity. Well complain no more, because my pal <a href="http://devcow.com/blogs/jdattis/default.aspx" target="_blank">Dan</a> has
totally jumped the shark with his pair of matching Longest Posts Evar:
</p>
        <p>
 
</p>
        <p>
          <a href="http://devcow.com/blogs/jdattis/archive/2007/02/23/Office_SharePoint_Server_2007_Forms_Based_Authentication_FBA_Walkthrough_Part_1.aspx?CommentPosted=true" target="_blank">Office
SharePoint Server 2007 - Forms Based Authentication (FBA) Walk-through - Part 1</a>
        </p>
        <p>
and the sequel to the bestselling novel: 
</p>
        <p>
          <a href="http://devcow.com/blogs/jdattis/archive/2007/03/01/Office_SharePoint_Server_2007_Forms_Based_Authentication_FBA_w_MySites_Walkthrough_Part_2.aspx" target="_blank">Office
SharePoint Server 2007 - Forms Based Authentication (FBA) w/MySites Walk-through -
Part 2</a>
        </p>
        <p>
  
</p>
        <p>
Heck, even the titles are huge. <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=a7054160-92e3-46da-9fda-eb2cc9cd9294" /></p>
      </body>
      <title>Longest Posts EVAR</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,a7054160-92e3-46da-9fda-eb2cc9cd9294.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2007/03/05/LongestPostsEVAR.aspx</link>
      <pubDate>Mon, 05 Mar 2007 19:12:22 GMT</pubDate>
      <description>&lt;p&gt;
I catch a lot of crap from my peers about the length of my posts and their apparent
lack of reasonable brevity. Well complain no more, because my pal &lt;a href="http://devcow.com/blogs/jdattis/default.aspx" target="_blank"&gt;Dan&lt;/a&gt; has
totally jumped the shark with his pair of matching Longest Posts Evar:
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://devcow.com/blogs/jdattis/archive/2007/02/23/Office_SharePoint_Server_2007_Forms_Based_Authentication_FBA_Walkthrough_Part_1.aspx?CommentPosted=true" target="_blank"&gt;Office
SharePoint Server 2007 - Forms Based Authentication (FBA) Walk-through - Part 1&lt;/a&gt; 
&lt;p&gt;
and the sequel to the bestselling novel: 
&lt;p&gt;
&lt;a href="http://devcow.com/blogs/jdattis/archive/2007/03/01/Office_SharePoint_Server_2007_Forms_Based_Authentication_FBA_w_MySites_Walkthrough_Part_2.aspx" target="_blank"&gt;Office
SharePoint Server 2007 - Forms Based Authentication (FBA) w/MySites Walk-through -
Part 2&lt;/a&gt; 
&lt;p&gt;
&amp;nbsp; 
&lt;p&gt;
Heck, even the titles are huge. &lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=a7054160-92e3-46da-9fda-eb2cc9cd9294" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,a7054160-92e3-46da-9fda-eb2cc9cd9294.aspx</comments>
      <category>.NET</category>
      <category>General</category>
      <category>Tips and Tricks</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=83ad9e7d-b76a-4e8a-ae0d-8ede9d50bd4a</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,83ad9e7d-b76a-4e8a-ae0d-8ede9d50bd4a.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,83ad9e7d-b76a-4e8a-ae0d-8ede9d50bd4a.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=83ad9e7d-b76a-4e8a-ae0d-8ede9d50bd4a</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
        <p>
Please join us on Monday, March 5th at 6:00 PM for the monthly Atlanta Cutting Edge
.NET User Group meeting. 
</p>
        <p>
************************************** 
</p>
        <p>
This month we have two speakers: 
</p>
        <p>
Paul Lockwood will be presenting Semi-Advanced Production Debugging - a brief discussion
on little known debugging techniques including WinDbg and the sos.dll. 
</p>
        <p>
About the speaker: 
</p>
        <p>
Paul maintains a weblog at <a href="http://www.dotnetworkaholic.com/">http://www.dotnetworkaholic.com/</a>. 
</p>
        <p>
Also speaking this month is Eric Engler who will be presenting <a href="http://ASP.NET">ASP.NET</a> AJAX:
Beyond the UpdatePanel. This session will provide an overview of <a href="http://ASP.NET">ASP.NET</a> AJAX.
Eric will briefly cover the basics of <a href="http://ASP.NET">ASP.NET</a> AJAX, and
then he'll drill down on some of the less commonly known, but very powerful aspects.
Among the subjects to be discussed will be: 
</p>
        <ul>
          <li>
The parts of the AJAX Distribution 
</li>
          <li>
UpdatePanel - a brief obligatory overview 
</li>
          <li>
The ScriptManager 
</li>
          <li>
AJAX Control Toolkit: design of server-side control extenders and custom controls 
</li>
          <li>
JavaScript: how to use objects in a non-OOP language 
</li>
          <li>
AJAX Client Library: micro sized version of the .NET Framework written in JavaScript 
</li>
          <li>
            <a href="http://ASP.NET">ASP.NET</a> AJAX Application Services 
</li>
          <li>
Calling Web Services from the Client 
</li>
          <li>
Debugging AJAX applications 
</li>
        </ul>
        <p>
About the speaker: 
</p>
        <p>
Eric is a Senior Software Engineer at ZC Sterling, a real estate insurance and tax
servicing company in Atlanta. He has over 20 years of experience programming many
languages, on many platforms. His current focus is on Visual Studio and C#, including
all types of applications: Windows, Web, and middle-tier. He holds a MCSD.NET certification. 
</p>
        <p>
Website: <a href="http://www.ericengler.com/">http://www.EricEngler.com</a></p>
        <p>
Thanks go to our sponsor Intellinet (<a href="http://www.intellinet.com/">www.intellinet.com</a>)
for graciously providing refreshments during the meeting. 
</p>
        <p>
This month's agenda (Monday, March 5th) 
</p>
        <p>
    * Networking starting at 6:00<br />
    * Announcements at 6:15<br />
    * Paul Lockwood – Production Debugging at 6:30<br />
    * Break at 7:00<br />
    * Eric Engler – <a href="http://ASP.NET">ASP.NET</a> AJAX at 7:15 
</p>
        <p>
We will be meeting at the Microsoft Regional Headquarters at the Sanctuary Park complex
in Alpharetta (Mansell Rd. Exit). The meeting begins at 6 PM so folks can mingle,
however the announcements and presentations are not scheduled to begin until 6:15
PM. 
</p>
        <p>
For more information on this month's meeting, please visit our website at: 
</p>
        <p>
          <a href="http://www.atlantace.com/">http://www.atlantace.com/</a>
        </p>
        <p>
If you are not familiar with the meeting location, please print out the driving directions
for reference: 
</p>
        <p>
          <a href="http://www.atlantace.com/MeetingLocation.aspx">http://www.atlantace.com/MeetingLocation.aspx</a>
        </p>
        <p>
**** A CALL FOR SPEAKERS **** 
</p>
        <p>
If you have a topic that you would like to present to the group, please contact me
to discuss your ideas. We have lots of available time slots in the coming months,
and our group is a fantastic place to hone your public speaking skills and to contribute
back to the user group community. 
</p>
        <p>
***************************************** 
</p>
        <p>
NOTE: You have received this message because your email address was registered at
the Atlanta Cutting Edge .NET website at <a href="http://www.atlantace.com/">http://www.atlantace.com/</a> or
the Atlanta C# Developers Group website at <a href="http://www.atlantacsharp.org/">http://www.atlantacsharp.org/</a>. 
</p>
        <p>
***************************************** 
</p>
        <p>
Thanks, and I hope to see everyone at this month's meeting! 
</p>
        <p>
Keith Rome<br />
MCPD-EAD MCSD MCDBA MCAD
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=83ad9e7d-b76a-4e8a-ae0d-8ede9d50bd4a" />
      </body>
      <title>Atlanta Cutting Edge .NET User Group Meeting - Monday March 5th</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,83ad9e7d-b76a-4e8a-ae0d-8ede9d50bd4a.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2007/03/03/AtlantaCuttingEdgeNETUserGroupMeetingMondayMarch5th.aspx</link>
      <pubDate>Sat, 03 Mar 2007 19:45:10 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
Please join us on Monday, March 5th at 6:00 PM for the monthly Atlanta Cutting Edge
.NET User Group meeting. 
&lt;p&gt;
************************************** 
&lt;p&gt;
This month we have two speakers: 
&lt;p&gt;
Paul Lockwood will be presenting Semi-Advanced Production Debugging - a brief discussion
on little known debugging techniques including WinDbg and the sos.dll. 
&lt;p&gt;
About the speaker: 
&lt;p&gt;
Paul maintains a weblog at &lt;a href="http://www.dotnetworkaholic.com/"&gt;http://www.dotnetworkaholic.com/&lt;/a&gt;. 
&lt;p&gt;
Also speaking this month is Eric Engler who will be presenting &lt;a href="http://ASP.NET"&gt;ASP.NET&lt;/a&gt; AJAX:
Beyond the UpdatePanel. This session will provide an overview of &lt;a href="http://ASP.NET"&gt;ASP.NET&lt;/a&gt; AJAX.
Eric will briefly cover the basics of &lt;a href="http://ASP.NET"&gt;ASP.NET&lt;/a&gt; AJAX, and
then he'll drill down on some of the less commonly known, but very powerful aspects.
Among the subjects to be discussed will be: 
&lt;ul&gt;
&lt;li&gt;
The parts of the AJAX Distribution 
&lt;li&gt;
UpdatePanel - a brief obligatory overview 
&lt;li&gt;
The ScriptManager 
&lt;li&gt;
AJAX Control Toolkit: design of server-side control extenders and custom controls 
&lt;li&gt;
JavaScript: how to use objects in a non-OOP language 
&lt;li&gt;
AJAX Client Library: micro sized version of the .NET Framework written in JavaScript 
&lt;li&gt;
&lt;a href="http://ASP.NET"&gt;ASP.NET&lt;/a&gt; AJAX Application Services 
&lt;li&gt;
Calling Web Services from the Client 
&lt;li&gt;
Debugging AJAX applications 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
About the speaker: 
&lt;p&gt;
Eric is a Senior Software Engineer at ZC Sterling, a real estate insurance and tax
servicing company in Atlanta. He has over 20 years of experience programming many
languages, on many platforms. His current focus is on Visual Studio and C#, including
all types of applications: Windows, Web, and middle-tier. He holds a MCSD.NET certification. 
&lt;p&gt;
Website: &lt;a href="http://www.ericengler.com/"&gt;http://www.EricEngler.com&lt;/a&gt; 
&lt;p&gt;
Thanks go to our sponsor Intellinet (&lt;a href="http://www.intellinet.com/"&gt;www.intellinet.com&lt;/a&gt;)
for graciously providing refreshments during the meeting. 
&lt;p&gt;
This month's agenda (Monday, March 5th) 
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; * Networking starting at 6:00&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; * Announcements at 6:15&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; * Paul Lockwood – Production Debugging at 6:30&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; * Break at 7:00&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; * Eric Engler – &lt;a href="http://ASP.NET"&gt;ASP.NET&lt;/a&gt; AJAX at 7:15 
&lt;p&gt;
We will be meeting at the Microsoft Regional Headquarters at the Sanctuary Park complex
in Alpharetta (Mansell Rd. Exit). The meeting begins at 6 PM so folks can mingle,
however the announcements and presentations are not scheduled to begin until 6:15
PM. 
&lt;p&gt;
For more information on this month's meeting, please visit our website at: 
&lt;p&gt;
&lt;a href="http://www.atlantace.com/"&gt;http://www.atlantace.com/&lt;/a&gt; 
&lt;p&gt;
If you are not familiar with the meeting location, please print out the driving directions
for reference: 
&lt;p&gt;
&lt;a href="http://www.atlantace.com/MeetingLocation.aspx"&gt;http://www.atlantace.com/MeetingLocation.aspx&lt;/a&gt; 
&lt;p&gt;
**** A CALL FOR SPEAKERS **** 
&lt;p&gt;
If you have a topic that you would like to present to the group, please contact me
to discuss your ideas. We have lots of available time slots in the coming months,
and our group is a fantastic place to hone your public speaking skills and to contribute
back to the user group community. 
&lt;p&gt;
***************************************** 
&lt;p&gt;
NOTE: You have received this message because your email address was registered at
the Atlanta Cutting Edge .NET website at &lt;a href="http://www.atlantace.com/"&gt;http://www.atlantace.com/&lt;/a&gt; or
the Atlanta C# Developers Group website at &lt;a href="http://www.atlantacsharp.org/"&gt;http://www.atlantacsharp.org/&lt;/a&gt;. 
&lt;p&gt;
***************************************** 
&lt;p&gt;
Thanks, and I hope to see everyone at this month's meeting! 
&lt;p&gt;
Keith Rome&lt;br&gt;
MCPD-EAD MCSD MCDBA MCAD
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=83ad9e7d-b76a-4e8a-ae0d-8ede9d50bd4a" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,83ad9e7d-b76a-4e8a-ae0d-8ede9d50bd4a.aspx</comments>
      <category>.NET</category>
      <category>Events</category>
      <category>General</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=f4875850-5ca5-4493-ae7c-6e7190e28bfc</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,f4875850-5ca5-4493-ae7c-6e7190e28bfc.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,f4875850-5ca5-4493-ae7c-6e7190e28bfc.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=f4875850-5ca5-4493-ae7c-6e7190e28bfc</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
For those who know me well, this will be old news.
</p>
        <p>
As of last Monday, I have been a consultant with <a href="http://www.wintellect.com/">Wintellect</a>.
This new position gives me the opportunity to "get in early" and help shape a consulting
organization from the ground up. I will also get to continue building my technical
and management skills and perhaps have a chance to get in on some more exciting projects
that leverage the newest technologies.
</p>
        <p>
My two years at <a href="http://www.intellinet.com/">Intellinet</a> were a great employment
experience, and I would definately recommend them to prospective employees and clients
without hesitation. I still have many good friends there. Frank Bell and the
Intellinet EMT have managed to build a great working environment, and they have
some of the best technical specialists in the region. I wish them the very best, as
it was a very difficult decision when I decided to move on to this next phase of my
career.
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=f4875850-5ca5-4493-ae7c-6e7190e28bfc" />
      </body>
      <title>New Job</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,f4875850-5ca5-4493-ae7c-6e7190e28bfc.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2007/02/21/NewJob.aspx</link>
      <pubDate>Wed, 21 Feb 2007 15:11:56 GMT</pubDate>
      <description>&lt;p&gt;
For those who know me well, this will be old news.
&lt;/p&gt;
&lt;p&gt;
As of last Monday, I&amp;nbsp;have been&amp;nbsp;a consultant&amp;nbsp;with &lt;a href="http://www.wintellect.com/"&gt;Wintellect&lt;/a&gt;.
This new position gives me the opportunity to "get in early" and help shape a consulting
organization from the ground up. I will also get to continue building my technical
and management skills and perhaps have a chance to get in on some more exciting projects
that leverage the newest technologies.
&lt;/p&gt;
&lt;p&gt;
My two years at &lt;a href="http://www.intellinet.com/"&gt;Intellinet&lt;/a&gt; were a great employment
experience, and I would definately recommend them to prospective employees and clients
without hesitation. I still have many good friends there.&amp;nbsp;Frank Bell and the
Intellinet EMT&amp;nbsp;have managed to build a great working environment, and they have
some of the best technical specialists in the region. I wish them the very best, as
it was a very difficult decision when I decided to move on to this next phase of my
career.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=f4875850-5ca5-4493-ae7c-6e7190e28bfc" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,f4875850-5ca5-4493-ae7c-6e7190e28bfc.aspx</comments>
      <category>.NET</category>
      <category>General</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=a00df3d6-33e6-4104-a3d9-0a2f3dd80d4e</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,a00df3d6-33e6-4104-a3d9-0a2f3dd80d4e.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,a00df3d6-33e6-4104-a3d9-0a2f3dd80d4e.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=a00df3d6-33e6-4104-a3d9-0a2f3dd80d4e</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
At this month's <a href="http://www.atlantace.com/" target="_blank">Atlanta Cutting
Edge</a>, I presented a short talk on basic project management and estimation using
PERT techniques. This is a topic that I find most developers (and managers too!) tend
to ignore because they assume it woul dbe uninteresting or perhaps "fake science".
Quite the opposite is actually true, and it can be astounding how much positive impact
some of these techniques can bring to a software development project.
</p>
        <p>
So if you were there and requested the slides, or if you were simply not able to make
it, <a href="http://www.mindfusioncorp.com/weblog/content/binary/Basic%20Project%20Planning%20and%20Estimation.ppt" target="_blank">here
they are</a>.
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=a00df3d6-33e6-4104-a3d9-0a2f3dd80d4e" />
      </body>
      <title>Project Planning Basics</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,a00df3d6-33e6-4104-a3d9-0a2f3dd80d4e.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2007/02/09/ProjectPlanningBasics.aspx</link>
      <pubDate>Fri, 09 Feb 2007 02:08:08 GMT</pubDate>
      <description>&lt;p&gt;
At this month's &lt;a href="http://www.atlantace.com/" target="_blank"&gt;Atlanta Cutting
Edge&lt;/a&gt;, I presented a short talk on basic project management and estimation using
PERT techniques. This is a topic that I find most developers (and managers too!) tend
to ignore because they assume it woul dbe uninteresting or perhaps "fake science".
Quite the opposite is actually true, and it can be astounding how much positive impact
some of these techniques can bring to a software development project.
&lt;/p&gt;
&lt;p&gt;
So if you were there and requested the slides, or if you were simply not able to make
it, &lt;a href="http://www.mindfusioncorp.com/weblog/content/binary/Basic%20Project%20Planning%20and%20Estimation.ppt" target="_blank"&gt;here
they are&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=a00df3d6-33e6-4104-a3d9-0a2f3dd80d4e" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,a00df3d6-33e6-4104-a3d9-0a2f3dd80d4e.aspx</comments>
      <category>.NET</category>
      <category>Events</category>
      <category>General</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=606cf429-221c-4b83-8167-305181917e7c</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,606cf429-221c-4b83-8167-305181917e7c.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,606cf429-221c-4b83-8167-305181917e7c.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=606cf429-221c-4b83-8167-305181917e7c</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Databinding in .NET is immensely powerful. You can bind nearly any property of any
object to any property of any control. The source object can be any .NET object -
a business component, a DataSet, a built-in .NET class, or even another Control! Of
course like any powerful feature, the <em>Devil is in the Details</em>.
</p>
        <h3>Simple versus Complex Binding
</h3>
        <p>
To understand the databinding system first requires acknowledgement that there is
in fact two "flavors" of databinding. You can bind to two very different categories
of objects, and this is what differentiates the flavors of binding. The two flavors
are called <strong>Simple</strong> and <strong>Complex</strong> binding. This is somewhat
of a misnomer in my opinion as there is nothing inherently more complicated about
Complex binding - it's just <em>different</em>. I would prefer to call these two forms
of binding <strong>Item</strong> and <strong>List</strong> binding, as that more accurately
describes their use. In fact, I will try to refer to them as such throughout these
posts.
</p>
        <h4>Item Binding
</h4>
        <p>
Item Binding refers to the connection of a source object property value to a target
control's bindable property. These connections are typically two-way, in other words
you can change either side of the connection and the databinding system will push
the change to the other side. Another cool aspect is that you can bind many controls
to the same source property - however you cannot bind a control's property to more
than one source. An example of this would be binding the <strong><em>Text</em></strong> property
of a <strong><em>Label</em></strong> control to the <strong><em>FirstName</em></strong> string
property of a Customer object.
</p>
        <h4>List Binding
</h4>
        <p>
List Binding refers to the connection of a source list of objects to a target control
that is capable of display and/or navigating between multiple items in the list. The
source list can be any .NET object that implements IList, ICollection, IEnumerable or
IBindingList, including arrays, collections, generic lists, and DataTables. In more
advanced scenarios, an object that implements IListSource can also be used - IListSource
simply defines a list of lists. Controls that are able to participate in List Binding
include the ubiquitous DataGrid/DataGridView, and many other controls that consume
lists of items for various reasons - DropDowns, ListBoxes, and TreeViews to name a
few.
</p>
        <h4>Mixing and Matching
</h4>
        <p>
Unfortunately, you usually cannot mix (or should not mix) both Item and List Binding
in the same source objects. Due to the way the databinding system discovers and uses
databinding interfaces (will be discussed in a followup topic), it is not possible
to have both Item and List bindings on the same object. An example of this would be
binding to Customer entries in a list as well as the Count property of the list itself.
</p>
        <h4>Examples
</h4>
        <h5>Item Binding Examples
</h5>
        <p>
When creating Item Binding connections, you always begin with the target control,
and add to its DataBindings collection a list of property names and their sources.
DataBindings.Add() is an overloaded method with two main usage scenarios. Most of
the time you will use the form of Add(PropertyName, DataSource, SourcePropertyName).
In more rare situations you might want to create a Binding object directly and and
use the form Add(Binding)... this can be useful when you want to override default
formatting and parsing of values.
</p>
        <ul>
          <li>
Binding to a property of a business object 
</li>
        </ul>
        <blockquote>
          <p>
            <font face="Courier New" size="2">Customer C = <font color="#0080ff">new</font> Customer("John"); </font>
          </p>
          <p>
            <font face="Courier New" size="2">TextBox TextBox1 = <font color="#0080ff">new</font> TextBox(); </font>
          </p>
          <p>
            <font face="Courier New" size="2">TextBox1.DataBindings.Add("Text", C, "FirstName"); </font>
          </p>
          <p>
            <font face="Courier New" size="2">
              <em>-or-</em>
            </font>
          </p>
          <p>
            <font face="Courier New" size="2">Binding B = <font color="#0080ff">new</font> Binding("Text",
C, "FirstName"); </font>
          </p>
          <p>
            <font face="Courier New" size="2">TextBox1.DataBindings.Add(B);</font>
          </p>
        </blockquote>
        <ul>
          <li>
Binding to a public field of a business object 
</li>
        </ul>
        <blockquote>
          <p>
You can't do it in this version of the framework! 
</p>
        </blockquote>
        <ul>
          <li>
Binding to a field in a DataTable 
</li>
        </ul>
        <blockquote>
          <p>
            <font face="Courier New">DataTable CustomerDT = <font color="#0080ff">new</font> DataTable("Customers"); </font>
          </p>
          <p>
            <font face="Courier New">CustomerDT.Columns.Add("FirstName", typeof(string)); </font>
          </p>
          <p>
            <font face="Courier New">CustomerDT.Rows.Add(<font color="#0080ff">new object</font>[1]
{"John"}); </font>
          </p>
          <p>
            <font face="Courier New">TextBox TextBox1 = <font color="#0080ff">new</font> TextBox(); </font>
          </p>
          <p>
            <font face="Courier New">TextBox1.DataBindings.Add("Text", CustomerDT, "FirstName");</font>
          </p>
        </blockquote>
        <ul>
          <li>
Binding multiple controls to the same source data 
</li>
        </ul>
        <blockquote>
          <p>
            <font face="Courier New">CheckBox CheckBox1 = <font color="#0080ff">new</font> CheckBox(); </font>
          </p>
          <p>
            <font face="Courier New">TextBox TextBox1 = <font color="#0080ff">new</font> TextBox(); </font>
          </p>
          <p>
            <font face="Courier New">TextBox1.DataBindings.Add("Enabled", CheckBox1, "Checked");</font>
          </p>
        </blockquote>
        <h5>List Binding Examples
</h5>
        <ul>
          <li>
Binding a grid to a DataTable</li>
        </ul>
        <blockquote>
          <p>
            <font face="Courier New">DataSet CustomerDS = <font color="#0080ff">new</font> DataSet();</font>
          </p>
          <p>
            <font face="Courier New">DataTable CustomerDT = CustomerDS.Tables.Add("Customers");</font>
          </p>
          <p>
            <font face="Courier New">CustomerDT.Columns.Add("FirstName", typeof(string));</font>
          </p>
          <p>
            <font face="Courier New">DataGrid CustomerGrid = <font color="#0080ff">new</font> DataGrid();</font>
          </p>
          <p>
            <font face="Courier New">CustomerGrid.DataSource = CustomerDT;</font>
          </p>
          <p>
            <em>Note that the following can also replace the above DataSource assignment:</em>
          </p>
          <p>
            <font face="Courier New">CustomerGrid.DataMember = "Customers";</font>
          </p>
          <p>
            <font face="Courier New">CustomerGrid.DataSource = CustomerDS;</font>
          </p>
          <p>
            <em>However, it is very important to realize that while on the surface they may appear
to give identical results, these datasource assignments are <strong>not the same</strong>!
I will explain this further in part 6 of this series.</em>
          </p>
        </blockquote>
        <ul>
          <li>
Binding a ComboBox to an array</li>
        </ul>
        <blockquote>
          <p>
            <font face="Courier New">string[] StatusList = <font color="#0080ff">new</font> string[2]
{"Active", "Canceled", "Completed"};</font>
          </p>
          <p>
            <font face="Courier New">ComboBox CurrentStatus = <font color="#0080ff">new</font> ComboBox();</font>
          </p>
          <p>
            <font face="Courier New">CurrentStatus.DataSource = StatusList;</font>
          </p>
          <p>
            <em>Note that with a ComboBox, the List Binding is what is used to supply the list
of possible values displayed when activating the control.</em>
          </p>
        </blockquote>
        <ul>
          <li>
Binding a ListBox to a Business Object Collection</li>
        </ul>
        <blockquote>
          <p>
            <font face="Courier New">List&lt;Customer&gt; CustomerList = <font color="#0080ff">new</font> List&lt;Customer&gt;;</font>
          </p>
          <p>
            <font face="Courier New">CustomerList.Add(new Customer("John"));</font>
          </p>
          <p>
            <font face="Courier New">CustomerList.Add(new Customer("Mary"));</font>
          </p>
          <p>
            <font face="Courier New">ComboBox CustomerSelection = <font color="#0080ff">new</font> ComboBox();</font>
          </p>
          <p>
            <font face="Courier New">CustomerSelection.DisplayMember = "FirstName";</font>
          </p>
          <p>
            <font face="Courier New">CustomerSelection.ValueMember = "CustomerID";</font>
          </p>
          <p>
            <font face="Courier New">CustomerSelection.DataSource = CustomerList;</font>
          </p>
          <p>
            <em>Note that ListBox controls, like ComboBox controls, use a List Binding to supply
values for the range pf possible values. They both can also use an Item Binding to
connect the actual currently selected value to a data source object.</em>
          </p>
        </blockquote>
        <p>
          <strong>
            <em>
              <font face="Verdana">To Be Continued...</font>
            </em>
          </strong>
        </p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=606cf429-221c-4b83-8167-305181917e7c" />
      </body>
      <title>Adventures in Databinding ~ Part 2 ~ Simple versus Complex Binding</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,606cf429-221c-4b83-8167-305181917e7c.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2007/01/09/AdventuresInDatabindingPart2SimpleVersusComplexBinding.aspx</link>
      <pubDate>Tue, 09 Jan 2007 05:21:26 GMT</pubDate>
      <description>&lt;p&gt;
Databinding in .NET is immensely powerful. You can bind nearly any property of any
object to any property of any control. The source object can be any .NET object -
a business component, a DataSet, a built-in .NET class, or even another Control! Of
course like any powerful feature, the &lt;em&gt;Devil is in the Details&lt;/em&gt;.
&lt;/p&gt;
&lt;h3&gt;Simple versus Complex Binding
&lt;/h3&gt;
&lt;p&gt;
To understand the databinding system first requires acknowledgement that there is
in fact two "flavors" of databinding. You can bind to two very different categories
of objects, and this is what differentiates the flavors of binding. The two flavors
are called &lt;strong&gt;Simple&lt;/strong&gt; and &lt;strong&gt;Complex&lt;/strong&gt; binding. This is somewhat
of a misnomer in my opinion as there is nothing inherently more complicated about
Complex binding - it's just &lt;em&gt;different&lt;/em&gt;. I would prefer to call these two forms
of binding &lt;strong&gt;Item&lt;/strong&gt; and &lt;strong&gt;List&lt;/strong&gt; binding, as that more accurately
describes their use. In fact, I will try to refer to them as such throughout these
posts.
&lt;/p&gt;
&lt;h4&gt;Item Binding
&lt;/h4&gt;
&lt;p&gt;
Item Binding refers to the connection of a source object property value to a target
control's bindable property. These connections are typically two-way, in other words
you can change either side of the connection and the databinding system will push
the change to the other side. Another cool aspect is that you can bind many controls
to the same source property - however you cannot bind a control's property to more
than one source. An example of this would be binding the &lt;strong&gt;&lt;em&gt;Text&lt;/em&gt;&lt;/strong&gt; property
of a &lt;strong&gt;&lt;em&gt;Label&lt;/em&gt;&lt;/strong&gt; control to the &lt;strong&gt;&lt;em&gt;FirstName&lt;/em&gt;&lt;/strong&gt; string
property of a Customer object.
&lt;/p&gt;
&lt;h4&gt;List Binding
&lt;/h4&gt;
&lt;p&gt;
List Binding refers to the connection of a source list of objects to a target control
that is capable of display and/or navigating between multiple items in the list. The
source list can be any .NET object that implements IList, ICollection, IEnumerable&amp;nbsp;or
IBindingList, including arrays, collections, generic lists, and DataTables. In more
advanced scenarios, an object that implements IListSource can also be used - IListSource
simply defines a list of lists. Controls that are able to participate in List Binding
include the ubiquitous DataGrid/DataGridView, and many other controls that consume
lists of items for various reasons - DropDowns, ListBoxes, and TreeViews to name a
few.
&lt;/p&gt;
&lt;h4&gt;Mixing and Matching
&lt;/h4&gt;
&lt;p&gt;
Unfortunately, you usually cannot mix (or should not mix) both Item and List Binding
in the same source objects. Due to the way the databinding system discovers and uses
databinding interfaces (will be discussed in a followup topic), it is not possible
to have both Item and List bindings on the same object. An example of this would be
binding to Customer entries in a list as well as the Count property of the list itself.
&lt;/p&gt;
&lt;h4&gt;Examples
&lt;/h4&gt;
&lt;h5&gt;Item Binding Examples
&lt;/h5&gt;
&lt;p&gt;
When creating Item Binding connections, you always begin with the target control,
and add to its DataBindings collection a list of property names and their sources.
DataBindings.Add() is an overloaded method with two main usage scenarios. Most of
the time you will use the form of Add(PropertyName, DataSource, SourcePropertyName).
In more rare situations you might want to create a Binding object directly and and
use the form Add(Binding)... this can be useful when you want to override default
formatting and parsing of values.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Binding to a property of a business object 
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;font face="Courier New" size=2&gt;Customer C = &lt;font color=#0080ff&gt;new&lt;/font&gt; Customer("John"); &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New" size=2&gt;TextBox TextBox1 = &lt;font color=#0080ff&gt;new&lt;/font&gt; TextBox(); &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New" size=2&gt;TextBox1.DataBindings.Add("Text", C, "FirstName"); &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New" size=2&gt;&lt;em&gt;-or-&lt;/em&gt; &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New" size=2&gt;Binding B = &lt;font color=#0080ff&gt;new&lt;/font&gt; Binding("Text",
C, "FirstName"); &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New" size=2&gt;TextBox1.DataBindings.Add(B);&lt;/font&gt; 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;ul&gt;
&lt;li&gt;
Binding to a public field of a business object 
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt; 
&lt;p&gt;
You can't do it in this version of the framework! 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;ul&gt;
&lt;li&gt;
Binding to a field in a DataTable 
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;DataTable CustomerDT = &lt;font color=#0080ff&gt;new&lt;/font&gt; DataTable("Customers"); &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;CustomerDT.Columns.Add("FirstName", typeof(string)); &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;CustomerDT.Rows.Add(&lt;font color=#0080ff&gt;new object&lt;/font&gt;[1]
{"John"}); &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;TextBox TextBox1 = &lt;font color=#0080ff&gt;new&lt;/font&gt; TextBox(); &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;TextBox1.DataBindings.Add("Text", CustomerDT, "FirstName");&lt;/font&gt; 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;ul&gt;
&lt;li&gt;
Binding multiple controls to the same source data 
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;CheckBox CheckBox1 = &lt;font color=#0080ff&gt;new&lt;/font&gt; CheckBox(); &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;TextBox TextBox1 = &lt;font color=#0080ff&gt;new&lt;/font&gt; TextBox(); &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;TextBox1.DataBindings.Add("Enabled", CheckBox1, "Checked");&lt;/font&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;h5&gt;List Binding Examples
&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;
Binding a grid to a DataTable&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;DataSet CustomerDS = &lt;font color=#0080ff&gt;new&lt;/font&gt; DataSet();&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;DataTable CustomerDT = CustomerDS.Tables.Add("Customers");&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;CustomerDT.Columns.Add("FirstName", typeof(string));&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;DataGrid CustomerGrid = &lt;font color=#0080ff&gt;new&lt;/font&gt; DataGrid();&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;CustomerGrid.DataSource = CustomerDT;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Note that the following can also replace the above DataSource assignment:&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;CustomerGrid.DataMember = "Customers";&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;CustomerGrid.DataSource = CustomerDS;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;However, it is very important to realize that while on the surface they may appear
to give identical results, these datasource assignments are &lt;strong&gt;not the same&lt;/strong&gt;!
I will explain this further in part 6 of this series.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;ul&gt;
&lt;li&gt;
Binding a ComboBox to an array&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;string[] StatusList = &lt;font color=#0080ff&gt;new&lt;/font&gt; string[2]
{"Active", "Canceled", "Completed"};&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;ComboBox&amp;nbsp;CurrentStatus = &lt;font color=#0080ff&gt;new&lt;/font&gt; ComboBox();&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;CurrentStatus.DataSource = StatusList;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Note that with a ComboBox, the List Binding is what is used to supply the list
of possible values displayed when activating the control.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;ul&gt;
&lt;li&gt;
Binding a ListBox to a Business Object Collection&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt; 
&lt;p&gt;
&lt;font face="Courier New"&gt;List&amp;lt;Customer&amp;gt; CustomerList = &lt;font color=#0080ff&gt;new&lt;/font&gt; List&amp;lt;Customer&amp;gt;;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;CustomerList.Add(new Customer("John"));&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;CustomerList.Add(new Customer("Mary"));&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;ComboBox CustomerSelection = &lt;font color=#0080ff&gt;new&lt;/font&gt; ComboBox();&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;CustomerSelection.DisplayMember = "FirstName";&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;CustomerSelection.ValueMember = "CustomerID";&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;CustomerSelection.DataSource = CustomerList;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Note that ListBox controls, like ComboBox controls, use a List Binding to supply
values for the range pf possible values. They both can also use an Item Binding to
connect the actual currently selected value to a data source object.&lt;/em&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&lt;strong&gt;&lt;em&gt;&lt;font face=Verdana&gt;To Be Continued...&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=606cf429-221c-4b83-8167-305181917e7c" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,606cf429-221c-4b83-8167-305181917e7c.aspx</comments>
      <category>.NET</category>
      <category>General</category>
      <category>Tips and Tricks</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=61852069-495a-49f3-a833-0dcee7242cd8</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,61852069-495a-49f3-a833-0dcee7242cd8.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,61852069-495a-49f3-a833-0dcee7242cd8.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=61852069-495a-49f3-a833-0dcee7242cd8</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <h4>Why would I care about Databinding?
</h4>
        <p>
Perhaps you are just writing some server code. Maybe XML processing, web services,
or even some good old-fashioned application server components. If so, then maybe you
really shouldn't care about Databinding.
</p>
        <p>
But maybe - <em><strong>just maybe</strong></em> - you are building the User Interface
for an application. Or perhaps a set of business objects that will eventually be displayed
in a User Interface. And maybe, just maybe, that interface happens to live in the
world we now call "Smart Clients". If so, then three paths will lay before you:
</p>
        <ol>
          <li>
You can pretend that databinding does not exist and manually update/read data values
directly from UI controls.</li>
          <li>
You can try to ignore the intricacies inherent to databinding and hope that everything
works out (might be OK if nothing in your UI is "outside of the box").</li>
          <li>
You could embrace the beast that is .NET Databinding, study and plot against your
foe, and finally prevail against that poorly documented adversary which has terrorized
legions of .NET developers.</li>
        </ol>
        <p>
OK, well maybe it's not quite that exciting, but there is definitely some interesting
(I think) stuff to be learned when you take a deeper dive into the world of .NET Databinding.
</p>
        <p>
In a series of topics I hope to shed some light on this dark and often cursed part
of the .NET infrastructure. In my past few years of .NET experience I have had to
tackle databinding from many angles, and have managed to develop a fairly good grasp
of the subject (I think - ...always more to be learned). Hopefully I can share some
of that with readers. So let's see where this goes...
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=61852069-495a-49f3-a833-0dcee7242cd8" />
      </body>
      <title>Adventures in Databinding</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,61852069-495a-49f3-a833-0dcee7242cd8.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2007/01/07/AdventuresInDatabinding.aspx</link>
      <pubDate>Sun, 07 Jan 2007 20:52:55 GMT</pubDate>
      <description>&lt;h4&gt;Why would I care about Databinding?
&lt;/h4&gt;
&lt;p&gt;
Perhaps you are just writing some server code. Maybe XML processing, web services,
or even some good old-fashioned application server components. If so, then maybe you
really shouldn't care about Databinding.
&lt;/p&gt;
&lt;p&gt;
But maybe - &lt;em&gt;&lt;strong&gt;just maybe&lt;/strong&gt;&lt;/em&gt; - you are building the User Interface
for an application. Or perhaps a set of business objects that will eventually be displayed
in a User Interface. And maybe, just maybe, that interface happens to live in the
world we now call "Smart Clients". If so, then three paths will lay before you:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
You can pretend that databinding does not exist and manually update/read data values
directly&amp;nbsp;from UI controls.&lt;/li&gt;
&lt;li&gt;
You can try to ignore the intricacies inherent to databinding and hope that everything
works out (might be OK if nothing in your UI is "outside of the box").&lt;/li&gt;
&lt;li&gt;
You could embrace the beast that is .NET Databinding, study and plot against your
foe, and finally prevail against that poorly documented adversary which has terrorized
legions of .NET developers.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
OK, well maybe it's not quite that exciting, but there is definitely some interesting
(I think) stuff to be learned when you take a deeper dive into the world of .NET Databinding.
&lt;/p&gt;
&lt;p&gt;
In a series of topics I hope to shed some light on this dark and often cursed part
of the .NET infrastructure. In my past few years of .NET experience I have had to
tackle databinding from many angles, and have managed to develop a fairly good grasp
of the subject (I think - ...always more to be learned). Hopefully I can share some
of that with readers. So let's see where this goes...
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=61852069-495a-49f3-a833-0dcee7242cd8" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,61852069-495a-49f3-a833-0dcee7242cd8.aspx</comments>
      <category>.NET</category>
      <category>General</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=973f427c-bf04-42a8-853d-eb39115e54c1</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,973f427c-bf04-42a8-853d-eb39115e54c1.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,973f427c-bf04-42a8-853d-eb39115e54c1.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=973f427c-bf04-42a8-853d-eb39115e54c1</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
For nearly a year I have been bogged down in what I can only describe as a <a href="http://en.wikipedia.org/wiki/Quagmire" target="_blank">quagmire</a> of
a project. But this week that all changes - I am moving on to some new work finally,
and maybe - just perhaps - I will have more time to blog about the things I have learned
and re-learned during that time...
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=973f427c-bf04-42a8-853d-eb39115e54c1" />
      </body>
      <title>Crawling back out of my cave</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,973f427c-bf04-42a8-853d-eb39115e54c1.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2007/01/05/CrawlingBackOutOfMyCave.aspx</link>
      <pubDate>Fri, 05 Jan 2007 21:22:26 GMT</pubDate>
      <description>&lt;p&gt;
For nearly a year I have been bogged down in what I can only describe as a &lt;a href="http://en.wikipedia.org/wiki/Quagmire" target="_blank"&gt;quagmire&lt;/a&gt; of
a project. But this week that all changes - I am moving on to some new work finally,
and maybe - just perhaps - I will have more time to blog about the things I have learned
and re-learned during that time...
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=973f427c-bf04-42a8-853d-eb39115e54c1" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,973f427c-bf04-42a8-853d-eb39115e54c1.aspx</comments>
      <category>.NET</category>
      <category>General</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=7dc92a4d-a1b3-4133-9d8f-5c383fd79a35</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,7dc92a4d-a1b3-4133-9d8f-5c383fd79a35.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,7dc92a4d-a1b3-4133-9d8f-5c383fd79a35.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=7dc92a4d-a1b3-4133-9d8f-5c383fd79a35</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
As <a href="http://devauthority.com/blogs/jwooley/archive/2007/01/05/17773.aspx" target="_blank">announced
earlier today by Jim Wooley</a>:
</p>
        <p>
 
</p>
        <p>
          <a href="http://www.atlantacodecamp.com/" target="_blank">
            <img src="http://www.atlantamspros.com/Portals/5/AtlantaCodeCampLogo_plus%20Fire.jpg" />
          </a>
        </p>
        <p>
 
</p>
        <p>
Fellow Code Campers, 
</p>
        <p>
I hope you all had a wonderful holiday season and I want to wish everyone a Happy
New Year. 
</p>
        <p>
Registration for the 3rd annual Atlanta Code Camp is now open. Please register on
the Click to Attend website to guarantee your spot at the Code Camp. 
</p>
        <p>
Here's the link:<br /><a href="https://www.clicktoattend.com/invitation.aspx?code=113135">https://www.clicktoattend.com/invitation.aspx?code=113135</a></p>
        <p>
Just a reminder. The 3rd annual Atlanta Code Camp will take place on January 20th.
The event is completely free and lunch is included. Doors open at 7:30am at the Decatur
campus of DeVry University 
</p>
        <p>
250 North Arcadia Ave<br />
Decatur , GA 30030 
</p>
        <p>
If you are coming in from out of town, we have a recommended hotel near the event.
Call the Holiday Inn and ask for the DeVry University rate to get a $99/night rate.
Parking is extra and costs $7/day 
</p>
        <p>
Holiday Inn 
</p>
        <p>
130 Clairemont Ave<br />
Decatur, GA 30030<br />
404-372-0204 
</p>
        <p>
During the Code Camp, lunch will be provided at no cost to you. After the event, we
are planning on gathering in a local eatery to continue any discussions which we were
not able to complete by our 5:30 pm end time. Location information will be made available
at the event. 
</p>
        <p>
The Atlanta Code Camps have historically "sold out" extremely rapidly and we don't
expect this time to be any different. Please register quickly to lock in your spot
as we are capping registration and attendance due to facility limitations.
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=7dc92a4d-a1b3-4133-9d8f-5c383fd79a35" />
      </body>
      <title>2007 Atlanta Code Camp - Registration is OPEN</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,7dc92a4d-a1b3-4133-9d8f-5c383fd79a35.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2007/01/05/2007AtlantaCodeCampRegistrationIsOPEN.aspx</link>
      <pubDate>Fri, 05 Jan 2007 20:55:47 GMT</pubDate>
      <description>&lt;p&gt;
As &lt;a href="http://devauthority.com/blogs/jwooley/archive/2007/01/05/17773.aspx" target="_blank"&gt;announced
earlier today by Jim Wooley&lt;/a&gt;:
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.atlantacodecamp.com/" target="_blank"&gt;&lt;img src="http://www.atlantamspros.com/Portals/5/AtlantaCodeCampLogo_plus%20Fire.jpg"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Fellow Code Campers, 
&lt;p&gt;
I hope you all had a wonderful holiday season and I want to wish everyone a Happy
New Year. 
&lt;p&gt;
Registration for the 3rd annual Atlanta Code Camp is now open. Please register on
the Click to Attend website to guarantee your spot at the Code Camp. 
&lt;p&gt;
Here's the link:&lt;br&gt;
&lt;a href="https://www.clicktoattend.com/invitation.aspx?code=113135"&gt;https://www.clicktoattend.com/invitation.aspx?code=113135&lt;/a&gt; 
&lt;p&gt;
Just a reminder. The 3rd annual Atlanta Code Camp will take place on January 20th.
The event is completely free and lunch is included. Doors open at 7:30am at the Decatur
campus of DeVry University 
&lt;p&gt;
250 North Arcadia Ave&lt;br&gt;
Decatur , GA 30030 
&lt;p&gt;
If you are coming in from out of town, we have a recommended hotel near the event.
Call the Holiday Inn and ask for the DeVry University rate to get a $99/night rate.
Parking is extra and costs $7/day 
&lt;p&gt;
Holiday Inn 
&lt;p&gt;
130 Clairemont Ave&lt;br&gt;
Decatur, GA 30030&lt;br&gt;
404-372-0204 
&lt;p&gt;
During the Code Camp, lunch will be provided at no cost to you. After the event, we
are planning on gathering in a local eatery to continue any discussions which we were
not able to complete by our 5:30 pm end time. Location information will be made available
at the event. 
&lt;p&gt;
The Atlanta Code Camps have historically "sold out" extremely rapidly and we don't
expect this time to be any different. Please register quickly to lock in your spot
as we are capping registration and attendance due to facility limitations.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=7dc92a4d-a1b3-4133-9d8f-5c383fd79a35" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,7dc92a4d-a1b3-4133-9d8f-5c383fd79a35.aspx</comments>
      <category>.NET</category>
      <category>Events</category>
      <category>General</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=4a0e5d12-ab14-4733-834f-e44b427b2f63</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,4a0e5d12-ab14-4733-834f-e44b427b2f63.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,4a0e5d12-ab14-4733-834f-e44b427b2f63.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=4a0e5d12-ab14-4733-834f-e44b427b2f63</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Join Doug Turnure and guests on the third Monday of every month at the Microsoft regional
headquarters in Alpharetta for a "Lunch and Learn" event.
</p>
        <p>
These events are 1 hour in length, held from noon to 1pm. Lunch is not provided
- you will need to bring your own if you wish to eat. The content itself is level
100 to 200.
</p>
        <p>
This month, the topic is WPF and Cardspace. Visit Doug's weblog for more information
if you are interested... <a href="http://blogs.msdn.com/dougturn/archive/2006/11/07/bring-a-lunch-and-come-join-us-in-atlanta-to-discuss-net-technologies.aspx">Lunch
and Learns at Microsoft</a></p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=4a0e5d12-ab14-4733-834f-e44b427b2f63" />
      </body>
      <title>Microsoft Lunch and Learn</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,4a0e5d12-ab14-4733-834f-e44b427b2f63.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2006/11/14/MicrosoftLunchAndLearn.aspx</link>
      <pubDate>Tue, 14 Nov 2006 14:54:58 GMT</pubDate>
      <description>&lt;p&gt;
Join Doug Turnure and guests on the third Monday of every month at the Microsoft regional
headquarters in Alpharetta for a "Lunch and Learn" event.
&lt;/p&gt;
&lt;p&gt;
These events are&amp;nbsp;1 hour in length, held from noon to 1pm. Lunch is not provided
- you will need to bring your own if you wish to eat. The content itself is level
100 to 200.
&lt;/p&gt;
&lt;p&gt;
This month, the topic is WPF and Cardspace. Visit Doug's weblog for more information
if you are interested... &lt;a href="http://blogs.msdn.com/dougturn/archive/2006/11/07/bring-a-lunch-and-come-join-us-in-atlanta-to-discuss-net-technologies.aspx"&gt;Lunch
and Learns at Microsoft&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=4a0e5d12-ab14-4733-834f-e44b427b2f63" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,4a0e5d12-ab14-4733-834f-e44b427b2f63.aspx</comments>
      <category>.NET</category>
      <category>Events</category>
      <category>General</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=adc1048f-0e30-47d7-b94f-58c271a43a1e</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,adc1048f-0e30-47d7-b94f-58c271a43a1e.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,adc1048f-0e30-47d7-b94f-58c271a43a1e.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=adc1048f-0e30-47d7-b94f-58c271a43a1e</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
        <div align="left">I am very pleased. Today I took the second of two upgrade tests
needed to convert my existing MCSD certification to the new MCPD-EAD (MS Certified
Professional Developer - Enterprise Application Developer) - and passed it by a comfortable
margin! I am fairly sure this makes me the first Intellinet consultant to carry this
new certification.<br /><br />
The test itself was pretty tough - I am very lucky to have had enough exposure to
deep WSE and Remoting. A good 20 of the 58 questions were directly related to WSE3
implementation details - and quite picky too. SOAP Filters, policy, addressing, referral
cache, signing/encryption, etc... this test hit nearly everything. For remoting, the
test covered client and server declarative as well as imperative configuration of
the channels and services/clients. There were even a significant number of questions
on message queueing and serviced components. In all, I am quite impressed with the
depth and breadth of testing coverage.<br /><br />
I actually wanted to take this test a few months ago (I took part 1 while the tests
were still in "beta"), but I was holding out to see if my employer was going to institute
a reward policy for obtaining certifications - something that many of our competitors
do. I finally just gave up on waiting and scheduled the test before my free test voucher
expired. Intellinet would have paid for the test - but free is free.<br /><br />
Now I just need to decide whether I want to pursue updating of my MCDBA credentials...<br /><br /></div>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=adc1048f-0e30-47d7-b94f-58c271a43a1e" />
      </body>
      <title>MCPD - EAD</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,adc1048f-0e30-47d7-b94f-58c271a43a1e.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2006/11/12/MCPDEAD.aspx</link>
      <pubDate>Sun, 12 Nov 2006 03:31:29 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
&lt;div align="left"&gt;I am very pleased. Today I took the second of two upgrade tests
needed to convert my existing MCSD certification to the new MCPD-EAD (MS Certified
Professional Developer - Enterprise Application Developer) - and passed it by a comfortable
margin! I am fairly sure this makes me the first Intellinet consultant to carry this
new certification.&lt;br&gt;
&lt;br&gt;
The test itself was pretty tough - I am very lucky to have had enough exposure to
deep WSE and Remoting. A good 20 of the 58 questions were directly related to WSE3
implementation details - and quite picky too. SOAP Filters, policy, addressing, referral
cache, signing/encryption, etc... this test hit nearly everything. For remoting, the
test covered client and server declarative as well as imperative configuration of
the channels and services/clients. There were even a significant number of questions
on message queueing and serviced components. In all, I am quite impressed with the
depth and breadth of testing coverage.&lt;br&gt;
&lt;br&gt;
I actually wanted to take this test a few months ago (I took part 1 while the tests
were still in "beta"), but I was holding out to see if my employer was going to institute
a reward policy for obtaining certifications - something that many of our competitors
do. I finally just gave up on waiting and scheduled the test before my free test voucher
expired. Intellinet would have paid for the test - but free is free.&lt;br&gt;
&lt;br&gt;
Now I just need to decide whether I want to pursue updating of my MCDBA credentials...&lt;br&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=adc1048f-0e30-47d7-b94f-58c271a43a1e" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,adc1048f-0e30-47d7-b94f-58c271a43a1e.aspx</comments>
      <category>.NET</category>
      <category>General</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=013b94cc-21d4-4d5c-8d99-0d1c1bf5b171</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,013b94cc-21d4-4d5c-8d99-0d1c1bf5b171.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,013b94cc-21d4-4d5c-8d99-0d1c1bf5b171.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=013b94cc-21d4-4d5c-8d99-0d1c1bf5b171</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Tonight is the September meeting for the Atlanta Cutting Edge .NET User Group. Jim
Wooley (RSS <a href="http://devauthority.com/blogs/jwooley/default.aspx" atomicselection="true"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="13" src="http://www.mindfusioncorp.com/weblog/content/binary/AtlantaCuttingEdge.NETSeptember2006_8994/image0_thumb1.png" width="13" border="0" /></a> ) will
be presenting on LINQ - the new language integrated query extension technology.
This is really cool stuff IMO.
</p>
        <p>
Normally we meet on the first Monday of every month, but with yesterday being a holiday,
we moved this month's meeting to tonight.
</p>
        <p>
In case you don't have it yet - our new User Group's URL is <a href="http://www.atlantace.com/">http://www.atlantace.com/</a>.
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=013b94cc-21d4-4d5c-8d99-0d1c1bf5b171" />
      </body>
      <title>Atlanta Cutting Edge .NET - September 2006</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,013b94cc-21d4-4d5c-8d99-0d1c1bf5b171.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2006/09/05/AtlantaCuttingEdgeNETSeptember2006.aspx</link>
      <pubDate>Tue, 05 Sep 2006 13:47:33 GMT</pubDate>
      <description>&lt;p&gt;
Tonight is the September meeting for the Atlanta Cutting Edge .NET User Group. Jim
Wooley (RSS &lt;a href="http://devauthority.com/blogs/jwooley/default.aspx" atomicselection="true"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="13" src="http://www.mindfusioncorp.com/weblog/content/binary/AtlantaCuttingEdge.NETSeptember2006_8994/image0_thumb1.png" width="13" border="0"&gt;&lt;/a&gt; )&amp;nbsp;will
be presenting on LINQ -&amp;nbsp;the new language integrated query extension technology.
This is really cool stuff IMO.
&lt;/p&gt;
&lt;p&gt;
Normally we meet on the first Monday of every month, but with yesterday being a holiday,
we moved this month's meeting to tonight.
&lt;/p&gt;
&lt;p&gt;
In case you don't have it yet - our new User Group's URL is &lt;a href="http://www.atlantace.com/"&gt;http://www.atlantace.com/&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=013b94cc-21d4-4d5c-8d99-0d1c1bf5b171" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,013b94cc-21d4-4d5c-8d99-0d1c1bf5b171.aspx</comments>
      <category>.NET</category>
      <category>Events</category>
      <category>General</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=f1646074-09a7-4e0f-ac9e-c4ffb8c7fa94</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,f1646074-09a7-4e0f-ac9e-c4ffb8c7fa94.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,f1646074-09a7-4e0f-ac9e-c4ffb8c7fa94.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=f1646074-09a7-4e0f-ac9e-c4ffb8c7fa94</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Just in case you happen to monitor this weblog, but have not registered with the group's
mailing list:
</p>
        <p>
------------------------------------
</p>
        <p>
Please be aware that due to inability to secure a speaker for this month, the <a href="http://www.atlantacsharp.org/">Atlanta
C# User Group</a> will NOT be meeting in June.
</p>
        <p>
Also, the July meeting would fall adjacent to the Independance Day holiday, and therefore
there will not be a C# Meeting in July either. 
</p>
        <p>
Our next scheduled meeting is currently expected for August, more details will be
posted when we get nearer to the meeting date.
</p>
        <p>
          <br />
**** A CALL FOR SPEAKERS ****
</p>
        <p>
If you have a topic that you would like to present to the group, please contact me
to discuss your ideas. We have lots of available time slots in the coming months,
and our group is a fantastic place to hone your public speaking skills and to contribute
back to the user group community. 
</p>
        <p>
          <br />
**** SPONSORS ****
</p>
        <p>
If your company is interested in sponsoring a month (or more) of the Atlanta C# Developers
Group, please contact me to discuss. Sponsorship is inexpensive and a great way to
market your organization. 
</p>
        <p>
          <br />
*****************************************
</p>
        <p>
NOTE: You have received this message because your email address was registered at
the Atlanta C# Developers Group website at<br /><a href="http://www.atlantacsharp.org/">http://www.atlantacsharp.org/</a> .
</p>
        <p>
*****************************************
</p>
        <p>
 
</p>
        <p>
Keith Rome<br />
MCSD MCDBA MCAD 
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=f1646074-09a7-4e0f-ac9e-c4ffb8c7fa94" />
      </body>
      <title>CANCELLED: Atlanta C# User Group Meeting for June 2006</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,f1646074-09a7-4e0f-ac9e-c4ffb8c7fa94.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2006/06/01/CANCELLEDAtlantaCUserGroupMeetingForJune2006.aspx</link>
      <pubDate>Thu, 01 Jun 2006 02:00:16 GMT</pubDate>
      <description>&lt;p&gt;
Just in case you happen to monitor this weblog, but have not registered with the group's
mailing list:
&lt;/p&gt;
&lt;p&gt;
------------------------------------
&lt;/p&gt;
&lt;p&gt;
Please be aware that due to inability to secure a speaker for this month, the &lt;a href="http://www.atlantacsharp.org/"&gt;Atlanta
C# User Group&lt;/a&gt; will NOT be meeting in June.
&lt;/p&gt;
&lt;p&gt;
Also, the July meeting would fall adjacent to the Independance Day holiday, and therefore
there will not be a C# Meeting in July either. 
&lt;/p&gt;
&lt;p&gt;
Our next scheduled meeting is currently expected for August, more details will be
posted when we get nearer to the meeting date.
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
**** A CALL FOR SPEAKERS ****
&lt;/p&gt;
&lt;p&gt;
If you have a topic that you would like to present to the group, please contact me
to discuss your ideas. We have lots of available time slots in the coming months,
and our group is a fantastic place to hone your public speaking skills and to contribute
back to the user group community. 
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
**** SPONSORS ****
&lt;/p&gt;
&lt;p&gt;
If your company is interested in sponsoring a month (or more) of the Atlanta C# Developers
Group, please contact me to discuss. Sponsorship is inexpensive and a great way to
market your organization. 
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
*****************************************
&lt;/p&gt;
&lt;p&gt;
NOTE: You have received this message because your email address was registered at
the Atlanta C# Developers Group website at&lt;br&gt;
&lt;a href="http://www.atlantacsharp.org/"&gt;http://www.atlantacsharp.org/&lt;/a&gt; .
&lt;/p&gt;
&lt;p&gt;
*****************************************
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Keith Rome&lt;br&gt;
MCSD MCDBA MCAD 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=f1646074-09a7-4e0f-ac9e-c4ffb8c7fa94" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,f1646074-09a7-4e0f-ac9e-c4ffb8c7fa94.aspx</comments>
      <category>.NET</category>
      <category>Events</category>
      <category>General</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=01e92eee-5603-4372-bb31-52d98afdd032</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,01e92eee-5603-4372-bb31-52d98afdd032.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,01e92eee-5603-4372-bb31-52d98afdd032.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=01e92eee-5603-4372-bb31-52d98afdd032</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In case you haven't heard, the 2006 Atlanta Code Camp site has now begun accepting
registrations. This year promises to be even more successful than last, we have nearly
thirty topic submissions, so many in fact that we will not be able to accept them
all due to the realities of physical meeting space and event logistics.
</p>
        <p>
We are planning on 5 different topic tracks, so there should be a little bit of something
for everyone.
</p>
        <p>
You can now register for the Atlanta Code Camp by clicking on the registration link
on <a href="http://www.atlantacodecamp.com/">http://www.atlantacodecamp.com/</a> or
go directly to the registration site at <a href="https://www.clicktoattend.com/invitation.aspx?code=108776">https://www.clicktoattend.com/invitation.aspx?code=108776</a>.
</p>
        <p>
 
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=01e92eee-5603-4372-bb31-52d98afdd032" />
      </body>
      <title>2006 Atlanta Code Camp</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,01e92eee-5603-4372-bb31-52d98afdd032.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2006/05/01/2006AtlantaCodeCamp.aspx</link>
      <pubDate>Mon, 01 May 2006 03:48:09 GMT</pubDate>
      <description>&lt;p&gt;
In case you haven't heard, the 2006 Atlanta Code Camp site has now begun accepting
registrations. This year promises to be even more successful than last, we have nearly
thirty topic submissions, so many in fact that we will not be able to accept them
all due to the realities of physical meeting space and event logistics.
&lt;/p&gt;
&lt;p&gt;
We are planning on 5 different topic tracks, so there should be a little bit of something
for everyone.
&lt;/p&gt;
&lt;p&gt;
You can now register for the Atlanta Code Camp by clicking on the registration link
on &lt;a href="http://www.atlantacodecamp.com/"&gt;http://www.atlantacodecamp.com/&lt;/a&gt; or
go directly to the registration site at &lt;a href="https://www.clicktoattend.com/invitation.aspx?code=108776"&gt;https://www.clicktoattend.com/invitation.aspx?code=108776&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=01e92eee-5603-4372-bb31-52d98afdd032" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,01e92eee-5603-4372-bb31-52d98afdd032.aspx</comments>
      <category>.NET</category>
      <category>Events</category>
      <category>General</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=d9db4d1d-babf-4590-b89c-4fc788fb7a4f</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,d9db4d1d-babf-4590-b89c-4fc788fb7a4f.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,d9db4d1d-babf-4590-b89c-4fc788fb7a4f.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=d9db4d1d-babf-4590-b89c-4fc788fb7a4f</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <a href="http://dotnetworkaholic.com/">Paul
Lockwood</a> gave an interesting presentation last night to the <a href="http://www.atlantadotnet.org/">.NET
UG</a> on TDD. I will admit that haven't integrated this methodology deeply into my
own development habits (yet). I do however recognize the benefits, and fully intend
to incorporate it into my habits, just taking things one step at a time as I push
my own skills to ever higher levels. So to me, the discussion was quite timely.<br /><p></p><br />
Listening to audience feedback, it appears that a number of folks (<a href="http://vitaminzrecords.com/blog/">Rusty</a>, <a href="http://www.gridviewgirl.com/GridViewGirl/">Marcie</a>,
etc) are already leveraging this technique... and have some really positive opinions
of it. When smart people are recommending something with such enthusiasm, it is generally
a wise thing to pay attention.<br /><br />
One thing I would have liked to have seen is an end-to-end example of the process
itself. I have seen unit tests before, I have even used NUnit on a few projects, but
never to much success. I always felt like I was "not getting it". I get the impression
(mainly from Rusty's comments), that this is normal, and there is a point of critical
mass, serendipity if you will, where it all just starts to "make sense", and your
Unit Tests become the first-class citizens that they deserve to be. I want to reach
that point, but am shooting blind right now... a slight nudge towards that light is
really what I need I think.<br /><br />
My current development habits have served me well (I have been told on more than one
occasion that I am the most meticulous developer ever to pick up a keyboard), but
I wish to push it to the next level. Zero defects in QA Iteration 1 is the Holy Grail.
So now I at least have an idea of what I need to work towards. The next step is finding
the best path to get there.<br /><br /><img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=d9db4d1d-babf-4590-b89c-4fc788fb7a4f" /></body>
      <title>Unit testing and Test Driven Development</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,d9db4d1d-babf-4590-b89c-4fc788fb7a4f.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2006/03/01/UnitTestingAndTestDrivenDevelopment.aspx</link>
      <pubDate>Wed, 01 Mar 2006 00:11:32 GMT</pubDate>
      <description>&lt;a href="http://dotnetworkaholic.com/"&gt;Paul Lockwood&lt;/a&gt; gave an interesting presentation
last night to the &lt;a href="http://www.atlantadotnet.org/"&gt;.NET UG&lt;/a&gt; on TDD. I will
admit that haven't integrated this methodology deeply into my own development habits
(yet). I do however recognize the benefits, and fully intend to incorporate it into
my habits, just taking things one step at a time as I push my own skills to ever higher
levels. So to me, the discussion was quite timely.&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;br&gt;
Listening to audience feedback, it appears that a number of folks (&lt;a href="http://vitaminzrecords.com/blog/"&gt;Rusty&lt;/a&gt;, &lt;a href="http://www.gridviewgirl.com/GridViewGirl/"&gt;Marcie&lt;/a&gt;,
etc) are already leveraging this technique... and have some really positive opinions
of it. When smart people are recommending something with such enthusiasm, it is generally
a wise thing to pay attention.&lt;br&gt;
&lt;br&gt;
One thing I would have liked to have seen is an end-to-end example of the process
itself. I have seen unit tests before, I have even used NUnit on a few projects, but
never to much success. I always felt like I was "not getting it". I get the impression
(mainly from Rusty's comments), that this is normal, and there is a point of critical
mass, serendipity if you will, where it all just starts to "make sense", and your
Unit Tests become the first-class citizens that they deserve to be. I want to reach
that point, but am shooting blind right now... a slight nudge towards that light is
really what I need I think.&lt;br&gt;
&lt;br&gt;
My current development habits have served me well (I have been told on more than one
occasion that I am the most meticulous developer ever to pick up a keyboard), but
I wish to push it to the next level. Zero defects in QA Iteration 1 is the Holy Grail.
So now I at least have an idea of what I need to work towards. The next step is finding
the best path to get there.&lt;br&gt;
&lt;br&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=d9db4d1d-babf-4590-b89c-4fc788fb7a4f" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,d9db4d1d-babf-4590-b89c-4fc788fb7a4f.aspx</comments>
      <category>.NET</category>
      <category>Events</category>
      <category>General</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=379383da-d721-4e94-80e4-6a4a67ad3d56</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,379383da-d721-4e94-80e4-6a4a67ad3d56.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,379383da-d721-4e94-80e4-6a4a67ad3d56.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=379383da-d721-4e94-80e4-6a4a67ad3d56</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Last night, the <a href="http://www.atlantamspros.com/">Atlanta MS Professionals User
Group</a> was treated to an outstanding presentation by one of the great gurus of
Windows programming - Jeffrey Richter of <a href="http://www.wintellect.com/">Wintellect</a>.
His coverage of the internals of CLR thread termination and associated concerns was
extremely enlightening. I would rank this talk as easily being in the top 5 presentations
I have ever had the opportunity to attend (and I have seen a LOT in recent years).
</p>
        <p>
Anyways, Jeffrey has a new book coming out in March (<em>"CLR Via C#: Applied Microsoft
.Net Framework 2.0 Programming"</em>), which he claims will be his last. I made sure
to pre-order a copy ($50!) so I can divine some of his wisdom and insight.
</p>
        <p>
 
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=379383da-d721-4e94-80e4-6a4a67ad3d56" />
      </body>
      <title>Atlanta MS Professionals UG</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,379383da-d721-4e94-80e4-6a4a67ad3d56.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2006/02/21/AtlantaMSProfessionalsUG.aspx</link>
      <pubDate>Tue, 21 Feb 2006 18:30:46 GMT</pubDate>
      <description>&lt;p&gt;
Last night, the &lt;a href="http://www.atlantamspros.com/"&gt;Atlanta MS Professionals User
Group&lt;/a&gt; was treated to an outstanding presentation by one of the great gurus of
Windows programming - Jeffrey Richter of &lt;a href="http://www.wintellect.com/"&gt;Wintellect&lt;/a&gt;.
His coverage of the internals of CLR thread termination and associated concerns was
extremely enlightening. I would rank this talk as easily being in the top 5 presentations
I have ever had the opportunity to attend (and I have seen a LOT in recent years).
&lt;/p&gt;
&lt;p&gt;
Anyways, Jeffrey has a new book coming out in March (&lt;em&gt;"CLR Via C#: Applied Microsoft
.Net Framework 2.0 Programming"&lt;/em&gt;), which he claims will be his last. I made sure
to pre-order a copy ($50!) so I can divine some of his wisdom and insight.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=379383da-d721-4e94-80e4-6a4a67ad3d56" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,379383da-d721-4e94-80e4-6a4a67ad3d56.aspx</comments>
      <category>.NET</category>
      <category>Events</category>
      <category>General</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=4ad99e3f-44f3-4304-ab9f-dd11ae029e44</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,4ad99e3f-44f3-4304-ab9f-dd11ae029e44.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,4ad99e3f-44f3-4304-ab9f-dd11ae029e44.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=4ad99e3f-44f3-4304-ab9f-dd11ae029e44</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Rik explains how to use a Visual Studio macro to <a href="http://www.r2musings.com/GoogleMSDNSearchWithinVisualStudio2005.aspx">search
for highlited text using Google</a> (or alternatively from MSDN2 online) directly
from within the IDE... its a pretty cool trick.
</p>
        <p>
Which reminds me - Rik R has been a friend of mine for a few years now (a former coworker
from 2001/2002), we were building highly interactive websites years ago using javascript,
xml, and XmlHttpRequest. Today, we would call such a system a "Web 2.0 AJAX site".
But back then, it was seen as heretical - since postbacks were the status quo. Anyways...
I finally talked him into blogging... you can catch the feed at <a href="http://www.r2musings.com">www.r2musings.com</a> as
he writes about his journey in the land of .NET
</p>
        <p>
Speaking of new bloggers.... I also convinced Dan Attis to pick up the habit not too
long ago... and as you can tell from the activity on his <a href="http://devcow.com/blogs/jdattis/default.aspx">weblog</a>,
he is quite the prolific writer!
</p>
        <p>
 
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=4ad99e3f-44f3-4304-ab9f-dd11ae029e44" />
      </body>
      <title>Adding a Google or MSDN2 search to VS2005</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,4ad99e3f-44f3-4304-ab9f-dd11ae029e44.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2006/01/30/AddingAGoogleOrMSDN2SearchToVS2005.aspx</link>
      <pubDate>Mon, 30 Jan 2006 20:52:21 GMT</pubDate>
      <description>&lt;p&gt;
Rik explains how to use a Visual Studio macro to &lt;a href="http://www.r2musings.com/GoogleMSDNSearchWithinVisualStudio2005.aspx"&gt;search
for highlited text using Google&lt;/a&gt; (or alternatively from MSDN2 online) directly
from within the IDE... its a pretty cool trick.
&lt;/p&gt;
&lt;p&gt;
Which reminds me - Rik R has been a friend of mine for a few years now (a former coworker
from 2001/2002), we were building highly interactive websites years ago using javascript,
xml, and XmlHttpRequest. Today, we would call such a system a "Web 2.0 AJAX site".
But back then, it was seen as heretical - since postbacks were the status quo. Anyways...
I finally talked him into blogging... you can catch the feed at &lt;a href="http://www.r2musings.com"&gt;www.r2musings.com&lt;/a&gt; as
he writes about his journey in the land of .NET
&lt;/p&gt;
&lt;p&gt;
Speaking of new bloggers.... I also convinced Dan Attis to pick up the habit not too
long ago... and as you can tell from the activity on&amp;nbsp;his &lt;a href="http://devcow.com/blogs/jdattis/default.aspx"&gt;weblog&lt;/a&gt;,
he is quite the prolific writer!
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=4ad99e3f-44f3-4304-ab9f-dd11ae029e44" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,4ad99e3f-44f3-4304-ab9f-dd11ae029e44.aspx</comments>
      <category>.NET</category>
      <category>General</category>
      <category>Tips and Tricks</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=623a672d-1d6e-42b2-9f21-fdd78dbad433</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,623a672d-1d6e-42b2-9f21-fdd78dbad433.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,623a672d-1d6e-42b2-9f21-fdd78dbad433.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=623a672d-1d6e-42b2-9f21-fdd78dbad433</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I came across this site tonight... it is another ajax framework with some interesting
stuff going on behind the scenes. This approach really lowers the entry bar for building
simple ajax-driven portlets (it can literally suck in a functional page and inject
the content into a new web part / portlet)... a nice and simple approach.
</p>
        <p>
Check it out at <a href="http://www.pageflakes.com/">http://www.pageflakes.com/</a></p>
        <p>
They are also claiming to be giving away an xBox 360 in a "flake building" contest
through february.
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=623a672d-1d6e-42b2-9f21-fdd78dbad433" />
      </body>
      <title>PageFlakes</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,623a672d-1d6e-42b2-9f21-fdd78dbad433.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2006/01/05/PageFlakes.aspx</link>
      <pubDate>Thu, 05 Jan 2006 06:56:28 GMT</pubDate>
      <description>&lt;p&gt;
I came across this site tonight... it is another ajax framework with some interesting
stuff going on behind the scenes. This approach really lowers the entry bar for building
simple ajax-driven portlets (it can literally suck in a functional page and inject
the content into a new web part / portlet)... a nice and simple approach.
&lt;/p&gt;
&lt;p&gt;
Check it out at &lt;a href="http://www.pageflakes.com/"&gt;http://www.pageflakes.com/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
They are also claiming to be giving away an xBox 360 in a "flake building" contest
through february.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=623a672d-1d6e-42b2-9f21-fdd78dbad433" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,623a672d-1d6e-42b2-9f21-fdd78dbad433.aspx</comments>
      <category>.NET</category>
      <category>General</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=58d68111-b577-4edd-997b-28fc0275a6b1</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,58d68111-b577-4edd-997b-28fc0275a6b1.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,58d68111-b577-4edd-997b-28fc0275a6b1.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=58d68111-b577-4edd-997b-28fc0275a6b1</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I have been following this blog for a while now - it is quite active and has great
timely information on AJAX technologies (not just .NET either - they talk about anything
ajax):
</p>
        <p>
 
</p>
        <p>
          <a href="http://www.ajaxian.com/">http://www.ajaxian.com/</a>
        </p>
        <p>
.
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=58d68111-b577-4edd-997b-28fc0275a6b1" />
      </body>
      <title>Interested in AJAX?</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,58d68111-b577-4edd-997b-28fc0275a6b1.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2005/12/06/InterestedInAJAX.aspx</link>
      <pubDate>Tue, 06 Dec 2005 17:46:48 GMT</pubDate>
      <description>&lt;p&gt;
I have been following this blog for a while now - it is quite active and has great
timely information on AJAX technologies (not just .NET either - they talk about anything
ajax):
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.ajaxian.com/"&gt;http://www.ajaxian.com/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=58d68111-b577-4edd-997b-28fc0275a6b1" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,58d68111-b577-4edd-997b-28fc0275a6b1.aspx</comments>
      <category>.NET</category>
      <category>General</category>
      <category>Tips and Tricks</category>
    </item>
    <item>
      <trackback:ping>http://www.mindfusioncorp.com/weblog/Trackback.aspx?guid=6064777c-9422-4eee-a2da-8ed7a04f37a8</trackback:ping>
      <pingback:server>http://www.mindfusioncorp.com/weblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.mindfusioncorp.com/weblog/PermaLink,guid,6064777c-9422-4eee-a2da-8ed7a04f37a8.aspx</pingback:target>
      <dc:creator>Keith Rome</dc:creator>
      <wfw:comment>http://www.mindfusioncorp.com/weblog/CommentView,guid,6064777c-9422-4eee-a2da-8ed7a04f37a8.aspx</wfw:comment>
      <wfw:commentRss>http://www.mindfusioncorp.com/weblog/SyndicationService.asmx/GetEntryCommentsRss?guid=6064777c-9422-4eee-a2da-8ed7a04f37a8</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I recently needed to implement an HttpHandler in a project to handle retrieval of
rendered PDF reports from a database. It shouldn't have been a big deal, very few
lines of code, even less than typical since my Business Logic Layer encapsulates all
of the aspects of the data retrieval itself into a single line of code... my handler
only had to set the ContentType, add a couple of headers (Content-Length and Content-Disposition),
and then BinaryWrite() the data. Easy as pie, or so I thought.
</p>
        <p>
The file streamed fine out of the database - no surprises there. Content-Length had
no issue and once I remembered to install Acrobat Reader into my VPC where I was testing
this, then the ContentType of "application/pdf" worked as well.
</p>
        <p>
But try as I might, I could not seem to get that darn Content-Disposition to be recognized
by Internet Explorer! Every time I tested it, the "Save" dialog would always display
a random file name, instead of the one I supplied in the header.
</p>
        <p>
I double-checked, then triple-checked my code. I had two other web developers look
at the code, and give it a thumbs-up. I even resorted to tracing the HTTP protocol
traffic just to be 100% certain that IE was getting the HTTP header. Sure enough,
the header was being set and IE was seeing it. But it wasnt obeying it.
</p>
        <p>
It turns out there seems to be a maximum length to the filename you can supply using
the attachment notation of the Content-Disposition header. And my filename was in
excess of that limit, causing it to be ignored by IE. While I am not sure what the
exact limit is (or if it is some other kind of esoteric bug in IE), and do not have
time to experiment and discover that limit, simply reducing the length of my attachment
filename has resolved the issue.
</p>
        <p>
By the way, the length of the filename causing a problem was only something
like 40 to 50 characters, which really isn't unrealistic. I was embedding the report
execution date/time (in a string format that is valid in a file name), in order to
prevent saved reports from being overwritten.
</p>
        <img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=6064777c-9422-4eee-a2da-8ed7a04f37a8" />
      </body>
      <title>Weird HTTP header issue in Internet Explorer 6</title>
      <guid isPermaLink="false">http://www.mindfusioncorp.com/weblog/PermaLink,guid,6064777c-9422-4eee-a2da-8ed7a04f37a8.aspx</guid>
      <link>http://www.mindfusioncorp.com/weblog/2005/12/05/WeirdHTTPHeaderIssueInInternetExplorer6.aspx</link>
      <pubDate>Mon, 05 Dec 2005 03:55:51 GMT</pubDate>
      <description>&lt;p&gt;
I recently needed to implement an HttpHandler in a project to handle retrieval of
rendered PDF reports from a database. It shouldn't have been a big deal, very few
lines of code, even less than typical since my Business Logic Layer encapsulates all
of the aspects of the data retrieval itself into a single line of code... my handler
only had to set the ContentType, add a couple of headers (Content-Length and Content-Disposition),
and then BinaryWrite() the data. Easy as pie, or so I thought.
&lt;/p&gt;
&lt;p&gt;
The file streamed fine out of the database - no surprises there. Content-Length had
no issue and once I remembered to install Acrobat Reader into my VPC where I was testing
this, then the ContentType of "application/pdf"&amp;nbsp;worked as well.
&lt;/p&gt;
&lt;p&gt;
But try as I might, I could not seem to get that darn Content-Disposition to be recognized
by Internet Explorer! Every time I tested it, the "Save" dialog would always display
a random file name, instead of the one I supplied in the header.
&lt;/p&gt;
&lt;p&gt;
I double-checked, then triple-checked my code. I had two other web developers look
at the code, and give it a thumbs-up. I even resorted to tracing the HTTP protocol
traffic just to be 100% certain that IE was getting the HTTP header. Sure enough,
the header was being set and IE was seeing it. But it wasnt obeying it.
&lt;/p&gt;
&lt;p&gt;
It turns out there seems to be a maximum length to the filename you can supply using
the attachment notation of the Content-Disposition header. And my filename was in
excess of that limit, causing it to be ignored by IE. While I am not sure what the
exact limit is (or if it is some other kind of esoteric bug in IE), and do not have
time to experiment and discover that limit, simply reducing the length of my attachment
filename has resolved the issue.
&lt;/p&gt;
&lt;p&gt;
By the way, the length&amp;nbsp;of the filename causing a problem&amp;nbsp;was only something
like 40 to 50 characters, which really isn't unrealistic. I was embedding the report
execution date/time (in a string format that is valid in a file name), in order to
prevent saved reports from being overwritten.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.mindfusioncorp.com/weblog/aggbug.ashx?id=6064777c-9422-4eee-a2da-8ed7a04f37a8" /&gt;</description>
      <comments>http://www.mindfusioncorp.com/weblog/CommentView,guid,6064777c-9422-4eee-a2da-8ed7a04f37a8.aspx</comments>
      <category>.NET</category>
      <category>General</category>
      <category>Tips and Tricks</category>
    </item>
  </channel>
</rss>