<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-18281936</id><updated>2012-01-24T21:57:33.090-08:00</updated><category term='ruby'/><category term='web application'/><category term='Windows Communication Foundation'/><category term='Virtual PC'/><category term='ASP.NET 2.0'/><category term='Microsoft'/><category term='MOSS 2007'/><category term='Performance'/><category term='Windows Workflow Foundation'/><category term='perl'/><category term='code syntax'/><category term='Silverlight 2.0'/><category term='Clojure'/><category term='Windows Server 2008'/><category term='Oracle'/><category term='Windows Presentation Foundation'/><category term='WF'/><category term='webparts'/><category term='f#'/><category term='haskell'/><category term='IDictionary'/><category term='Apache web server'/><category term='Windows SharePoint Services'/><category term='eclipse'/><category term='.NET 3.5'/><category term='Workflow Foundation'/><category term='xml'/><category term='SharePoint 2007'/><category term='Glassfish metro'/><category term='java'/><category term='IEnumerable'/><category term='Apache Struts 2.0'/><category term='.NET 3.0'/><category term='xslt'/><category term='.NET Framework'/><category term='Coherence'/><category term='web services'/><category term='WSS'/><category term='C#'/><category term='webwork'/><category term='Tomcat'/><category term='WCF'/><category term='color'/><category term='functional programming'/><category term='Don Syme'/><category term='ViewState'/><category term='j2ee'/><category term='saxon'/><category term='Petzold'/><category term='WPF'/><category term='.NET'/><category term='Silverlight'/><category term='InfoPath'/><title type='text'>John Liao's  Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jyliao.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jyliao.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>John Liao</name><uri>http://www.blogger.com/profile/04740715435312568366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>55</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-18281936.post-7405520043120060073</id><published>2012-01-20T17:52:00.000-08:00</published><updated>2012-01-20T17:52:37.015-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='f#'/><title type='text'>Translating If-Then-Else Control Flow Idiom to F#</title><content type='html'>&lt;p&gt;I was reading through Juval L&amp;#246;wy's &lt;a href="http://www.amazon.com/exec/obidos/ASIN/0596805489/techie2biz-20"&gt;Programming WCF Services&lt;/a&gt; book and wondering if I should do a series of WCF blog posts in F# based on L&amp;#246;wy's book when I ran into a common construct found in C# programs.  That construct looks something like the following C# code:
&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;
    public static void MyMethod(String oldstuff, String newstuff, bool flag)
    {
        if (oldstuff == null)
         throw new Exception("oldstuff is null!");

        if (newstuff == null)  {
            DoSomething("Default");
            return;
        }
        if (flag == false)  {
            DoSomething(oldstuff);
            return;
        }
        DoSomething(newstuff);
    }

&lt;/pre&gt;
&lt;p&gt;This is a construct that I oftened have used in the past and have never thought about it much.  But when you translate the above code directly into F#, it becomes a lot more verbose because F# requires you to implement the &lt;code&gt;then&lt;/code&gt; clause.  A direct translation to F# as follows:&lt;/p&gt;
&lt;pre class="brush: fsharp;"&gt;
let mymethod oldstuff newstuff flag =
    if oldstuff = null then 
        raise (new Exception("oldstuff is null!"))
    else
        if newstuff = null then
            DoSomething("Default")
        else
            if flag = false then
                DoSomething(oldstuff)
            else
                DoSomething(newstuff)
&lt;/pre&gt;
&lt;p&gt;If I had a lot of these if-then-else statements in my C# method, then my F# version would disappear off the screen to the right if I tried to implement it by direct translation.  I thought about how I could implement this in F# and came up with this following possibility:&lt;/p&gt;
&lt;pre class="brush: fsharp;"&gt;
let revised_mymethod oldstuff newstuff flag =
    let (_,action) =
        [(oldstuff=null,  lazy (raise (new Exception("oldstuff is null!"))));
         (newstuff=null,  lazy (DoSomething("Default")));
         (flag=false,     lazy (DoSomething(oldstuff)));
         (flag=true,      lazy (DoSomething(newstuff)))]
        |&amp;gt; List.filter fst
        |&amp;gt; List.head
    action.Force()
&lt;/pre&gt;
&lt;p&gt;Rewriting the C# code in this fashion makes me think of rules engines and after refactoring out some common code, I could rewrite the above F# code as follows:&lt;/p&gt;
&lt;pre class="brush: fsharp;"&gt;
let followrules (xs:(bool*Lazy&amp;lt;unit&amp;gt;) list) =
    (xs |&amp;gt; List.filter fst |&amp;gt; List.head |&amp;gt; snd).Force()

let revised_mymethod2 oldstuff newstuff flag =
    [(oldstuff=null , lazy (raise (new Exception("oldstuff is null!"))));
     (newstuff=null,  lazy (DoSomething("Default")));
     (flag=false,     lazy (DoSomething(oldstuff)));
     (flag=true,      lazy (DoSomething(newstuff)))]
    |&amp;gt; followrules

&lt;/pre&gt;
&lt;p&gt;With this new construct, I can easily re-arrange the order of evaluation, add or remove new conditions.  This new construct just seems to have more advantages than the old if-then-else construct in F#.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18281936-7405520043120060073?l=jyliao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jyliao.blogspot.com/feeds/7405520043120060073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18281936&amp;postID=7405520043120060073' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/7405520043120060073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/7405520043120060073'/><link rel='alternate' type='text/html' href='http://jyliao.blogspot.com/2012/01/translating-if-then-else-control-flow.html' title='Translating If-Then-Else Control Flow Idiom to F#'/><author><name>John Liao</name><uri>http://www.blogger.com/profile/04740715435312568366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18281936.post-7001345717667108870</id><published>2012-01-11T10:32:00.000-08:00</published><updated>2012-01-11T10:32:54.707-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Coherence'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><category scheme='http://www.blogger.com/atom/ns#' term='Clojure'/><category scheme='http://www.blogger.com/atom/ns#' term='Performance'/><title type='text'>Testing Coherence with Clojure</title><content type='html'>&lt;p&gt;A developer came to me the other day asking for help in diagnosing some issues with their application and the interaction with Oracle's Coherence product.  I wanted to write some testing harness to quickly test some Coherence configuration and gave some thought about how I would go and try to replicate the issues that the application had.  I wanted a REPL environment so that I can interactive manipulate the Coherence API and dump outputs on demand.  I decided to use Clojure to experiment with Coherence, although I could have used JRuby, Jython, Groovy or Scala.  From purely a familiarity perspective, I would rank my usage of these listed languages in the order of Ruby first, Python second, Groovy third, Clojure fourth and Scala last.  But for some unknown, deep-seated and probably emotional reasons, I like Clojure more and relish the opportunity to use it.  One of the first thing I tried with Clojure and Coherence is to perform a timing test on adding data to a 2 node distributed cache  in serial vs concurrent mode.  Here's the example Clojure script:&lt;/p&gt;
&lt;pre class="brush: clojure;"&gt;
(import '(org.apache.commons.lang3 RandomStringUtils) 
        '(java.math BigInteger)
        '(java.util Random Date HashMap)
        '(com.tangosol.net NamedCache CacheFactory CacheService Cluster))

(CacheFactory/ensureCluster)
(def cache (CacheFactory/getCache "sandbox"))

(defn random-text [] (RandomStringUtils/randomAlphanumeric 1048576))
(defn random-key [] (RandomStringUtils/randomAlphanumeric 12))


; Testing serial puts
(new Date)
(dotimes [_ 200] (.put cache (random-key) (random-text)))
(new Date)

; Testing concurrent puts
(def buffer (new HashMap))
(new Date)
(dotimes [_ 200] (.put buffer (random-key) (random-text)))
(.putAll cache buffer)
(new Date)
&lt;/pre&gt;
&lt;p&gt;Running this code showed a 2x gain in speed of data load.  On one of the Coherence nodes, I had JVisualVM connected to it and watched the realtime GC behaviors with VisualGC.  It has been fascinating to watch the behaviorial differences between serial vs parallel data load and the memory activities of the Coherence node when my Clojure script was idle.  I hope to conduct more tests in the future looking at GC behaviors and leverage my Clojure script as load driver in my testing efforts and assist me in GC tuning of Coherence instances.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18281936-7001345717667108870?l=jyliao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jyliao.blogspot.com/feeds/7001345717667108870/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18281936&amp;postID=7001345717667108870' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/7001345717667108870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/7001345717667108870'/><link rel='alternate' type='text/html' href='http://jyliao.blogspot.com/2012/01/testing-coherence-with-clojure.html' title='Testing Coherence with Clojure'/><author><name>John Liao</name><uri>http://www.blogger.com/profile/04740715435312568366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18281936.post-4291855959070754930</id><published>2011-11-11T16:41:00.000-08:00</published><updated>2011-11-11T16:41:58.905-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2007'/><category scheme='http://www.blogger.com/atom/ns#' term='f#'/><title type='text'>Revisiting the SharePoint collection adapter for F#</title><content type='html'>&lt;p&gt;Recently, I got to work with SharePoint 2007 again and I revisited a previously written blog &lt;a href="http://jyliao.blogspot.com/2008/09/exploring-sharepoint-2007-object-model.html"&gt;Exploring SharePoint 2007 Object Model with F#&lt;/a&gt;.  In that blog, I complained about the fact that SharePoint collections did not implement IEnumerable, causing me to implement a type specific collection adapter as pilfered from &lt;a href="http://asadewa.wordpress.com/2008/01/03/linq-ing-splistcollection/"&gt;Asfar Sadewa&lt;/a&gt;.  However, as I started to work with more different SharePoint collections, I realized that I need a generic SharePoint collection adapter.  But once again, I was foiled by SharePoint's library designers.  I wanted to ensure some level of type safety for my generic collection adapter and wanted to bound the collection item generic type variable so the client code is restricted to types such as &lt;code&gt;SPWeb&lt;/code&gt;, &lt;code&gt;SPList&lt;/code&gt;, etc.  Looking up the hierarchy, I see the type &lt;code&gt;SPSecurableObject&lt;/code&gt;.  Unfortunately, SharePoint library designers did not make &lt;code&gt;SPSecurableObject&lt;/code&gt; visible to others and the next level up that hierarchy is the Object type.  So I'm stuck with an unbounded generic type for the collection item in my generic version SharePoint collection adapter. Actually, what I really want is to ensure that the collection item type is consistent with the collection type.  I haven't quite figure out if that's even possible to apply that kind of type parameter constraints in C#.  Here is generic version of the SharePoint collection adapter (with the runtime type error leakages) implementation:
&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;
using System;
using System.Collections.Generic;
using Microsoft.SharePoint;

namespace SharePoint.Utility
{
    // I really wanted to apply constraint to TPart to SPSecurableObject
    public class SPCollectionAdapter&amp;lt;TPart, TCollection&amp;gt; : List&amp;lt;TPart&amp;gt; where TCollection : SPBaseCollection
    {
        private TCollection _listCol;

        public SPCollectionAdapter(TCollection listCol)
        {
            _listCol = listCol;
            Refresh();
        }

        private void Refresh()
        {
            this.Clear();
            this.Capacity = _listCol.Count;

            foreach (TPart item in _listCol)
            {
                this.Add(item);
            }
        }

    }
}
&lt;/pre&gt;
&lt;p&gt;This allows me to write my F# code as follows:&lt;/p&gt;

&lt;pre class="brush: fsharp;"&gt;
open Microsoft.SharePoint
open SharePoint.Utility

let path="http://localhost/"
let collection = new SPSite(path)
let site = collection.RootWeb
let lists = SPCollectionAdapter&amp;lt;SPList,SPListCollection&amp;gt;(site.Lists)
Seq.iter (fun (x:SPList) -&gt; printf "%s\n" x.Title) lists

&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18281936-4291855959070754930?l=jyliao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jyliao.blogspot.com/feeds/4291855959070754930/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18281936&amp;postID=4291855959070754930' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/4291855959070754930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/4291855959070754930'/><link rel='alternate' type='text/html' href='http://jyliao.blogspot.com/2011/11/revisiting-sharepoint-collection.html' title='Revisiting the SharePoint collection adapter for F#'/><author><name>John Liao</name><uri>http://www.blogger.com/profile/04740715435312568366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18281936.post-9108143386336875981</id><published>2011-05-09T17:24:00.000-07:00</published><updated>2011-05-09T17:25:20.473-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><title type='text'>Porting the Log Analysis Code to Haskell</title><content type='html'>&lt;p&gt;My coworker approached me the other day and ask what open source log analysis tools would I recommend.  I personally do not have much experience with a general purpose open source log analysis tools so I would have probably recommended him to take a look at &lt;a href="http://www.splunk.com/"&gt;Splunk&lt;/a&gt;.  Since I've recently written a customized log analysis software, I became curious and asked him what he intend to do with the log analysis software.&lt;/p&gt; &lt;p&gt;My coworker said that he needed to analyze Tibco EMS logs.  Tibco EMS logs incoming messages in the order it receives.  My coworker is interested in a set of related messages that is identified by the message ID tag.  His particular issue is that the logs entries that he's interested in are interspersed with other log entries that he's not interested.  He wanted a log file where the log entries are grouped by message id in historical order.&lt;/p&gt;&lt;p&gt;Once I understood his needs, I realize that he did not need the Splunk and that I could quickly adapt my F# log analysis software written in the previous blog post for his need.  When I gave him the modified F# code, he asked me if I could port it to Linux.  That threw me for a loop.  I briefly entertained the idea of building a Mono system and compile F# on Mono but decided against it for now.  I thought it would be easier to just port it to Haskell, which I already have on Linux.&lt;/p&gt;&lt;p&gt;Here's the ported Haskell log analysis software with modifications to work with Tibco log entries.&lt;/p&gt;
&lt;p&gt;
&lt;pre class="brush: haskell;"&gt;

import Data.Time.Calendar
import Data.Time.LocalTime
import Data.Time.Parse
import List
import System.Environment

type Category = String
type Entry = [String]
type TimeStamp = (LocalTime,String)
type LogHeader = (TimeStamp, Category)

alphaTime = LocalTime (fromGregorian 2000 1 1) midnight 

data LogEntry = LogEntry (TimeStamp, String) [String]
                deriving (Show)

{- Grab label -}
categorize (_ : _ : label : _) = label
categorize words = ""

{- Grab timestamp -}
timestamp (date : time : _ )  = strptime "%Y-%m-%d %H:%M:%S" (date ++ " " ++ time)
timestamp words  = Nothing
           
{- header :: String -&gt; (String, Maybe (LocalTime, String)) -}           
header line = (timestamp tokens, categorize tokens)    
    where tokens = words line

{- Concrete implementation of Tibco log parser -}    
logparser :: [String] -&gt; LogHeader -&gt; [String] -&gt; [LogEntry] -&gt; [LogEntry]
logparser (line : rest) xheader entry entries  = process (header line)    
    where process (Just (ts),label) = 
              logparser rest h [line] ((LogEntry xheader (reverse entry)):entries ) where h = (ts,label)
          process (Nothing,_) = logparser rest xheader (line : entry) entries

logparser [] xheader entry entries = reverse ((LogEntry xheader entry) : entries) 

{- Utility method  to pull items out of LogEntry -}
entry (LogEntry _ entries) = entries    
category (LogEntry (_,label) _) = label

{- comparator based on category -}
categorysort (LogEntry (_,a) _) (LogEntry (_,b) _) 
    | a &gt; b = GT
    | a &lt; b = LT
    | otherwise = EQ

parselog parser lines = parser lines ((alphaTime,".000"),"STARTFLAG") [] []
    
processlog = unlines
             . map (unlines . entry)
             . sortBy categorysort
             . (parselog logparser)
             . lines 

main = do (filename:_) &lt;- getArgs
          contents &lt;- readFile filename
          putStr (processlog contents)

&lt;/pre&gt;
&lt;/p&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18281936-9108143386336875981?l=jyliao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jyliao.blogspot.com/feeds/9108143386336875981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18281936&amp;postID=9108143386336875981' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/9108143386336875981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/9108143386336875981'/><link rel='alternate' type='text/html' href='http://jyliao.blogspot.com/2011/05/porting-log-analysis-code-to-haskell.html' title='Porting the Log Analysis Code to Haskell'/><author><name>John Liao</name><uri>http://www.blogger.com/profile/04740715435312568366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18281936.post-5510903789813899054</id><published>2011-03-21T12:36:00.000-07:00</published><updated>2011-03-21T12:36:29.992-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='f#'/><title type='text'>Log Analysis with F#</title><content type='html'>&lt;p&gt;I am often pulled into investigative teams to resolve performance issues.  In one particular instance, I was involved in troubleshooting a Java-based batch job that had experience performance issue after it migrated from an older database platform to a newer database platform.  Typically in these performance related issues, I would analyze the logs to see if I can spot tell tale signs of performance issues.  Some of these log files can range up to millions of lines of text.  In this particular case, I received a log file with of almost 4 million lines of text.  I do not want to wade through these log files by hand.  In the past, I would have use a scripting language like perl or ruby to help parse these logs.  But lately, I have leaned more towards F# to analyze log files.  The following describes my experience with developing my log analysis software in F#.&lt;/p&gt;&lt;p&gt;The log files that I have received have sample entries with the following pattern:&lt;/p&gt;&lt;p&gt;&lt;pre&gt;
02/04/11 21:15:55 xyz 123 CATEGORY_LABEL Lorem ipsum dolor sit amet 
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
    Aliquam varius mollis purus, vel molestie lorem pellentesque sed. 
&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;where CATEGORY_LABEL categorizes the jobs performed and each log entry always starts with a timestamp.  Typically, multiple jobs are running at the same time so the log entries have data interspersed. To start this effort, I want to capture the timestamp information, the category label and the entire log entry.  To model this, I created the following type to capture a log entry:&lt;/p&gt;&lt;p&gt;&lt;pre class="brush: fsharp;"&gt;

type LogEntry =
    {
        Timestamp : DateTime;
        Category  : string;
        Entry     : string list;
    }
&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;I want to be able to easily access Timestamp and Category label information while retaining the entire log entry for that timestamp/category.  I decided to model the log entry as a list of strings.  I had hope to leverage list operations later on to perform filtering capability.  One of the drawbacks to this model for log entry is if the log file had text that split across 2 lines.&lt;/p&gt;&lt;p&gt;The first problem is to extract the timestamp and the category information.  To capture the timestamp information, I implemented the following functions:&lt;/p&gt;&lt;p&gt;&lt;pre class="brush: fsharp;"&gt;

let parsedate datestring = DateTime.TryParse(datestring)

let getTimestamp (words:string []) =
    if words.Length &gt; 2 then
        let timestamp = sprintf "%s %s" words.[0] words.[1]
        match parsedate timestamp with
            | true, d -&gt; Some(d)
            | false,_ -&gt; None
    else None
&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;I leveraged F#'s Option type to return either a valid timestamp or None if no timestamp are found. You can see later how I use this as a filter to determine if I'm at the start of a log entry or not. Here's the code to get the category label:&lt;/p&gt;
&lt;p&gt;&lt;pre class="brush: fsharp;"&gt;
let getCategory (words:string []) =
    if words.Length &gt; 4 then 
        let tokens = words.[4].Split[|':'|]
        tokens.[0]
    // Once in a while, there is log entry with no labels
    else ""
&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;I know that the category label always is the 5th token, but once in a while the category label shows up in the log as CATEGORY_LABEL:Lorem, therefore I have to split the word with the token ":" to extract just the category label.  &lt;/p&gt;&lt;p&gt;With these 2 functions, I can now build my getheader function which would extract the timestamp and category label:&lt;/p&gt;
&lt;p&gt;&lt;pre class="brush: fsharp;"&gt;
    
// Get the timestamp and the job category     
let getHeader (line:string) =
    let words = line.Trim().Split[| ' ' |]
    let timestamp = getTimestamp words
    let category = getCategory words
    (timestamp,category)
&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;I now have all the pieces to be able to build my log parser:    &lt;/p&gt;&lt;p&gt;&lt;pre class="brush: fsharp;"&gt;

// Utility function to create log entry
let createLogEntry (timestamp,category)  entry =
    {Timestamp = timestamp;  Category=category;  Entry = List.rev entry}      
    
    
// Core parser engine to parse the log files
let rec logparser lines oldheader entry (acc:LogEntry list) =
    match lines with
    | line :: rest -&gt; 
        // Check with we got new timestamp with this line
        let header = getHeader line
        match header with
        | (Some(ts),category) -&gt; 
            // Found new timestamp,create log entry from the collected lines
            let logentry = createLogEntry oldheader (line::entry)
            //  Begin new log entry collections
            logparser rest (ts,category) [] (logentry::acc)
        | (None,_) -&gt; 
            // Add new entry to line
            logparser rest oldheader (line::entry) acc
    // We're done with all line processing!
    | [] -&gt; 
        let logentry = createLogEntry oldheader entry
        logentry :: acc |&gt; List.rev
&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;This log parser would recursively processed each line in the log file and build a list of LogEntry to return.  When I find a header, I would begin a new LogEntry.  Because I built the list using the :: (cons) operator, I need to reverse the list when I finish building the list.   I would use the above parser engine as shown in the following code, which would return to me list of all log entries. &lt;/p&gt;&lt;p&gt;&lt;pre class="brush: fsharp;"&gt;
let parselog file parser =
    let lines = File.ReadAllLines(file)
    let past = DateTime.Now
    parser (Array.toList lines) (past,"") [] []
&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;Now I have all the pieces to begin performing log analysis.  I typically begin by chopping the log into smaller pieces.  In the following example, I'm looking for a specific category on specific dates, one before the database migration and one after the database migration.
&lt;/p&gt;&lt;p&gt;&lt;pre class="brush: fsharp;"&gt;
let (_,premigration) = DateTime.TryParse("03/11/2011")
let (_,postmigration) = DateTime.TryParse("03/14/2011")

// Extraction engine to pull logs related to specific job @ specific date
let extract targetdate label file processor =
    parselog file logparser
    |&gt; List.filter (fun x -&gt; x.Timestamp.Date.Equals(targetdate))
    |&gt; List.filter (fun x -&gt; x.Category.Trim().Equals(label))
    |&gt; processor

// End log entry text to file
let send2file file entries=
    entries 
    |&gt; List.map (fun x -&gt; x.Entry)
    |&gt; List.concat
    |&gt; List.toArray
    |&gt; writefile file

// smaller working file - premigration for JOB A
(send2file @"JOBA.premigration.log") |&gt;
extract premigration.Date "JOBA" @"jobs.log" 

// smaller working file - postmigration for JOB A
(send2file @"JOBA.postmigration.log") |&gt;
extract postmigration.Date "JOBA" @"jobs.log" 
&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;Here's another example usage where I wanted to grab clusters of log entries along the time dimension (e.g. unique sets of Timestamp,Category pairs).&lt;/p&gt;&lt;p&gt;&lt;pre class="brush: fsharp;"&gt;
let getEntryClusters targetdate infile outfile  =
    parselog infile logparser
    |&gt; List.filter (fun x -&gt; x.Timestamp.Date.Equals(targetdate))
    |&gt; List.map (fun entry -&gt; (entry.Timestamp,entry.Category))
    |&gt; Set.ofList |&gt; Set.toList
    |&gt; List.map (fun (ts,category) -&gt; sprintf "%s,%s" (ts.ToString()) category)
    |&gt; List.toArray 
    |&gt; writefile outfile

getEntryClusters postmigration.Date @"jobs.log" @"clusters.log"
&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;The interactive capability of F# in Visual Studio made building this log analysis tool a lot easier than I expected.  While I can do similar interactive work with Ruby's irb, or Python's interactive mode, Visual Studio and F# just makes it feel much more productive than either of Ruby or Python's interactive environment.  If I had to analyze another log file with a different format, I can certainly reuse my code and maybe just changed the logparser implementation.  Indeed, just a few days after later, I was able to apply this code to look into some Tibco logs with minimal amount of changes.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18281936-5510903789813899054?l=jyliao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jyliao.blogspot.com/feeds/5510903789813899054/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18281936&amp;postID=5510903789813899054' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/5510903789813899054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/5510903789813899054'/><link rel='alternate' type='text/html' href='http://jyliao.blogspot.com/2011/03/log-analysis-with-f.html' title='Log Analysis with F#'/><author><name>John Liao</name><uri>http://www.blogger.com/profile/04740715435312568366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18281936.post-5780433399540273236</id><published>2010-08-30T09:37:00.000-07:00</published><updated>2010-08-30T09:37:04.350-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='Clojure'/><title type='text'>Exploring Java AES encryption algorithm with Clojure</title><content type='html'>&lt;p&gt;Encryption is one of those library that I use infrequently.  It seems that every time I need to work with some encryption algorithm, it passes memory expiration date of my last implementation usage of some encryption algorithm.   Recently, I had to implement some password encryption tool in Java and again, I had to revisit Java’s encryption library.  In the past, for exploring unfamiliar libraries, I would normally write some code sprinkled with print statements, compile it and run the compiled code and adjust my code afterwards.  But in the past couple years, I’ve become a big fan of REPL development environment for purposes of library exploration.  In the .NET environment, I would use F# Interactive,  Ruby &amp; Python have their own REPL environment.  For Java, I could have picked either Groovy or Clojure.  I’ve scripted Groovy in the past and certainly liked the shorthand expressions to a lot of the Java code. However, I have heard a lot of positive blog posts about Clojure such that I wanted to try it out. &lt;/p&gt;&lt;p&gt;I never had the chance to program in Lisp in the past.  But I have read some of Paul Graham’s articles which seems to make Lisp a programmer’s great secret weapon in becoming a better than average programmer.  So I figure Clojure can get my feet wet with another variant of Lisp and help me accomplish my day job goals at the same time.  The hardest part about learning Clojure was learning the API.  The program structure was not hard to figure out.  I used an RPN based HP 11C calculator while in college and Clojure program structure reminds me a lot of working with RPN calculators (albeit with a lot more parenthesis).  Once I got the hang of the basic Clojure syntax, it became a great environment to work in.  I would define a function, run the code and then interactively explore properties or call methods.  After exploring in Clojure, it became fairly trivial task to translate that to the Java code.&lt;/p&gt;&lt;p&gt;While it was certainly fun to work in Clojure, I'm not sure I can substantiate Paul Graham's claim that knowing Lisp makes you a better than average programmer.  Maybe it's more of the concept that a polyglot programmer generally makes a better programmer simply because the programmer that goes and learns multiple programming languages has a self driven desire to become a better programmer and therefore becomes a better programmer.  I'll leave that discussion to the programmer philosophers out there and return to the more pragmmatic code construction.&lt;/p&gt;&lt;p&gt;Here’s the prototype AES encryption code in Clojure:&lt;/p&gt;
&lt;pre class="brush: clojure;"&gt;
(import (javax.crypto KeyGenerator SecretKey Cipher))
(import (javax.crypto.spec SecretKeySpec))
(import (java.io File FileOutputStream DataInputStream FileInputStream))
(import (java.util Properties))
(import (org.apache.commons.codec.binary Base64))

(def msg "Hello encryption world!")
(defn encode-base64 [raw] (. (new Base64) encode raw))
(defn decode-base64 [coded] (. (new Base64) decode coded))

(def aes (. KeyGenerator getInstance "AES"))
(def cipher (. Cipher getInstance "AES"))
(def encrypt (. Cipher ENCRYPT_MODE))
(def decrypt (. Cipher DECRYPT_MODE))

(defn writekey [rawkey filename]     
    ( let [out (new FileOutputStream (new File filename))]
          (do (. out write rawkey)
              (. out close))))
    
(defn readkey [filename]
    (let [file (new File filename)
          rawkey (byte-array (. file length))
          in  (new DataInputStream (new FileInputStream file))]
          (do (. in readFully rawkey)
              (. in close)
              rawkey
          )))
          
(defn get-propfile [filename]   
    (let [prop (new Properties)]
        (do (. prop load (new FileInputStream filename)))
        prop))
    

(defn genkey [keygen] 
    (do (. keygen init  128)
        (. (. keygen generateKey ) getEncoded)
    )
)    
    
(defn do-encrypt [rawkey plaintext]
    (let [cipher (. Cipher getInstance "AES")]
        (do (. cipher init encrypt (new SecretKeySpec rawkey "AES"))
            (. cipher doFinal (. plaintext getBytes)))))
    
(defn do-decrypt [rawkey ciphertext]
    (let [cipher (. Cipher getInstance "AES")]
        (do (. cipher init  decrypt (new SecretKeySpec rawkey "AES"))
            (new String(. cipher doFinal ciphertext)))))
            
            
(defn get-password [key rawkey filename]
    (let [ props (get-propfile filename)
           coded (. props getProperty key)
           cipher (decode-base64 coded)]
         (do (do-decrypt rawkey cipher))))
         
(comment "Example usage"
(get-password "jms" (readkey "test.key") "data.out")
)         
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18281936-5780433399540273236?l=jyliao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jyliao.blogspot.com/feeds/5780433399540273236/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18281936&amp;postID=5780433399540273236' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/5780433399540273236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/5780433399540273236'/><link rel='alternate' type='text/html' href='http://jyliao.blogspot.com/2010/08/exploring-java-aes-encryption-algorithm.html' title='Exploring Java AES encryption algorithm with Clojure'/><author><name>John Liao</name><uri>http://www.blogger.com/profile/04740715435312568366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18281936.post-8214865336809386587</id><published>2010-05-14T15:12:00.000-07:00</published><updated>2010-05-14T15:22:07.085-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='f#'/><title type='text'>F# FileInfo, DirectoryInfo and DriveInfo</title><content type='html'>&lt;p&gt;Recent changes in my day job have sidetracked me from doing much development or working with F#.  However, to prevent myself from getting rusty with F# development, I decided to pick up the book &lt;a href="http://www.amazon.com/exec/obidos/ASIN/1430225254/techie2biz-20"&gt;Visual C# 2010 Recipes&lt;/a&gt; by Allen Jones, Adam Freeman, Matthew MacDonald, and Rakesh Rajan and randomly work through some
of the recipes in F#.  I've also incorporated Alex Gorbatchev's  &lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter"&gt;Syntax Highligher&lt;/a&gt; along with Steve Gilham's &lt;a href="http://stevegilham.blogspot.com/2009/10/syntaxhighlighter-20-brushes-for-f-and.html"&gt;F# brush&lt;/a&gt; in this blog so source code syntax coloring will start to look very different from before. &lt;/p&gt;
&lt;p&gt;Here is a translation of Recipe 5.1 to F# 2.0:&lt;/p&gt;
&lt;pre class="brush: fsharp;"&gt;
(*  Recipe 5.1. Retrieve Information About a File, Directory or Drive *)
// An interesting aspect when writing this recipe was trying to write
// the display function.  A StackOverflow entry help me to understand
// the printf format string.
// http://stackoverflow.com/questions/2162081/type-of-printfn-in-f-static-vs-dynamic-string
open System
open System.IO

(* Having some fun with pipeline operators... *)
let display  (stuff : (string * string) list) =
    List.iter (fun (fmt,text) -&gt;  Printf.TextWriterFormat&lt;string -&gt; unit&gt;(fmt) |&gt; printfn  &lt;| text) stuff

let displayFile (file:FileInfo) =
    [("File created: %s",file.CreationTime.ToString());
     ("File last updated: %s",file.LastWriteTime.ToString());
     ("File last accessed: %s",file.LastAccessTime.ToString());
     ("File size (bytes): %s",file.Length.ToString());
     ("File attribute list: %s",file.Attributes.ToString());]
    |&gt; display
    
let displayDirectory  (dir:DirectoryInfo) =
    [("Directory created: %s ",dir.CreationTime.ToString());
     ("Directory last updated: %s",dir.LastWriteTime.ToString());
     ("Directory last accessed: %s",dir.LastAccessTime.ToString());
     ("Directory attribute list: %s",dir.Attributes.ToString());
     ("Directory contains: %s files",dir.GetFiles().Length.ToString());]
    |&gt; display

let displayDrive (drive:DriveInfo) =
    [("Drive type: %s", drive.DriveType.ToString());
     ("Drive format: %s", drive.DriveFormat.ToString());
     ("Drive free space: %s", drive.AvailableFreeSpace.ToString());]
    |&gt; display
    

let args = fsi.CommandLineArgs
if args.Length = 1 then
    printfn "Please supply a filename."
    exit 1
    
let file = new FileInfo(args.[1])
if file.Exists then
    displayFile file

    
let dir = file.Directory
[("Checking directory: %s",dir.Name);
 ("In directory: %s",dir.Parent.Name);
 ("Directory exists : %s",dir.Exists.ToString());]
|&gt; display 

if dir.Exists then
    displayDirectory dir
    
let drv = new DriveInfo(file.FullName)

[("Drive: %s",drv.Name);] |&gt; display
if drv.IsReady then
    displayDrive drv
    
Environment.NewLine |&gt; Console.WriteLine
"Main method completed. Press Enter" |&gt; printfn "%s"
Console.ReadLine()

&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18281936-8214865336809386587?l=jyliao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jyliao.blogspot.com/feeds/8214865336809386587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18281936&amp;postID=8214865336809386587' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/8214865336809386587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/8214865336809386587'/><link rel='alternate' type='text/html' href='http://jyliao.blogspot.com/2010/05/f-fileinfo-directoryinfo-and-driveinfo.html' title='F# FileInfo, DirectoryInfo and DriveInfo'/><author><name>John Liao</name><uri>http://www.blogger.com/profile/04740715435312568366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18281936.post-8020211027197832929</id><published>2009-06-11T22:29:00.001-07:00</published><updated>2009-06-11T22:29:48.532-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Presentation Foundation'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Workflow Foundation'/><category scheme='http://www.blogger.com/atom/ns#' term='f#'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Communication Foundation'/><category scheme='http://www.blogger.com/atom/ns#' term='WCF'/><title type='text'>F# and WCF</title><content type='html'>&lt;p&gt;I recently had to implement some self hosted workflows on WF that leverages WCF for inter-process communication.&amp;#160; I’ve found the book &lt;a href="http://www.amazon.com/gp/product/0596101627?ie=UTF8&amp;amp;tag=techie2biz-20&amp;amp;linkCode=xm2&amp;amp;camp=1789&amp;amp;creativeASIN=0596101627"&gt;Learning WCF by Michele Bustamante&lt;/a&gt; helpful for learning and implementing WCF parts of the code and &lt;a href="http://www.amazon.com/gp/product/1590597788?ie=UTF8&amp;amp;tag=techie2biz-20&amp;amp;linkCode=xm2&amp;amp;camp=1789&amp;amp;creativeASIN=1590597788"&gt;Pro WF by Bruce Bukovics&lt;/a&gt; useful for implementing the workflows.&amp;#160; I became curious on how&amp;#160; to implement WCF in F#.&amp;#160; I suspect that WCF services in F# is probably one more likely scenarios for me to introduce F# usage in the corporate environment.&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;For the following sample code, I took the last example with DataGrid and stripped out the portion that retrieves a list of Person from the database and implemented it as a WCF hosted on a separate executable.&amp;#160; There are many other blogs on F# and WCF including those by &lt;a href="http://vernagus.blogspot.com/2009/01/f-and-wcf-data-contracts.html"&gt;Ray Vernagus&lt;/a&gt;, &lt;a href="http://geekswithblogs.net/nickholmes/archive/2009/05/05/an-f-wcf-web-service.aspx"&gt;Nick Holmes&lt;/a&gt; and &lt;a href="http://blogs.tedneward.com/2009/01/18/Building+WCF+Services+With+F+Part+1.aspx"&gt;Ted Neward&lt;/a&gt;.&amp;#160; This blogs were immensely helpful in aiding me to build my own example.&lt;/p&gt;  &lt;p&gt;The blog entry by &lt;a href="http://vernagus.blogspot.com/2009/01/f-and-wcf-data-contracts.html"&gt;Ray Vernagus&lt;/a&gt; seemed to indicate that I needed to define my data contract for Person record with DataContract attribute.&amp;#160; It did not seem like that is necessary in this simple scenario.&amp;#160; However, when I ran my example client code, I did get the following error:&lt;/p&gt;  &lt;p&gt;stdin(0,1): error FS0082: Could not resolve this reference. Could not locate the assembly &amp;quot;PersonService.XmlSerializers.dll&amp;quot;. Check to make sure the assembly exists on disk. If this reference is required by your code, you may get compilation errors. (Code=MSB3245)    &lt;br /&gt;stopped due to error&lt;/p&gt;  &lt;p&gt;The client code still works and subsequent runs does not generate this error.&amp;#160; I was unable to track down what caused this error message and what impact it has on the application.&amp;#160; Even after I added the DataContract attributes to Person type, I still get the same error message.&amp;#160; However, I did not see any impact to the client application due to this error.&amp;#160; I got this error with version 1.9.6.2 of the F# compiler.&amp;#160; My next step would be to try this out with VS2010 beta version of F# compiler.&lt;/p&gt;  &lt;p&gt;Here’s the WCF server code that serves up a list of Person:&lt;/p&gt;  &lt;pre&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;#light&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt;&lt;span&gt; WCF.Test&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Data.Common&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Data.Sql&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Data.SqlClient&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.ServiceModel&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Runtime.Serialization&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;type&lt;/span&gt;&lt;span&gt; Person = &lt;/span&gt;&lt;br /&gt;&lt;span&gt;    {FirstName:string; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;     LastName:string; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;     Email:string; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;     PhoneNumber:string}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;module&lt;/span&gt;&lt;span&gt; DB = &lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; connString =  &lt;/span&gt;&lt;span style="color: #800000"&gt;@&amp;quot;Data Source=.\SQLEXPRESS;Initial Catalog=AdventureWorks;Integrated Security=True;&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; conn = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; SqlConnection(connString)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; query () = &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        seq { &lt;/span&gt;&lt;span style="color: #0000ff"&gt;use&lt;/span&gt;&lt;span&gt; conn = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; SqlConnection(connString)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;              &lt;/span&gt;&lt;span style="color: #0000ff"&gt;do&lt;/span&gt;&lt;span&gt; conn.Open()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;              &lt;/span&gt;&lt;span style="color: #0000ff"&gt;use&lt;/span&gt;&lt;span&gt; comm = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; SqlCommand(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;SELECT top 50 * FROM Person.Contact&amp;quot;&lt;/span&gt;&lt;span&gt;,conn)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;              &lt;/span&gt;&lt;span style="color: #0000ff"&gt;use&lt;/span&gt;&lt;span&gt; reader = comm.ExecuteReader()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;              &lt;/span&gt;&lt;span style="color: #0000ff"&gt;while&lt;/span&gt;&lt;span&gt; reader.Read() &lt;/span&gt;&lt;span style="color: #0000ff"&gt;do&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span style="color: #0000ff"&gt;yield&lt;/span&gt;&lt;span&gt; ({FirstName = reader.GetString 3;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                         LastName = reader.GetString 5;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                         Email = reader.GetString 7;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                         PhoneNumber = reader.GetString 9}) }&lt;/span&gt;&lt;br /&gt;&lt;span&gt;  &lt;/span&gt;&lt;br /&gt;&lt;span&gt;[&amp;lt;ServiceContract()&amp;gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;type&lt;/span&gt;&lt;span&gt; IPersonService = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;interface&lt;/span&gt;&lt;br /&gt;&lt;span&gt;   [&amp;lt;OperationContract()&amp;gt;]&lt;/span&gt;&lt;br /&gt;&lt;span&gt;   &lt;/span&gt;&lt;span style="color: #0000ff"&gt;abstract&lt;/span&gt;&lt;span&gt; GetPersons: unit &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; Person array&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;[&amp;lt;ServiceBehavior(Name=&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;PersonService&amp;quot;&lt;/span&gt;&lt;span&gt;,InstanceContextMode=InstanceContextMode.Single)&amp;gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;type&lt;/span&gt;&lt;span&gt; PersonService() =&lt;/span&gt;&lt;br /&gt;&lt;span&gt;   &lt;/span&gt;&lt;span style="color: #0000ff"&gt;interface&lt;/span&gt;&lt;span&gt; IPersonService &lt;/span&gt;&lt;span style="color: #0000ff"&gt;with&lt;/span&gt;&lt;br /&gt;&lt;span&gt;      &lt;/span&gt;&lt;span style="color: #0000ff"&gt;member&lt;/span&gt;&lt;span&gt; v.GetPersons () = &lt;/span&gt;&lt;br /&gt;&lt;span&gt;          Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;Retrieving people list...&amp;quot;&lt;/span&gt;&lt;span&gt;)      &lt;/span&gt;&lt;br /&gt;&lt;span&gt;          DB.query() |&amp;gt; Seq.to_array&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;do&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;PersonService&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; serviceType = typeof&amp;lt;PersonService&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; address = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Uri(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;http://localhost:28888/PersonService&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; host = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; ServiceHost(serviceType,[|address|])&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    host.Open()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;Press &amp;lt;ENTER&amp;gt; to terminate the host application&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    Console.ReadLine() |&amp;gt; ignore&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    host.Close()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Here’s the configuration file for the WCF service:&lt;/p&gt;

&lt;pre&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #a31515"&gt;xml&lt;/span&gt;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;version&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;1.0&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;encoding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;utf-8&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt; ?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;configuration&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;  &amp;lt;!--&lt;/span&gt;&lt;span style="color: #008000"&gt; here is the base address of our service &lt;/span&gt;&lt;span style="color: #0000ff"&gt;--&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;appSettings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;add&lt;/span&gt;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;key&lt;/span&gt;&lt;span style="color: #0000ff"&gt; =&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;baseAddress&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;http://localhost:28888/PersonService&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;  &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;appSettings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;services&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;service&lt;/span&gt;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;WCF.Test.PersonService&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;behaviorConfiguration&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;PersonServiceBehaviors&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;endpoint&lt;/span&gt;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;address&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;http://localhost:28888/PersonService&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;                  &lt;/span&gt;&lt;span style="color: #ff0000"&gt;binding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;basicHttpBinding&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;                  &lt;/span&gt;&lt;span style="color: #ff0000"&gt;contract&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;WCF.Test.IPersonService&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;endpoint&lt;/span&gt;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;contract&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;IMetadataExchange&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;binding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;mexHttpBinding&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;address&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;mex&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;      &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;service&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;services&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;behaviors&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;serviceBehaviors&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;behavior&lt;/span&gt;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;PersonServiceBehaviors&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt; &amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;          &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;serviceMetadata&lt;/span&gt;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;httpGetEnabled&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;          &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;serviceDebug&lt;/span&gt;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;httpHelpPageEnabled&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;                        &lt;/span&gt;&lt;span style="color: #ff0000"&gt;includeExceptionDetailInFaults&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;behavior&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;      &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;serviceBehaviors&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;behaviors&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;  &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;configuration&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;Here’s the client code:&lt;/p&gt;

&lt;pre&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;#light&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;#I&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;@&amp;quot;C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;#I&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;@&amp;quot;C:\WINNT\Microsoft.NET\Framework\v2.0.50727&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;#r&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;@&amp;quot;WindowsBase.dll&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;#r&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;@&amp;quot;PresentationCore.dll&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;#r&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;@&amp;quot;PresentationFramework.dll&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;#r&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;@&amp;quot;C:\Program Files\WPF Toolkit\v3.5.40320.1\WPFToolkit.dll&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;#r&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;@&amp;quot;c:\dev\webservice\PersonService.dll&amp;quot;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span style="color: #008000"&gt;// Generated with wsdl tool&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; Microsoft.Windows.Controls&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Controls&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; service = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; PersonService()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; persons = service.GetPersons()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; win = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Window(Title=&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;Test DataGrid w/WCF&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; datagrid = DataGrid()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;datagrid.HeadersVisibility &amp;lt;- DataGridHeadersVisibility.Column&lt;/span&gt;&lt;br /&gt;&lt;span&gt;datagrid.ItemsSource &amp;lt;- persons&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;win.Content &amp;lt;- &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; ScrollViewer(Content=datagrid)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;win.Show()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18281936-8020211027197832929?l=jyliao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jyliao.blogspot.com/feeds/8020211027197832929/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18281936&amp;postID=8020211027197832929' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/8020211027197832929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/8020211027197832929'/><link rel='alternate' type='text/html' href='http://jyliao.blogspot.com/2009/06/f-and-wcf.html' title='F# and WCF'/><author><name>John Liao</name><uri>http://www.blogger.com/profile/04740715435312568366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18281936.post-829930227715006263</id><published>2009-06-05T16:52:00.000-07:00</published><updated>2009-06-05T16:59:46.319-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Presentation Foundation'/><category scheme='http://www.blogger.com/atom/ns#' term='f#'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET 3.5'/><title type='text'>Exploring WPF Toolkit's DataGrid with F#</title><content type='html'>&lt;p&gt;I recently received an invitation from &lt;a href="http://research.microsoft.com/en-us/um/people/szummer/"&gt;Martin Szummer&lt;/a&gt; to take a look at the DataGrid control that's part of the &lt;a href="http://wpf.codeplex.com/"&gt;WPF Toolkit&lt;/a&gt;.  That got me curious and I quickly mocked up some code to start exploring the DataGrid with some F# script.  Here's is the F# script that I'm using to explore this control:&lt;/p&gt;
&lt;pre&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;#light&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;#I&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;@"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0"&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;#r&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;@"WindowsBase.dll"&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;#r&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;@"PresentationCore.dll"&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;#r&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;@"PresentationFramework.dll"&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;#r&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;"C:\Program Files\WPF Toolkit\v3.5.40320.1\WPFToolkit.dll"&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; Microsoft.Windows.Controls&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; System&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; System.Data.Common&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; System.Data.Sql&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; System.Data.SqlClient&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; System.Windows&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; System.Windows.Controls&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; connString =  &lt;/span&gt;&lt;span style="color:#800000;"&gt;@"Data Source=.\SQLEXPRESS;Initial Catalog=AdventureWorks;Integrated Security=True;"&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; conn = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; SqlConnection(connString)&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;type&lt;/span&gt;&lt;span style="color:#;"&gt; Person = &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    {FirstName:string; LastName:string; Email:string; PhoneNumber:string}&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; query () = &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    seq { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;use&lt;/span&gt;&lt;span style="color:#;"&gt; conn = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; SqlConnection(connString)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;          &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;do&lt;/span&gt;&lt;span style="color:#;"&gt; conn.Open()&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;          &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;use&lt;/span&gt;&lt;span style="color:#;"&gt; comm = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; SqlCommand(&lt;/span&gt;&lt;span style="color:#800000;"&gt;"SELECT top 100 * &lt;/span&gt;&lt;span style="color:#800000;"&gt; FROM Person.Contact"&lt;/span&gt;&lt;span style="color:#;"&gt;,conn)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;          &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;use&lt;/span&gt;&lt;span style="color:#;"&gt; reader = comm.ExecuteReader()&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;          &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;while&lt;/span&gt;&lt;span style="color:#;"&gt; reader.Read() &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;do&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;             &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;yield&lt;/span&gt;&lt;span style="color:#;"&gt; ({FirstName = reader.GetString 3;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                     LastName = reader.GetString 5;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                     Email = reader.GetString 7;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                     PhoneNumber = reader.GetString 9}) }&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;             &lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; win = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; Window(Title=&lt;/span&gt;&lt;span style="color:#800000;"&gt;"Test DataGrid"&lt;/span&gt;&lt;span style="color:#;"&gt;)&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; datagrid = DataGrid()&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;datagrid.HeadersVisibility &amp;lt;- DataGridHeadersVisibility.Column&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;datagrid.ItemsSource &amp;lt;- query() |&amp;gt; Seq.to_array&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#;"&gt;win.Content &amp;lt;- &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; ScrollViewer(Content=datagrid)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;win.Show()&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18281936-829930227715006263?l=jyliao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jyliao.blogspot.com/feeds/829930227715006263/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18281936&amp;postID=829930227715006263' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/829930227715006263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/829930227715006263'/><link rel='alternate' type='text/html' href='http://jyliao.blogspot.com/2009/06/exploring-wpf-toolkits-datagrid-with-f.html' title='Exploring WPF Toolkit&apos;s DataGrid with F#'/><author><name>John Liao</name><uri>http://www.blogger.com/profile/04740715435312568366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18281936.post-1066315858081315288</id><published>2009-04-15T19:29:00.001-07:00</published><updated>2009-04-15T19:29:55.081-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='f#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><title type='text'>Silverlight with F#: Handling Keyboard Input</title><content type='html'>&lt;p&gt;Recipe 3-15 of the book &lt;a href="http://www.amazon.com/gp/product/1590599772?ie=UTF8&amp;amp;tag=techie2biz-20&amp;amp;linkCode=xm2&amp;amp;camp=1789&amp;amp;creativeASIN=1590599772"&gt;Silverlight 2 Recipes&lt;/a&gt; illustrates handling keyboard input.&amp;#160; The code is suppose to allow you to move a spinning ball with the directional keys.&amp;#160; When I initially implement it, I ran into some issues in trying to capture keyboard input. As I understand keyboard events from reading Chapter 4 of the book &lt;a href="http://www.amazon.com/gp/product/1590599497?ie=UTF8&amp;amp;tag=techie2biz-20&amp;amp;linkCode=xm2&amp;amp;camp=1789&amp;amp;creativeASIN=1590599497"&gt;Pro Silverlight 2 in C# 2008&lt;/a&gt;, they are suppose to bubble up to the top level control.&amp;#160; However, when I attach code to the &lt;strong&gt;KeyUp&lt;/strong&gt; event to the &lt;strong&gt;Canvas&lt;/strong&gt; control, nothing happened.&amp;#160; I eventually realized that I did not know where is the input focus when I generate the keyboard event.&amp;#160; The only control that I am sure will receive the keyboard event is at the top level control.&amp;#160; In my scaffolding code for Silverlight, I had &lt;strong&gt;MyPage&lt;/strong&gt; added as a children of a &lt;strong&gt;StackPanel&lt;/strong&gt; that I called &lt;strong&gt;rootPanel&lt;/strong&gt;, so even my custom &lt;strong&gt;UserControl&lt;/strong&gt; was not getting the keyboard events.&amp;#160; For this particular example, I had to get rid of the &lt;strong&gt;rootPanel&lt;/strong&gt; and then I could capture the keyboard input from my custom &lt;strong&gt;UserControl&lt;/strong&gt;.&amp;#160; &lt;/p&gt;  &lt;p&gt;Just to verify that keyboard events do bubble up, I mocked up another small code where I embed a &lt;strong&gt;TextBox&lt;/strong&gt; deep inside a visual hierarchy.&amp;#160; When I set my focus to the &lt;strong&gt;TextBox&lt;/strong&gt; and press a key, all the containing controls were able to receive the keyboard events; thereby validating, for my benefit, the fact that keyboard events bubble up.&lt;/p&gt;  &lt;p&gt;The other thing to point out is in the last blog entry, I did not properly dispose the created StreamReader object. In this post, I change the let binding to StreamReader to use binding to resolve the problem.&lt;/p&gt;  &lt;p&gt;Here’s the working F# code along with the XAML code :&lt;/p&gt;  &lt;pre&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;#light&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt;&lt;span&gt; SilverLightFSharp&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Resources&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Reflection&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.IO&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Browser&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Controls&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Markup&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Input&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Media&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Media.Animation&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Shapes&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; List&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;&lt;span style="color: #008000"&gt;// Recipe 3-15 of the Silverlight 2 Recipes book&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;type&lt;/span&gt;&lt;span&gt; MyPage = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;inherit&lt;/span&gt;&lt;span&gt; UserControl&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; () &lt;/span&gt;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&lt;span&gt; this = {} &lt;/span&gt;&lt;span style="color: #0000ff"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; xamlControls = &lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; assembly = Assembly.GetExecutingAssembly();&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;use&lt;/span&gt;&lt;span&gt; sr = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; StreamReader(assembly.GetManifestResourceStream(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;page.xaml&amp;quot;&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            sr.ReadToEnd()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;// Load xaml dynamically        &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; canvas = XamlReader.Load(xamlControls) :?&amp;gt;  Canvas&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; clicktoplay = canvas.FindName(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;ClickToPlay&amp;quot;&lt;/span&gt;&lt;span&gt;) :?&amp;gt; Border&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; ball = canvas.FindName(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;RadioactiveBall&amp;quot;&lt;/span&gt;&lt;span&gt;) :?&amp;gt; Ellipse&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; welcomeMessage = canvas.FindName(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;WelcomeMessage&amp;quot;&lt;/span&gt;&lt;span&gt;) :?&amp;gt; Border&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; gameMessage = canvas.FindName(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;GameMessage&amp;quot;&lt;/span&gt;&lt;span&gt;) :?&amp;gt; TextBlock&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; storyboard = canvas.Resources.[&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;SpinGameBallStoryboard&amp;quot;&lt;/span&gt;&lt;span&gt;] :?&amp;gt; Storyboard&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;        this.Width &amp;lt;- 600.0&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        this.Height &amp;lt;- 400.0&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        this.Content &amp;lt;- canvas&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span&gt;       &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; moveSpeed = 10.0&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; getPosition (b:Ellipse) = &lt;/span&gt;&lt;br /&gt;&lt;span&gt;            ((b.GetValue(Canvas.LeftProperty) :?&amp;gt; double), (b.GetValue(Canvas.TopProperty) :?&amp;gt; double))&lt;/span&gt;&lt;br /&gt;&lt;span&gt;         &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; draw (x,y) =&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            (Canvas.LeftProperty,x) |&amp;gt; ball.SetValue&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            (Canvas.TopProperty,y) |&amp;gt; ball.SetValue&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        clicktoplay.MouseLeftButtonDown.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            clicktoplay.Visibility &amp;lt;- Visibility.Collapsed&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;//welcomeMessage.Visibility &amp;lt;- Visibility.Collapsed&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            gameMessage.Text &amp;lt;- &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;Left mouse button down!&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            ball.Visibility &amp;lt;- Visibility.Visible&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            this.IsEnabled &amp;lt;- &lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            storyboard.Begin())&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; leftborder = ball.Width * 0.25&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; rightborder = this.Width - ball.Width*1.25&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; topborder = ball.Height*0.25&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; bottomborder = this.Height - ball.Height*1.25&lt;/span&gt;&lt;br /&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; moveLeft (x,y) = &lt;/span&gt;&lt;br /&gt;&lt;span&gt;           (max [x-moveSpeed;leftborder],y)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;           &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; moveRight (x,y) = &lt;/span&gt;&lt;br /&gt;&lt;span&gt;            (min [x+moveSpeed;rightborder],y)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; moveUp (x,y) = &lt;/span&gt;&lt;br /&gt;&lt;span&gt;            (x,max [y-moveSpeed;topborder])&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; moveDown (x,y) = &lt;/span&gt;&lt;br /&gt;&lt;span&gt;            (x,min [y+moveSpeed;bottomborder])&lt;/span&gt;&lt;br /&gt;&lt;span&gt;               &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        this.KeyUp.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; pt = getPosition ball&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; newpos = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;match&lt;/span&gt;&lt;span&gt; (e.Key) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;with&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                         | Key.Right &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; moveRight pt&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                         | Key.Left &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;  moveLeft pt&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                         | Key.Up &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; moveUp pt&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                         | Key.Down &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; moveDown pt&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                         | _ &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; pt&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            gameMessage.Text &amp;lt;- sprintf &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;Ball at  %4.1f %4.1f &amp;quot;&lt;/span&gt;&lt;span&gt; (fst newpos)  (snd newpos)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            draw newpos&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            )&lt;/span&gt;&lt;br /&gt;&lt;span&gt;               &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;type&lt;/span&gt;&lt;span&gt; ErrorPage = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;inherit&lt;/span&gt;&lt;span&gt; UserControl&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; (msg:string ) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&lt;span&gt; this = {} &lt;/span&gt;&lt;span style="color: #0000ff"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; textarea = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; TextBlock(Text=msg,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                                     TextWrapping=TextWrapping.Wrap,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                                     Margin=&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Thickness(4.0,4.0,4.0,4.0))&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; sp = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; StackPanel(HorizontalAlignment = HorizontalAlignment.Stretch,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                                Margin=&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Thickness(8.0,8.0,10.0,8.0))&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        sp.Children.Add(textarea)                                &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;&lt;span&gt;.Width &amp;lt;- 600.0&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;&lt;span&gt;.Height &amp;lt;- 400.0&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;&lt;span&gt;.Content &amp;lt;- sp&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;end&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;type&lt;/span&gt;&lt;span&gt; MyApp = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;inherit&lt;/span&gt;&lt;span&gt; Application&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; () &lt;/span&gt;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&lt;span&gt; this = {} &lt;/span&gt;&lt;span style="color: #0000ff"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        this.Startup.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; _ &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;  this.RootVisual &amp;lt;- &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; MyPage())&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;end&lt;/span&gt;&lt;br /&gt;
&lt;hr /&gt;
&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Canvas&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;   &lt;/span&gt;&lt;span style="color: #ff0000"&gt; xmlns&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;   &lt;/span&gt;&lt;span style="color: #ff0000"&gt; xmlns&lt;/span&gt;&lt;span style="color: #0000ff"&gt;:&lt;/span&gt;&lt;span style="color: #ff0000"&gt;x&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;br /&gt;&lt;span&gt;       &lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;x&lt;/span&gt;&lt;span style="color: #0000ff"&gt;:&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;GameCanvas&amp;quot; &amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Canvas.Resources&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;RadialGradientBrush&lt;/span&gt;&lt;span style="color: #ff0000"&gt; x&lt;/span&gt;&lt;span style="color: #0000ff"&gt;:&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Key&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;IceBrush&amp;quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;GradientStop&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Color&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;#FFFFFFFF&amp;quot;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;GradientStop&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Color&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;#FF6F74AB&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Offset&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;1&amp;quot;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;RadialGradientBrush&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;LinearGradientBrush&lt;/span&gt;&lt;span style="color: #ff0000"&gt; x&lt;/span&gt;&lt;span style="color: #0000ff"&gt;:&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Key&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;MessageBorderBrush&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; EndPoint&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;0.501999974250793,1&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span style="color: #ff0000"&gt; StartPoint&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;0.497999995946884,0&amp;quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;GradientStop&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Color&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;#FF000000&amp;quot;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;GradientStop&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Color&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;#33FFFFFF&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Offset&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;1&amp;quot;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;LinearGradientBrush&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Storyboard&lt;/span&gt;&lt;span style="color: #ff0000"&gt; x&lt;/span&gt;&lt;span style="color: #0000ff"&gt;:&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;SpinGameBallStoryboard&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; x&lt;/span&gt;&lt;span style="color: #0000ff"&gt;:&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Key&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;SpinGameBallStoryboard&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; RepeatBehavior&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Forever&amp;quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;DoubleAnimationUsingKeyFrames&lt;/span&gt;&lt;span style="color: #ff0000"&gt; BeginTime&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;00:00:00&amp;quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #ff0000"&gt; Storyboard.TargetName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;RadioactiveBall&amp;quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #ff0000"&gt; Storyboard.TargetProperty&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)&amp;quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;SplineDoubleKeyFrame&lt;/span&gt;&lt;span style="color: #ff0000"&gt; KeyTime&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;00:00:00&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;0&amp;quot;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;SplineDoubleKeyFrame&lt;/span&gt;&lt;span style="color: #ff0000"&gt; KeyTime&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;00:00:02&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;360&amp;quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;SplineDoubleKeyFrame.KeySpline&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;                            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;KeySpline&lt;/span&gt;&lt;span style="color: #ff0000"&gt; ControlPoint1&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;0,0&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; ControlPoint2&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;1,1&amp;quot;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;SplineDoubleKeyFrame.KeySpline&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;SplineDoubleKeyFrame&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;DoubleAnimationUsingKeyFrames&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Storyboard&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Canvas.Resources&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Canvas.Background&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;RadialGradientBrush&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;GradientStop&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Color&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;#FFFFFFFF&amp;quot;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;GradientStop&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Color&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;#FFB3BBE8&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Offset&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;1&amp;quot;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;RadialGradientBrush&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Canvas.Background&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Border&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Background&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color: #a31515"&gt;StaticResource&lt;/span&gt;&lt;span style="color: #ff0000"&gt; MessageBorderBrush&lt;/span&gt;&lt;span style="color: #0000ff"&gt;}&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Height&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Auto&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;         &lt;/span&gt;&lt;span style="color: #ff0000"&gt; x&lt;/span&gt;&lt;span style="color: #0000ff"&gt;:&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;WelcomeMessage&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Width&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Auto&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Canvas.Left&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;173&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Canvas.Top&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;119&amp;quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;         &lt;/span&gt;&lt;span style="color: #ff0000"&gt; CornerRadius&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;10,10,10,10&amp;quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock&lt;/span&gt;&lt;span style="color: #ff0000"&gt; x&lt;/span&gt;&lt;span style="color: #0000ff"&gt;:&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;GameMessage&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Height&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Auto&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Width&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Auto&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; FontFamily&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Comic Sans MS&amp;quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;          &lt;/span&gt;&lt;span style="color: #ff0000"&gt; FontSize&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;24&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Welcome to &lt;/span&gt;&lt;span style="color: #0000ff"&gt;!&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; TextWrapping&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Wrap&amp;quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;          &lt;/span&gt;&lt;span style="color: #ff0000"&gt; Padding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;2,2,2,2&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Foreground&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;#FF044FB5&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Margin&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;2,2,2,2&amp;quot;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Border&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Border&lt;/span&gt;&lt;span style="color: #ff0000"&gt; x&lt;/span&gt;&lt;span style="color: #0000ff"&gt;:&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;ClickToPlay&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Height&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;77&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Width&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;169&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Canvas.Top&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;178&amp;quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;         &lt;/span&gt;&lt;span style="color: #ff0000"&gt; Canvas.Left&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;207&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; CornerRadius&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;10,10,10,10&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Background&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&lt;br /&gt;&lt;span&gt;         &lt;/span&gt;&lt;span style="color: #0000ff"&gt; &amp;quot;{&lt;/span&gt;&lt;span style="color: #a31515"&gt;StaticResource&lt;/span&gt;&lt;span style="color: #ff0000"&gt; MessageBorderBrush&lt;/span&gt;&lt;span style="color: #0000ff"&gt;}&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Margin&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;0,0,0,0&amp;quot; &amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Height&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Auto&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Width&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Auto&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; FontSize&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;24&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Click to Play&amp;quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;         &lt;/span&gt;&lt;span style="color: #ff0000"&gt; TextWrapping&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Wrap&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Margin&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;4,10,4,4&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Padding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;2,2,2,2&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Foreground&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;#FF044FB5&amp;quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;                      &lt;/span&gt;&lt;span style="color: #ff0000"&gt; HorizontalAlignment&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Stretch&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; VerticalAlignment&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Stretch&amp;quot; /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Border&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Ellipse&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Height&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;50&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Width&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;50&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Canvas.Left&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;259&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Canvas.Top&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;168.879&amp;quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;         &lt;/span&gt;&lt;span style="color: #ff0000"&gt; Stroke&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;#FF000000&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Visibility&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Collapsed&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; x&lt;/span&gt;&lt;span style="color: #0000ff"&gt;:&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;RadioactiveBall&amp;quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;         &lt;/span&gt;&lt;span style="color: #ff0000"&gt; RenderTransformOrigin&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;0.5,0.5&amp;quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Ellipse.RenderTransform&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TransformGroup&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ScaleTransform&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;SkewTransform&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;RotateTransform&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TranslateTransform&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;TransformGroup&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Ellipse.RenderTransform&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Ellipse.Fill&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;LinearGradientBrush&lt;/span&gt;&lt;span style="color: #ff0000"&gt; EndPoint&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;0.959999978542328,0.0219999998807907&amp;quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;             &lt;/span&gt;&lt;span style="color: #ff0000"&gt; StartPoint&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;0.0199999995529652,1.06200003623962&amp;quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;GradientStop&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Color&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;#FFAED4B2&amp;quot;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;GradientStop&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Color&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;#FFAED4B2&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Offset&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;1&amp;quot;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;GradientStop&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Color&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;#FF4A9B53&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Offset&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;0.179&amp;quot;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;GradientStop&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Color&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;#FF4A9B53&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Offset&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;0.75&amp;quot;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;GradientStop&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Color&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;#FF98BD9D&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Offset&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;0.4869999885559082&amp;quot;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;LinearGradientBrush&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Ellipse.Fill&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Ellipse&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Path&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Height&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;399&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Width&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;25&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Stretch&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Fill&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Stroke&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;#FF000000&amp;quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #ff0000"&gt; Data&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;M0,0 L24,10 L16,18 L21,29 L11,38 L21,54 L14,63 L19,84 L6,90 L15,103 L9,119 L15,136 L9,145 L18,155 L7,165 L23,178 L7,184 L19,200 L10,211 L17,221 L9,234 L17,240 L9,255 L15,264 L9,275 L17,286 L7,293 L17,304 L9,313 L19,329 L10,337 L15,345 L12,361 L13,371 L8,382 L12,389 L0,398 z&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Canvas.Top&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;-0.5&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Canvas.Left&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;-0.5&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Fill&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color: #a31515"&gt;StaticResource&lt;/span&gt;&lt;span style="color: #ff0000"&gt; IceBrush&lt;/span&gt;&lt;span style="color: #0000ff"&gt;}&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; x&lt;/span&gt;&lt;span style="color: #0000ff"&gt;:&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;LeftIceCaveWall&amp;quot;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Path&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Height&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;30&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Width&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;598&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Canvas.Left&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;0.5&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Canvas.Top&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;368.5&amp;quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #ff0000"&gt; Fill&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color: #a31515"&gt;StaticResource&lt;/span&gt;&lt;span style="color: #ff0000"&gt; IceBrush&lt;/span&gt;&lt;span style="color: #0000ff"&gt;}&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Stretch&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Fill&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Stroke&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;#FF000000&amp;quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #ff0000"&gt; Data&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;M1,397 L20,382 L30,387 L47,381 L63,388 L76,380 L90,385 L100,388 L110,376 L115,384 L127,378 L140,388 L155,381 L166,388 L179,378 L190,386 L206,375 L218,388 L230,372 L235,382 L249,376 L268,386 L284,375 L295,386 L309,374 L321,383 L334,369 L345,381 L357,382 L368,378 L378,391 L392,382 L412,388 L441,380 L456,390 L478,383 L494,389 L501,382 L515,390 L524,375 L534,386 L541,373 L553,369 L567,376 L576,381 L598,398 z&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; x&lt;/span&gt;&lt;span style="color: #0000ff"&gt;:&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;IceCaveWallFloor&amp;quot;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Path&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Height&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;398&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Width&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;40&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Canvas.Left&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;558.5&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Canvas.Top&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;-0.5&amp;quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #ff0000"&gt; Fill&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color: #a31515"&gt;StaticResource&lt;/span&gt;&lt;span style="color: #ff0000"&gt; IceBrush&lt;/span&gt;&lt;span style="color: #0000ff"&gt;}&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Stretch&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Fill&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Stroke&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;#FF000000&amp;quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #ff0000"&gt; Data&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;M598,397 L578,389 L572,367 L559,355 L570,339 L559,324 L574,313 L581,294 L576,281 L584,262 L584,243 L573,229 L586,217 L575,206 L584,192 L567,182 L587,161 L576,152 L583,139 L570,131 L578,124 L568,103 L581,76 L568,56 L577,49 L573,20 L584,12 L597,0 z&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; x&lt;/span&gt;&lt;span style="color: #0000ff"&gt;:&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;RightIceCaveWall&amp;quot;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Path&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Height&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;53&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Width&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;596&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Canvas.Left&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;0.5&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Canvas.Top&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;-0.5&amp;quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #ff0000"&gt; Fill&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color: #a31515"&gt;StaticResource&lt;/span&gt;&lt;span style="color: #ff0000"&gt; IceBrush&lt;/span&gt;&lt;span style="color: #0000ff"&gt;}&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Stretch&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Fill&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Stroke&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;#FF000000&amp;quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #ff0000"&gt; Data&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;M1,1 L21,19 L34,5 L43,13 L54,11 L65,8 L77,8 L86,11 L106,11 L115,8 L126,8 L138,12 L156,10 L171,8 L184,13 L197,7 L217,14 L231,8 L252,13 L259,8 L283,13 L295,8 L327,12 L336,18 L353,11 L365,30 L375,10 L393,16 L418,10 L437,15 L451,5 L468,17 L483,6 L501,18 L514,32 L526,19 L544,31 L556,26 L596,19 L596,0 z&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; x&lt;/span&gt;&lt;span style="color: #0000ff"&gt;:&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;IceCaveCeiling&amp;quot;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Canvas&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;
&lt;hr /&gt;&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18281936-1066315858081315288?l=jyliao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jyliao.blogspot.com/feeds/1066315858081315288/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18281936&amp;postID=1066315858081315288' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/1066315858081315288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/1066315858081315288'/><link rel='alternate' type='text/html' href='http://jyliao.blogspot.com/2009/04/silverlight-with-f-handling-keyboard.html' title='Silverlight with F#: Handling Keyboard Input'/><author><name>John Liao</name><uri>http://www.blogger.com/profile/04740715435312568366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18281936.post-8524502582199606810</id><published>2009-04-09T18:19:00.001-07:00</published><updated>2009-04-09T21:17:16.355-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='f#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><title type='text'>Silverlight with F#: Managing embedded resources</title><content type='html'>&lt;p&gt;One of my blog reader asked why I inline XAML instead of putting it into a separate file and hooking up the variables manually in F#.&amp;#160; My answer was laziness: I did not spend the time to figure out how. (If you subscribe to Larry Wall’s philosophy, laziness is a virtue …)&amp;#160; Well, that question prompted me to look into how to externalize the xaml file and load it in.&amp;#160; This dovetailed nicely with recipe 2.14 of the book &lt;a href="http://www.amazon.com/gp/product/1590599772?ie=UTF8&amp;amp;tag=techie2biz-20&amp;amp;linkCode=xm2&amp;amp;camp=1789&amp;amp;creativeASIN=1590599772"&gt;Silverlight 2 Recipes&lt;/a&gt;, which shows how to load embedded resources.&amp;#160; I put the xaml code in a separate file called page.xaml and added the following compiler flag:&lt;/p&gt;  &lt;pre&gt; --resource page.xaml&lt;/pre&gt;

&lt;p&gt;Here’s the xaml file:&lt;/p&gt;

&lt;pre&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Canvas&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #ff0000"&gt; xmlns&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #ff0000"&gt; xmlns&lt;/span&gt;&lt;span style="color: #0000ff"&gt;:&lt;/span&gt;&lt;span style="color: #ff0000"&gt;x&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span&gt;   &lt;/span&gt;&lt;span style="color: #ff0000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;x&lt;/span&gt;&lt;span style="color: #0000ff"&gt;:&lt;/span&gt;&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;LayoutRoot&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Background&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;White&amp;quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Hi There Reader&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Canvas.Left&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;20&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Canvas.Top&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;20&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Hi There&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Canvas.Left&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;40&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #ff0000"&gt; Canvas.Top&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;40&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Silverlight&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Canvas.Left&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;60&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Canvas.Top&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;60&amp;quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;     Silverlight&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Canvas.Left&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;80&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Canvas.Top&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;80&amp;quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;     Silverlight&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Canvas.Left&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;100&amp;quot;&lt;/span&gt;&lt;span style="color: #ff0000"&gt; Canvas.Top&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;100&amp;quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #a31515"&gt;     Silverlight&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBlock&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Canvas&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;br /&gt;

&lt;p&gt;Here's the code that loads the xaml file and hook the control with a variable:&lt;/p&gt;

&lt;pre&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;#light&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt;&lt;span&gt; SilverLightFSharp&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Resources&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Reflection&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.IO&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Browser&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Controls&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Markup&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; List&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;// Recipe 2-14 and XAML from Recipe 3-3 of the Silverlight 2 Recipes book&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;type&lt;/span&gt;&lt;span&gt; MyPage() = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;inherit&lt;/span&gt;&lt;span&gt; UserControl()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;do&lt;/span&gt;&lt;br /&gt;&lt;span&gt;       &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; assembly = Assembly.GetExecutingAssembly();&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; sr = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; StreamReader(assembly.GetManifestResourceStream(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;page.xaml&amp;quot;&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; xamlControls = sr.ReadToEnd()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;// Load xaml dynamically        &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; canvas = XamlReader.Load(xamlControls) :?&amp;gt; Canvas&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;       &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;&lt;span&gt;.Width &amp;lt;- 400.0&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;&lt;span&gt;.Height &amp;lt;- 300.0&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;&lt;span&gt;.Content &amp;lt;- canvas&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;type&lt;/span&gt;&lt;span&gt; ErrorPage = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;inherit&lt;/span&gt;&lt;span&gt; UserControl&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; (msg:string ) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&lt;span&gt; this = {} &lt;/span&gt;&lt;span style="color: #0000ff"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; textarea = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; TextBlock(Text=msg,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                                     TextWrapping=TextWrapping.Wrap,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                                     Margin=&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Thickness(4.0,4.0,4.0,4.0))&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; sp = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; StackPanel(HorizontalAlignment = HorizontalAlignment.Stretch,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                                Margin=&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Thickness(8.0,8.0,10.0,8.0))&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        sp.Children.Add(textarea)                                &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;&lt;span&gt;.Width &amp;lt;- 600.0&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;&lt;span&gt;.Height &amp;lt;- 1000.0&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;&lt;span&gt;.Content &amp;lt;- sp&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;end&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;type&lt;/span&gt;&lt;span&gt; MyApp = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;inherit&lt;/span&gt;&lt;span&gt; Application&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; () &lt;/span&gt;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&lt;span&gt; this = {} &lt;/span&gt;&lt;span style="color: #0000ff"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        this.Startup.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; _ &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; rootPanel = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; StackPanel()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;                this.RootVisual &amp;lt;- rootPanel&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                rootPanel.Children.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; MyPage())&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;with&lt;/span&gt;&lt;span&gt; _ &lt;/span&gt;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&lt;span&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;               &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; msg = e.Message + e.StackTrace&lt;/span&gt;&lt;br /&gt;&lt;span&gt;               rootPanel.Children.Clear()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;               rootPanel.Children.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; ErrorPage(msg)))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;        this.UnhandledException.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; args &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;           args.Handled &amp;lt;- &lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;br /&gt;&lt;span&gt;           &lt;/span&gt;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;br /&gt;&lt;span&gt;               &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; msg = args.ExceptionObject.Message + args.ExceptionObject.StackTrace&lt;/span&gt;&lt;br /&gt;&lt;span&gt;               &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; errmsg = msg.Replace(&lt;/span&gt;&lt;span style="color: #800000"&gt;'&amp;quot;'&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style="color: #800000"&gt;'\''&lt;/span&gt;&lt;span&gt;).Replace(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;\r\n&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style="color: #800000"&gt;@&amp;quot;\n&amp;quot;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;br /&gt;&lt;span&gt;               &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;throw new Error(\&amp;quot;Unhandled error in Silverlight 2 Application &amp;quot;&lt;/span&gt;&lt;span&gt; + msg + &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;\&amp;quot;);&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;               |&amp;gt; HtmlPage.Window.Eval |&amp;gt; ignore&lt;/span&gt;&lt;br /&gt;&lt;span&gt;           &lt;/span&gt;&lt;span style="color: #0000ff"&gt;with&lt;/span&gt;&lt;span&gt; _  &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; HtmlPage.Window.Eval(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;throw new Error(\&amp;quot;Custom Error!\&amp;quot;);&amp;quot;&lt;/span&gt;&lt;span&gt;) |&amp;gt; ignore)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;end&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18281936-8524502582199606810?l=jyliao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jyliao.blogspot.com/feeds/8524502582199606810/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18281936&amp;postID=8524502582199606810' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/8524502582199606810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/8524502582199606810'/><link rel='alternate' type='text/html' href='http://jyliao.blogspot.com/2009/04/silverlight-with-f-managing-embedded.html' title='Silverlight with F#: Managing embedded resources'/><author><name>John Liao</name><uri>http://www.blogger.com/profile/04740715435312568366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18281936.post-3756248069074694871</id><published>2009-04-01T19:08:00.001-07:00</published><updated>2009-04-01T19:08:28.378-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='f#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><title type='text'>Silverlight with F#: Animation via XAML (revisited)</title><content type='html'>&lt;p&gt;I should have took the time to read Matthew MacDonald’s book &lt;a href="http://www.amazon.com/gp/product/1590599497?ie=UTF8&amp;amp;tag=techie2biz-20&amp;amp;linkCode=xm2&amp;amp;camp=1789&amp;amp;creativeASIN=1590599497"&gt;Pro Silverlight 2 in C# 2008&lt;/a&gt; before I started tackling recipe 2.11 in the book &lt;a href="http://www.amazon.com/gp/product/1590599772?ie=UTF8&amp;amp;tag=techie2biz-20&amp;amp;linkCode=xm2&amp;amp;camp=1789&amp;amp;creativeASIN=1590599772"&gt;Silverlight 2 Recipes&lt;/a&gt;.&amp;#160; The code I created in the last blog post was made more complex due to my poor workaround to extracting the Storyboard object from XAML.&amp;#160; After reading chapter 2 of the book &lt;a href="http://www.amazon.com/gp/product/1590599497?ie=UTF8&amp;amp;tag=techie2biz-20&amp;amp;linkCode=xm2&amp;amp;camp=1789&amp;amp;creativeASIN=1590599497"&gt;Pro Silverlight 2 in C# 2008&lt;/a&gt;, it was obvious that in order to extract the Storyboard object from XAML, all I had to do was add the Key attribute to the Storyboard markup and add the Storyboard markup to the Grid.Resources property.&amp;#160; &lt;/p&gt;  &lt;p&gt;In addition, I’m reading through Chapter 13 of Don Syme’s book &lt;a href="http://www.amazon.com/gp/product/1590598504?tag=techie2biz-20"&gt;Expert F#&lt;/a&gt; trying to understand more how concurrency works with F#.&amp;#160; I decided to try to replicate the Iterative Worker example in the book, replacing the simple BackgroundWorker example in recipe 2.11.&lt;/p&gt;  &lt;p&gt;Here is the revised code with Storyboard as part of the resources of the Grid object and the reworked background worker code.&lt;/p&gt;  &lt;pre&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;#light&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt;&lt;span&gt; SilverLightFSharp&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.ComponentModel&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.ServiceModel&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Browser&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Controls&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Markup&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Media&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Media.Animation&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Shapes&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; List&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;// SimulateBackgroundWorker modelled after&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;// IterativeBackgroundW&lt;/span&gt;&lt;span style="color: #008000"&gt;orker example from Chapter 13 of Expert F#&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;type&lt;/span&gt;&lt;span&gt; SimulateBackgroundWorker&amp;lt;'a&amp;gt;(delay:int, numIterations:int) =&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; worker = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; BackgroundWorker(WorkerReportsProgress=&lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                                      WorkerSupportsCancellation=&lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; triggerCompleted,completed = Event.create()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; triggerError    ,error     = Event.create()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; triggerCancelled,cancelled = Event.create()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; triggerProgress ,progress  = Event.create()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;   &lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;do&lt;/span&gt;&lt;span&gt; worker.DoWork.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; args &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;rec&lt;/span&gt;&lt;span&gt; iterate i =&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span&gt; worker.CancellationPending &lt;/span&gt;&lt;span style="color: #0000ff"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                args.Cancel &amp;lt;- &lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;elif&lt;/span&gt;&lt;span&gt; i &amp;lt; numIterations &lt;/span&gt;&lt;span style="color: #0000ff"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                System.Threading.Thread.Sleep(delay)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                &lt;/span&gt;&lt;br /&gt;&lt;span&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;// Report the percentage computation&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; percent = int((float (i+1)/float numIterations) * 100.0)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;do&lt;/span&gt;&lt;span&gt; worker.ReportProgress(percent)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                iterate (i+1)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span&gt; ()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        iterate 0)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;do&lt;/span&gt;&lt;span&gt; worker.RunWorkerCompleted.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; args &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span&gt;   args.Cancelled    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;then&lt;/span&gt;&lt;span&gt; triggerCancelled()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;elif&lt;/span&gt;&lt;span&gt; args.Error&amp;lt;&amp;gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;then&lt;/span&gt;&lt;span&gt; triggerError args.Error      &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span&gt; triggerCompleted())&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;do&lt;/span&gt;&lt;span&gt; worker.ProgressChanged.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; args &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        triggerProgress(args.ProgressPercentage))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;member&lt;/span&gt;&lt;span&gt; x.WorkerCompleted = completed             &lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;member&lt;/span&gt;&lt;span&gt; x.WorkerCancelled = cancelled&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;member&lt;/span&gt;&lt;span&gt; x.WorkerError     = error&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;member&lt;/span&gt;&lt;span&gt; x.ProgressChanged = progress&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;// Delegate the remaining memebers to the underlying worker&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;member&lt;/span&gt;&lt;span&gt; x.RunWorkerAsync() = worker.RunWorkerAsync()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;member&lt;/span&gt;&lt;span&gt; x.CancelAsync()    = worker.CancelAsync()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;member&lt;/span&gt;&lt;span&gt; x.IsBusy = worker.IsBusy&lt;/span&gt;&lt;br /&gt;&lt;span&gt;              &lt;/span&gt;&lt;br /&gt;&lt;span&gt;              &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;// Recipe 2-11 from Silverlight 2 Recipes book&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;// Using XAML to configure the animation&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;type&lt;/span&gt;&lt;span&gt; MyPage() = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;inherit&lt;/span&gt;&lt;span&gt; UserControl()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;do&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;// added x:Key='AnimateStatusEllipse' to Storyboard&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; xamlControls = &lt;/span&gt;&lt;br /&gt;&lt;span&gt;         &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&amp;lt;Grid &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;              xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;              xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;          x:Name='LayoutRoot' Background='#FFFFFFFF'&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;          &amp;lt;Grid.Resources&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;            &amp;lt;Storyboard x:Name='AnimateStatusEllipse' x:Key='AnimateStatusEllipse'&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;              &amp;lt;ColorAnimationUsingKeyFrames BeginTime='00:00:00' Storyboard.TargetName='StatusEllipse' &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                   Storyboard.TargetProperty='(Shape.Fill).(SolidColorBrush.Color)'&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineColorKeyFrame KeyTime='00:00:00' Value='#FF008000'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineColorKeyFrame KeyTime='00:00:01.5000000' Value='#FFFFFF00'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineColorKeyFrame KeyTime='00:00:03' Value='#FF008000'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineColorKeyFrame KeyTime='00:00:04.5000000' Value='#FF008000'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineColorKeyFrame KeyTime='00:00:06' Value='#FFFFFF00'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineColorKeyFrame KeyTime='00:00:07.5000000' Value='#FF008000'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;              &amp;lt;/ColorAnimationUsingKeyFrames&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;              &amp;lt;DoubleAnimationUsingKeyFrames BeginTime='00:00:00' Storyboard.TargetName='StatusEllipse' &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                Storyboard.TargetProperty='(UIElement.Opacity)'&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:00' Value='0.7'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:01.5000000' Value='0.5'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:03' Value='0.5'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:04.5000000' Value='0.7'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:06' Value='0.5'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:07.5000000' Value='0.5'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;              &amp;lt;/DoubleAnimationUsingKeyFrames&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;              &amp;lt;DoubleAnimationUsingKeyFrames BeginTime='00:00:00' Storyboard.TargetName='StatusEllipse' &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                   Storyboard.TargetProperty='(UIElement.RenderTransform).(TransformGroup.Children)[1].(SkewTransform.AngleX)'&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:00' Value='0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:01.5000000' Value='0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:03' Value='0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:04.5000000' Value='0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:06' Value='0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:07.5000000' Value='0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;              &amp;lt;/DoubleAnimationUsingKeyFrames&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;              &amp;lt;DoubleAnimationUsingKeyFrames BeginTime='00:00:00' Storyboard.TargetName='StatusEllipse' &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                   Storyboard.TargetProperty='(UIElement.RenderTransform).(TransformGroup.Children)[1].(SkewTransform.AngleY)'&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:00' Value='0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:01.5000000' Value='0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:03' Value='0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:04.5000000' Value='0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:06' Value='0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:07.5000000' Value='0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;              &amp;lt;/DoubleAnimationUsingKeyFrames&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;            &amp;lt;/Storyboard&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;          &amp;lt;/Grid.Resources&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;            &amp;lt;Grid.ColumnDefinitions&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;              &amp;lt;ColumnDefinition Width='0.068*'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;              &amp;lt;ColumnDefinition Width='0.438*'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;              &amp;lt;ColumnDefinition Width='0.495*'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;            &amp;lt;/Grid.ColumnDefinitions&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;            &amp;lt;Grid.RowDefinitions&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;              &amp;lt;RowDefinition Height='0.08*'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;              &amp;lt;RowDefinition Height='0.217*'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;              &amp;lt;RowDefinition Height='0.61*'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;              &amp;lt;RowDefinition Height='0.093*'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;            &amp;lt;/Grid.RowDefinitions&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;            &amp;lt;Button HorizontalAlignment='Stretch' Margin='5,8,5,8' VerticalAlignment='Stretch' &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                Grid.Column='1' Grid.Row='1' Content='Save Form Data'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;            &amp;lt;StackPanel HorizontalAlignment='Stretch' Margin='4.8270001411438,8,6.19799995422363,8' &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                Grid.Column='1' Grid.Row='2'&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;              &amp;lt;TextBlock Height='Auto' Width='Auto' Text='Work Results Appear Below' TextWrapping='Wrap' Margin='4,4,4,4'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;              &amp;lt;TextBox Height='103' Width='Auto' Text='' TextWrapping='Wrap' Margin='4,4,4,4' x:Name='WorkResultsTextData'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;            &amp;lt;/StackPanel&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;            &amp;lt;Button HorizontalAlignment='Stretch' Margin='12,8,8,8' VerticalAlignment='Stretch' Grid.Column='2' Grid.Row='1' Content='Load Form Data'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;            &amp;lt;Button HorizontalAlignment='Stretch' Margin='10,2,8,6' VerticalAlignment='Stretch' Grid.Column='1' Grid.Row='3' Content='Kick Off Work' x:Name='DoWorkButton'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;            &amp;lt;Border Grid.Column='2' Grid.Row='2' Grid.RowSpan='2' CornerRadius='10,10,10,10' Margin='1.80200004577637,2,2,2'&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;              &amp;lt;Border.Background&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;LinearGradientBrush EndPoint='0.560000002384186,0.00300000002607703' StartPoint='0.439999997615814,0.996999979019165'&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                  &amp;lt;GradientStop Color='#FF586C57'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                  &amp;lt;GradientStop Color='#FFA3BDA3' Offset='0.536'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                  &amp;lt;GradientStop Color='#FF586C57' Offset='0.968999981880188'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;/LinearGradientBrush&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;              &amp;lt;/Border.Background&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;              &amp;lt;StackPanel Margin='4,4,4,4'  x:Name='FormData'&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;TextBlock Height='Auto' Width='Auto' Text='First Name:' TextWrapping='Wrap' Margin='2,2,2,0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;TextBox Height='Auto' Width='Auto' Text='' TextWrapping='Wrap' x:Name='Field1' Margin='2,0,2,4'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;TextBlock Height='Auto' Width='Auto' Text='Last Name:' TextWrapping='Wrap' Margin='2,4,2,0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;TextBox Height='Auto' x:Name='Field2' Width='Auto' Text='' TextWrapping='Wrap' Margin='2,0,2,4'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;TextBlock Height='Auto' Width='Auto' Text='Company:' TextWrapping='Wrap' Margin='2,4,2,0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;TextBox Height='Auto' x:Name='Field3' Width='Auto' Text='' TextWrapping='Wrap' Margin='2,0,2,2'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;TextBlock Height='22.537' Width='182' Text='Title:' TextWrapping='Wrap' Margin='2,4,2,0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;TextBox Height='20.772' x:Name='Field4' Width='182' Text='' TextWrapping='Wrap' Margin='2,0,2,2'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;              &amp;lt;/StackPanel&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;            &amp;lt;/Border&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;            &amp;lt;Ellipse x:Name='StatusEllipse' Margin='4,2,2,2' Grid.Row='3' Stroke='#FF000000' Fill='#FF2D4DE0' RenderTransformOrigin='0.5,0.5' &amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;              &amp;lt;Ellipse.RenderTransform&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;TransformGroup&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                  &amp;lt;ScaleTransform/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                  &amp;lt;SkewTransform/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                  &amp;lt;RotateTransform/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                  &amp;lt;TranslateTransform/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;/TransformGroup&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;              &amp;lt;/Ellipse.RenderTransform&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;              &amp;lt;ToolTipService.ToolTip&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;ToolTip Content='Click button to start work.' /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;              &amp;lt;/ToolTipService.ToolTip&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;            &amp;lt;/Ellipse&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;            &amp;lt;Canvas HorizontalAlignment='Stretch' Margin='0,0,2,8' Grid.RowSpan='4' Grid.ColumnSpan='3' x:Name='PromptCancelCanvas' Visibility='Collapsed'&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;              &amp;lt;Rectangle Height='300' Width='400' Fill='#FF808080' Stroke='#FF000000' Stretch='Fill' Opacity='0.6'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;              &amp;lt;Canvas Height='106' Width='289' Canvas.Left='46' Canvas.Top='85'&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;Rectangle Height='106' Width='289' Fill='#FFFFFFFF' Stroke='#FF000000' RadiusX='23' RadiusY='23' Opacity='0.85'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;Button Height='34' x:Name='ButtonConfirmCancelYes' Width='100' Canvas.Left='15' Canvas.Top='49' Content='Yes'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;Button Height='34' x:Name='ButtonConfirmCancelNo' Width='100' Canvas.Left='164' Canvas.Top='49' Content='No'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;TextBlock Width='134.835' Canvas.Left='75' Canvas.Top='12.463' Text='Cancel Operation?' TextWrapping='Wrap'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;              &amp;lt;/Canvas&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;            &amp;lt;/Canvas&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;            &amp;lt;TextBlock Margin='67.8270034790039,0,-88.802001953125,0' Grid.Column='1' Grid.ColumnSpan='1' Text='BackgroundWorker Thread' TextWrapping='Wrap'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;          &amp;lt;/Grid&amp;gt;&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;// Load xaml dynamically        &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; grid = XamlReader.Load(xamlControls) :?&amp;gt; Grid&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;// Find the controls...&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; statusEllipse = grid.FindName(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;StatusEllipse&amp;quot;&lt;/span&gt;&lt;span&gt;) :?&amp;gt; Ellipse &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; textarea = grid.FindName(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;WorkResultsTextData&amp;quot;&lt;/span&gt;&lt;span&gt;) :?&amp;gt; TextBox &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; doWorkButton = grid.FindName(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;DoWorkButton&amp;quot;&lt;/span&gt;&lt;span&gt;) :?&amp;gt; Button &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; cancelNoButton = grid.FindName(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;ButtonConfirmCancelNo&amp;quot;&lt;/span&gt;&lt;span&gt;) :?&amp;gt; Button         &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; cancelYesButton = grid.FindName(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;ButtonConfirmCancelYes&amp;quot;&lt;/span&gt;&lt;span&gt;) :?&amp;gt; Button &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; cancelCanvas = grid.FindName(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;PromptCancelCanvas&amp;quot;&lt;/span&gt;&lt;span&gt;) :?&amp;gt; Canvas &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;// Grab storyboard from grid resources with the extra key specified..        &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; storyboard = grid.Resources.[&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;AnimateStatusEllipse&amp;quot;&lt;/span&gt;&lt;span&gt;] :?&amp;gt; Storyboard&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;// Remove code to add storyboard children objects...&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;// SimulateBackgroundWorker modelled after Don Syme's Iterative Background worker &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; worker = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; SimulateBackgroundWorker&amp;lt;_&amp;gt;(1000,30)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;        doWorkButton.Click.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            worker.RunWorkerAsync()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            textarea.Text &amp;lt;- sprintf &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;(2) Started : %s&amp;quot;&lt;/span&gt;&lt;span&gt;  (DateTime.Now.ToString())&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            storyboard.AutoReverse &amp;lt;- &lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            storyboard.RepeatBehavior &amp;lt;- RepeatBehavior.Forever&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            storyboard.Begin())&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;        cancelYesButton.Click.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            worker.CancelAsync()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            cancelCanvas.Visibility &amp;lt;- Visibility.Collapsed)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        cancelNoButton.Click.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            cancelCanvas.Visibility &amp;lt;- Visibility.Collapsed)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;        statusEllipse.MouseLeftButtonDown.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span&gt; worker.IsBusy = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                cancelCanvas.Visibility &amp;lt;- Visibility.Visible)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        worker.WorkerCompleted.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; () &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                statusEllipse.Fill &amp;lt;- &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; SolidColorBrush(Color.FromArgb(255uy,0uy,255uy,0uy))&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; msg = sprintf &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;\nCompleted : %s&amp;quot;&lt;/span&gt;&lt;span&gt; (DateTime.Now.ToString())&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                textarea.Text &amp;lt;- textarea.Text + msg&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                ToolTipService.SetToolTip(statusEllipse, &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;Work Complete.&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;           )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;        worker.ProgressChanged.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; (progressPercentage) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span&gt; cancelCanvas.Visibility = Visibility.Collapsed &lt;/span&gt;&lt;span style="color: #0000ff"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; msg = sprintf &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;%i Percent Complete.  Click to cancel...&amp;quot;&lt;/span&gt;&lt;span&gt; progressPercentage&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                ToolTipService.SetToolTip(statusEllipse, msg))&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        worker.WorkerCancelled.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; () &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                statusEllipse.Fill &amp;lt;- &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; SolidColorBrush(Color.FromArgb(255uy,255uy,255uy,0uy))&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; msg = sprintf &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;%s \nCanceled@: %s&amp;quot;&lt;/span&gt;&lt;span&gt; textarea.Text &amp;lt;| DateTime.Now.ToString()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                textarea.Text &amp;lt;- msg&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                ToolTipService.SetToolTip(statusEllipse, msg))&lt;/span&gt;&lt;br /&gt;&lt;span&gt;       &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;&lt;span&gt;.Width &amp;lt;- 400.0&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;&lt;span&gt;.Height &amp;lt;- 300.0&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;&lt;span&gt;.Content &amp;lt;- grid&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;type&lt;/span&gt;&lt;span&gt; ErrorPage = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;inherit&lt;/span&gt;&lt;span&gt; UserControl&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; (msg:string ) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&lt;span&gt; this = {} &lt;/span&gt;&lt;span style="color: #0000ff"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; textarea = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; TextBlock(Text=msg,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                                     TextWrapping=TextWrapping.Wrap,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                                     Margin=&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Thickness(4.0,4.0,4.0,4.0))&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; sp = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; StackPanel(HorizontalAlignment = HorizontalAlignment.Stretch,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                                Margin=&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Thickness(8.0,8.0,10.0,8.0))&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        sp.Children.Add(textarea)                                &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;&lt;span&gt;.Width &amp;lt;- 600.0&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;&lt;span&gt;.Height &amp;lt;- 1000.0&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;&lt;span&gt;.Content &amp;lt;- sp&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;end&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;type&lt;/span&gt;&lt;span&gt; MyApp = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;inherit&lt;/span&gt;&lt;span&gt; Application&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; () &lt;/span&gt;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&lt;span&gt; this = {} &lt;/span&gt;&lt;span style="color: #0000ff"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        this.Startup.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; _ &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; rootPanel = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; StackPanel()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;                this.RootVisual &amp;lt;- rootPanel&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                rootPanel.Children.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; MyPage())&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;with&lt;/span&gt;&lt;span&gt; _ &lt;/span&gt;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&lt;span&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;               &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; msg = e.Message + e.StackTrace&lt;/span&gt;&lt;br /&gt;&lt;span&gt;               rootPanel.Children.Clear()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;               rootPanel.Children.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; ErrorPage(msg)))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;        this.UnhandledException.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; args &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;           args.Handled &amp;lt;- &lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;br /&gt;&lt;span&gt;           &lt;/span&gt;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;br /&gt;&lt;span&gt;               &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; msg = args.ExceptionObject.Message + args.ExceptionObject.StackTrace&lt;/span&gt;&lt;br /&gt;&lt;span&gt;               &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; errmsg = msg.Replace(&lt;/span&gt;&lt;span style="color: #800000"&gt;'&amp;quot;'&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style="color: #800000"&gt;'\''&lt;/span&gt;&lt;span&gt;).Replace(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;\r\n&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style="color: #800000"&gt;@&amp;quot;\n&amp;quot;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;br /&gt;&lt;span&gt;               &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;throw new Error(\&amp;quot;Unhandled error in Silverlight 2 Application &amp;quot;&lt;/span&gt;&lt;span&gt; + msg + &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;\&amp;quot;);&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;               |&amp;gt; HtmlPage.Window.Eval |&amp;gt; ignore&lt;/span&gt;&lt;br /&gt;&lt;span&gt;           &lt;/span&gt;&lt;span style="color: #0000ff"&gt;with&lt;/span&gt;&lt;span&gt; _  &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; HtmlPage.Window.Eval(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;throw new Error(\&amp;quot;Custom Error!\&amp;quot;);&amp;quot;&lt;/span&gt;&lt;span&gt;) |&amp;gt; ignore)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;end&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18281936-3756248069074694871?l=jyliao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jyliao.blogspot.com/feeds/3756248069074694871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18281936&amp;postID=3756248069074694871' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/3756248069074694871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/3756248069074694871'/><link rel='alternate' type='text/html' href='http://jyliao.blogspot.com/2009/04/silverlight-with-f-animation-via-xaml.html' title='Silverlight with F#: Animation via XAML (revisited)'/><author><name>John Liao</name><uri>http://www.blogger.com/profile/04740715435312568366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18281936.post-5767256698351879135</id><published>2009-03-22T17:46:00.001-07:00</published><updated>2009-03-22T17:46:50.937-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Presentation Foundation'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='f#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><title type='text'>Silverlight with F#: Animation via XAML</title><content type='html'>&lt;p&gt;In my &lt;a href="http://jyliao.blogspot.com/2009/03/silverlight-with-f-background-thread.html"&gt;previous blog&lt;/a&gt;, I was unable to fully implement recipe 2.11 of the book &lt;a href="http://www.amazon.com/gp/product/1590599772?ie=UTF8&amp;amp;tag=techie2biz-20&amp;amp;linkCode=xm2&amp;amp;camp=1789&amp;amp;creativeASIN=1590599772"&gt;Silverlight 2 Recipes&lt;/a&gt; with F# code due to problems with getting PropertyPath to work as shown in various Silverlight books.&amp;#160; Just to make sure that this is not just a Silverlight issue, I tried the code with WPF and still had the same problem.&amp;#160; I decided to approach this differently and implement the animation in XAML instead and got it to work.&amp;#160; Here’s the code:&lt;/p&gt;  &lt;pre&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;#light&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt;&lt;span&gt; SilverLightFSharp&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.ComponentModel&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.IO&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.IO.IsolatedStorage&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.ServiceModel&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Browser&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Controls&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Markup&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Media&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Media.Animation&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Shapes&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; List&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;// Recipe 2-11 from Silverlight 2 Recipes book&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;// Using XAML to configure the animation&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;type&lt;/span&gt;&lt;span&gt; MyPage() = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;inherit&lt;/span&gt;&lt;span&gt; UserControl()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;do&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; xamlControls = &lt;/span&gt;&lt;br /&gt;&lt;span&gt;                &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&amp;lt;Grid xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                       xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                       xmlns:d='http://schemas.microsoft.com/expression/blend/2008' &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                       xmlns:mc='http://schemas.openxmlformats.org/markup-compatibility/2006' &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                       mc:Ignorable='d'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                       &amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;Grid.ColumnDefinitions&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;ColumnDefinition Width='0.068*'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;ColumnDefinition Width='0.438*'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;ColumnDefinition Width='0.495*'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;/Grid.ColumnDefinitions&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;Grid.RowDefinitions&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;RowDefinition Height='0.08*'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;RowDefinition Height='0.217*'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;RowDefinition Height='0.61*'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;RowDefinition Height='0.093*'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;/Grid.RowDefinitions&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;Button HorizontalAlignment='Stretch' Margin='5,8,5,8'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                     VerticalAlignment='Stretch' Grid.Column='1' Grid.Row='1'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      Content='Save Form Data'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;StackPanel HorizontalAlignment='Stretch'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      Margin='5,8,6,8' Grid.Column='1' Grid.Row='2'&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;TextBlock Height='Auto' Width='Auto' Text='Work Results Appear Below'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      TextWrapping='Wrap' Margin='4,4,4,4'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;TextBox Height='103' Width='Auto' Text='' TextWrapping='Wrap'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      Margin='4,4,4,4' x:Name='WorkResultsTextData'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;/StackPanel&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;Button HorizontalAlignment='Stretch' Margin='12,8,8,8'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      VerticalAlignment='Stretch'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                     Grid.Column='2' Grid.Row='1' Content='Load Form Data' /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;Button HorizontalAlignment='Stretch' Margin='10,2,8,6'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      VerticalAlignment='Stretch'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                       Grid.Column='1' Grid.Row='3' Content='Kick Off Work' x:Name='DoWorkButton'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;Border Grid.Column='2' Grid.Row='2' Grid.RowSpan='2' CornerRadius='10,10,10,10'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                       Margin='1.80200004577637,2,2,2'&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;Border.Background&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        &amp;lt;LinearGradientBrush EndPoint='0.560000002384186,0.00300000002607703'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                           StartPoint='0.439999997615814,0.996999979019165'&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                          &amp;lt;GradientStop Color='#FF586C57'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                          &amp;lt;GradientStop Color='#FFA3BDA3' Offset='0.536'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                          &amp;lt;GradientStop Color='#FF586C57' Offset='0.968999981880188'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        &amp;lt;/LinearGradientBrush&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;/Border.Background&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;StackPanel Margin='4,4,4,4' x:Name='FormData'&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        &amp;lt;TextBlock Height='Auto' Width='Auto' Text='First Name:' TextWrapping='Wrap'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        Margin='2,2,2,0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        &amp;lt;TextBox Height='Auto' Width='Auto' Text='' TextWrapping='Wrap' &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                          x:Name='Field1' Margin='2,0,2,4'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        &amp;lt;TextBlock Height='Auto' Width='Auto' Text='Last Name:'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                           TextWrapping='Wrap' Margin='2,4,2,0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        &amp;lt;TextBox Height='Auto' x:Name='Field2' Width='Auto' Text=''&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                          TextWrapping='Wrap' Margin='2,0,2,4'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        &amp;lt;TextBlock Height='Auto' Width='Auto' Text='Company:'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                          TextWrapping='Wrap' Margin='2,4,2,0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        &amp;lt;TextBox Height='Auto' x:Name='Field3' Width='Auto' Text=''&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                          TextWrapping='Wrap' Margin='2,0,2,2'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        &amp;lt;TextBlock Height='22.537' Width='182' Text='Title:'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                          TextWrapping='Wrap' Margin='2,4,2,0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        &amp;lt;TextBox Height='20.772' x:Name='Field4' Width='182' Text=''&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                          TextWrapping='Wrap' Margin='2,0,2,2'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;/StackPanel&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;/Border&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;Ellipse x:Name='StatusEllipse' Margin='4,2,2,2' Grid.Row='3' Stroke='#FF000000'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      Fill='#FF2D4DE0' RenderTransformOrigin='0.5,0.5' &amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;Ellipse.RenderTransform&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        &amp;lt;TransformGroup&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                          &amp;lt;ScaleTransform/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                          &amp;lt;SkewTransform/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                          &amp;lt;RotateTransform/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                          &amp;lt;TranslateTransform/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        &amp;lt;/TransformGroup&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;/Ellipse.RenderTransform&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;ToolTipService.ToolTip&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        &amp;lt;ToolTip Content='Click button to start work.' /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;/ToolTipService.ToolTip&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;/Ellipse&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;Canvas HorizontalAlignment='Stretch' Margin='0,0,2,8' Grid.RowSpan='4'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      Grid.ColumnSpan='3' x:Name='PromptCancelCanvas' Visibility='Collapsed'&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;Rectangle Height='300' Width='400' Fill='#FF808080' Stroke='#FF000000'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        Stretch='Fill' Opacity='0.6'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;Canvas Height='106' Width='289' Canvas.Left='46' Canvas.Top='85'&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        &amp;lt;Rectangle Height='106' Width='289' Fill='#FFFFFFFF' Stroke='#FF000000'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                          RadiusX='23' RadiusY='23' Opacity='0.85'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        &amp;lt;Button Height='34' x:Name='ButtonConfirmCancelYes' Width='100'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                          Canvas.Left='15' Canvas.Top='49' Content='Yes'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        &amp;lt;Button Height='34' x:Name='ButtonConfirmCancelNo' Width='100'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                          Canvas.Left='164' Canvas.Top='49' Content='No' /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        &amp;lt;TextBlock Width='134.835' Canvas.Left='75' Canvas.Top='12.463'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                          Text='Cancel Operation?' TextWrapping='Wrap'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;/Canvas&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;/Canvas&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;TextBlock Margin='67.8270034790039,0,-88.802001953125,0' Grid.Column='1'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      Grid.ColumnSpan='1' Text='BackgroundWorker Thread' TextWrapping='Wrap'/&amp;gt;                                                        &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                  &amp;lt;/Grid&amp;gt;&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;// Load xaml dynamically        &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; grid = XamlReader.Load(xamlControls) :?&amp;gt; Grid&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;// Find the controls...&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; statusEllipse = grid.FindName(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;StatusEllipse&amp;quot;&lt;/span&gt;&lt;span&gt;) :?&amp;gt; Ellipse &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; textarea = grid.FindName(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;WorkResultsTextData&amp;quot;&lt;/span&gt;&lt;span&gt;) :?&amp;gt; TextBox &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; doWorkButton = grid.FindName(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;DoWorkButton&amp;quot;&lt;/span&gt;&lt;span&gt;) :?&amp;gt; Button &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; cancelNoButton = grid.FindName(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;ButtonConfirmCancelNo&amp;quot;&lt;/span&gt;&lt;span&gt;) :?&amp;gt; Button         &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; cancelYesButton = grid.FindName(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;ButtonConfirmCancelYes&amp;quot;&lt;/span&gt;&lt;span&gt;) :?&amp;gt; Button &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; cancelCanvas = grid.FindName(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;PromptCancelCanvas&amp;quot;&lt;/span&gt;&lt;span&gt;) :?&amp;gt; Canvas &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; storyboard = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Storyboard()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; xaml = &lt;/span&gt;&lt;br /&gt;&lt;span&gt;             &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&amp;lt;ColorAnimationUsingKeyFrames &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                 xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                 xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                 xmlns:d='http://schemas.microsoft.com/expression/blend/2008' &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                 xmlns:mc='http://schemas.openxmlformats.org/markup-compatibility/2006'              &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                 BeginTime='00:00:00' &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                 Storyboard.TargetProperty='(Shape.Fill).(SolidColorBrush.Color)'&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineColorKeyFrame KeyTime='00:00:00' Value='#FF008000'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineColorKeyFrame KeyTime='00:00:01.5000000' Value='#FFFFFF00'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineColorKeyFrame KeyTime='00:00:03' Value='#FF008000'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineColorKeyFrame KeyTime='00:00:04.5000000' Value='#FF008000'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineColorKeyFrame KeyTime='00:00:06' Value='#FFFFFF00'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineColorKeyFrame KeyTime='00:00:07.5000000' Value='#FF008000'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;              &amp;lt;/ColorAnimationUsingKeyFrames&amp;gt;&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;         &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; animation = XamlReader.Load(xaml) :?&amp;gt; ColorAnimationUsingKeyFrames&lt;/span&gt;&lt;br /&gt;&lt;span&gt;         Storyboard.SetTarget(animation,statusEllipse)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;         animation&lt;/span&gt;&lt;br /&gt;&lt;span&gt;         ) |&amp;gt; storyboard.Children.Add&lt;/span&gt;&lt;br /&gt;&lt;span&gt;           &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; xaml = &lt;/span&gt;&lt;br /&gt;&lt;span&gt;             &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&amp;lt;DoubleAnimationUsingKeyFrames&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                 xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                 xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                 xmlns:d='http://schemas.microsoft.com/expression/blend/2008' &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                 xmlns:mc='http://schemas.openxmlformats.org/markup-compatibility/2006'              &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                 BeginTime='00:00:00' Storyboard.TargetProperty='(UIElement.Opacity)'&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:00' Value='0.7'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:01.5000000' Value='0.5'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:03' Value='0.5'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:04.5000000' Value='0.7'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:06' Value='0.5'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:07.5000000' Value='0.5'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;              &amp;lt;/DoubleAnimationUsingKeyFrames&amp;gt;&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;         &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; animation = XamlReader.Load(xaml) :?&amp;gt; DoubleAnimationUsingKeyFrames&lt;/span&gt;&lt;br /&gt;&lt;span&gt;         Storyboard.SetTarget(animation,statusEllipse)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;         animation&lt;/span&gt;&lt;br /&gt;&lt;span&gt;         ) |&amp;gt; storyboard.Children.Add&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; xaml = &lt;/span&gt;&lt;br /&gt;&lt;span&gt;             &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&amp;lt;DoubleAnimationUsingKeyFrames&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                 xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                 xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                 xmlns:d='http://schemas.microsoft.com/expression/blend/2008' &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                 xmlns:mc='http://schemas.openxmlformats.org/markup-compatibility/2006'              &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                 BeginTime='00:00:00' &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                 Storyboard.TargetProperty='(UIElement.RenderTransform).(TransformGroup.Children)[1].(SkewTransform.AngleX)'&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:00' Value='0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:01.5000000' Value='0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:03' Value='0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:04.5000000' Value='0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:06' Value='0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:07.5000000' Value='0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;              &amp;lt;/DoubleAnimationUsingKeyFrames&amp;gt;&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;         &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; animation = XamlReader.Load(xaml) :?&amp;gt; DoubleAnimationUsingKeyFrames&lt;/span&gt;&lt;br /&gt;&lt;span&gt;         Storyboard.SetTarget(animation,statusEllipse)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;         animation&lt;/span&gt;&lt;br /&gt;&lt;span&gt;         ) |&amp;gt; storyboard.Children.Add&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; xaml = &lt;/span&gt;&lt;br /&gt;&lt;span&gt;             &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&amp;lt;DoubleAnimationUsingKeyFrames&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                 xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                 xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                 xmlns:d='http://schemas.microsoft.com/expression/blend/2008' &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                 xmlns:mc='http://schemas.openxmlformats.org/markup-compatibility/2006'              &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                 BeginTime='00:00:00' &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                 Storyboard.TargetProperty='(UIElement.RenderTransform).(TransformGroup.Children)[1].(SkewTransform.AngleY)'&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:00' Value='0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:01.5000000' Value='0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:03' Value='0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:04.5000000' Value='0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:06' Value='0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;SplineDoubleKeyFrame KeyTime='00:00:07.5000000' Value='0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;              &amp;lt;/DoubleAnimationUsingKeyFrames&amp;gt;&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;         &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; animation = XamlReader.Load(xaml) :?&amp;gt; DoubleAnimationUsingKeyFrames&lt;/span&gt;&lt;br /&gt;&lt;span&gt;         Storyboard.SetTarget(animation,statusEllipse)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;         animation&lt;/span&gt;&lt;br /&gt;&lt;span&gt;         ) |&amp;gt; storyboard.Children.Add&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; worker = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; BackgroundWorker(WorkerReportsProgress = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                                          WorkerSupportsCancellation = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;// Implent DoWorkButton_Click&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        doWorkButton.Click.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span&gt; worker.IsBusy = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;false&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                textarea.Text &amp;lt;- sprintf &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;Started : %s&amp;quot;&lt;/span&gt;&lt;span&gt;  (DateTime.Now.ToString())&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                worker.RunWorkerAsync(textarea.Text)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                storyboard.AutoReverse &amp;lt;- &lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                storyboard.RepeatBehavior &amp;lt;- RepeatBehavior.Forever&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                storyboard.Begin()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                )&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;// Implement ButtonConfirmCancelYes_Click&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        cancelYesButton.Click.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            worker.CancelAsync()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            cancelCanvas.Visibility &amp;lt;- Visibility.Collapsed)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;// Implement ButtonConfirmCancelNo_Click&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        cancelNoButton.Click.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            cancelCanvas.Visibility &amp;lt;- Visibility.Collapsed)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;// Implement StatusEllipse_MouseLeftButtonDown&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        statusEllipse.MouseLeftButtonDown.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span&gt; worker.IsBusy = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                cancelCanvas.Visibility &amp;lt;- Visibility.Visible)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;// Implement DoWork                                          &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        worker.DoWork.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;           [1..30] |&amp;gt; iter (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;               &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span&gt; worker.CancellationPending = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                  e.Cancel &amp;lt;- &lt;/span&gt;&lt;span style="color: #0000ff"&gt;false&lt;/span&gt;&lt;br /&gt;&lt;span&gt;               &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                  System.Threading.Thread.Sleep(1000);&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                  (int (floor (float i)*100.0/30.0))&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                  |&amp;gt; worker.ReportProgress)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;           e.Result &amp;lt;- sprintf &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;\nCompleted : %s&amp;quot;&lt;/span&gt;&lt;span&gt; (DateTime.Now.ToString()))&lt;/span&gt;&lt;br /&gt;&lt;span&gt;           &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;// Implement RunWorkerCompleted&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        worker.RunWorkerCompleted.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            storyboard.Stop()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span&gt; e.Cancelled = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;false&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                statusEllipse.Fill &amp;lt;- &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; SolidColorBrush(Color.FromArgb(255uy,0uy,255uy,0uy))&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                textarea.Text &amp;lt;- textarea.Text + e.Result.ToString()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                ToolTipService.SetToolTip(statusEllipse, &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;Work Complete.&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;                statusEllipse.Fill &amp;lt;- &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; SolidColorBrush(Color.FromArgb(255uy,255uy,255uy,0uy))&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; msg = sprintf &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;%s \nCanceled@: %s&amp;quot;&lt;/span&gt;&lt;span&gt; textarea.Text &amp;lt;| DateTime.Now.ToString()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                ToolTipService.SetToolTip(statusEllipse, msg))&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                                          &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;// Implement ProgressChanged&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        worker.ProgressChanged.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span&gt; cancelCanvas.Visibility = Visibility.Collapsed &lt;/span&gt;&lt;span style="color: #0000ff"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; msg = sprintf &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;%s Percent Complete.  Click to cancel...&amp;quot;&lt;/span&gt;&lt;span&gt; (e.ProgressPercentage.ToString())&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                ToolTipService.SetToolTip(statusEllipse, msg))&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;&lt;span&gt;.Width &amp;lt;- 400.0&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;&lt;span&gt;.Height &amp;lt;- 300.0&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;&lt;span&gt;.Content &amp;lt;- grid&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//base.Content &amp;lt;- testerror&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;type&lt;/span&gt;&lt;span&gt; ErrorPage = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;inherit&lt;/span&gt;&lt;span&gt; UserControl&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; (msg:string ) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&lt;span&gt; this = {} &lt;/span&gt;&lt;span style="color: #0000ff"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; textarea = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; TextBlock(Text=msg,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                                     TextWrapping=TextWrapping.Wrap,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                                     Margin=&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Thickness(4.0,4.0,4.0,4.0))&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; sp = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; StackPanel(HorizontalAlignment = HorizontalAlignment.Stretch,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                                Margin=&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Thickness(8.0,8.0,10.0,8.0))&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        sp.Children.Add(textarea)                                &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;&lt;span&gt;.Width &amp;lt;- 600.0&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;&lt;span&gt;.Height &amp;lt;- 1000.0&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;&lt;span&gt;.Content &amp;lt;- sp&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;end&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;type&lt;/span&gt;&lt;span&gt; MyApp = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;inherit&lt;/span&gt;&lt;span&gt; Application&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; () &lt;/span&gt;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&lt;span&gt; this = {} &lt;/span&gt;&lt;span style="color: #0000ff"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        this.Startup.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; _ &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; rootPanel = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; StackPanel()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;                this.RootVisual &amp;lt;- rootPanel&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                rootPanel.Children.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; MyPage())&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;with&lt;/span&gt;&lt;span&gt; _ &lt;/span&gt;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&lt;span&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;               &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; msg = e.Message + e.StackTrace&lt;/span&gt;&lt;br /&gt;&lt;span&gt;               rootPanel.Children.Clear()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;               rootPanel.Children.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; ErrorPage(msg)))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;        this.UnhandledException.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; args &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;           args.Handled &amp;lt;- &lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;br /&gt;&lt;span&gt;           &lt;/span&gt;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;br /&gt;&lt;span&gt;               &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; msg = args.ExceptionObject.Message + args.ExceptionObject.StackTrace&lt;/span&gt;&lt;br /&gt;&lt;span&gt;               &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; errmsg = msg.Replace(&lt;/span&gt;&lt;span style="color: #800000"&gt;'&amp;quot;'&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style="color: #800000"&gt;'\''&lt;/span&gt;&lt;span&gt;).Replace(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;\r\n&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style="color: #800000"&gt;@&amp;quot;\n&amp;quot;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;br /&gt;&lt;span&gt;               &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;throw new Error(\&amp;quot;Unhandled error in Silverlight 2 Application &amp;quot;&lt;/span&gt;&lt;span&gt; + msg + &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;\&amp;quot;);&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;               |&amp;gt; HtmlPage.Window.Eval |&amp;gt; ignore&lt;/span&gt;&lt;br /&gt;&lt;span&gt;           &lt;/span&gt;&lt;span style="color: #0000ff"&gt;with&lt;/span&gt;&lt;span&gt; _  &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; HtmlPage.Window.Eval(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;throw new Error(\&amp;quot;Custom Error!\&amp;quot;);&amp;quot;&lt;/span&gt;&lt;span&gt;) |&amp;gt; ignore)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;end&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18281936-5767256698351879135?l=jyliao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jyliao.blogspot.com/feeds/5767256698351879135/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18281936&amp;postID=5767256698351879135' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/5767256698351879135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/5767256698351879135'/><link rel='alternate' type='text/html' href='http://jyliao.blogspot.com/2009/03/silverlight-with-f-animation-via-xaml.html' title='Silverlight with F#: Animation via XAML'/><author><name>John Liao</name><uri>http://www.blogger.com/profile/04740715435312568366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18281936.post-2003909851253799753</id><published>2009-03-17T06:54:00.001-07:00</published><updated>2009-03-17T06:54:23.129-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='f#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><title type='text'>Silverlight with F#: Background Thread and Animation</title><content type='html'>&lt;p&gt;I am working through recipe 2.11 in the book &lt;a href="http://www.amazon.com/gp/product/1590599772?ie=UTF8&amp;amp;tag=techie2biz-20&amp;amp;linkCode=xm2&amp;amp;camp=1789&amp;amp;creativeASIN=1590599772"&gt;Silverlight 2 Recipes&lt;/a&gt;, which introduce concepts of background threads and animation in Silverlight.&amp;#160; In developing recipe 2.11 in F#, I ran into problems getting animation to work. I managed to narrow the problem down to use of PropertyPath in my code.&amp;#160; If I use the following line of code, the Silverlight application would work.&lt;/p&gt;  &lt;pre&gt;Storyboard.SetTargetProperty(animation,new PropertyPath(UIElement.OpacityProperty))&lt;/pre&gt;

&lt;p&gt;But if I use the following line of code:&lt;/p&gt;

&lt;pre&gt;Storyboard.SetTargetProperty(animation,new PropertyPath(&amp;quot;(UIElement.Opacity)&amp;quot;))&lt;/pre&gt;

&lt;p&gt;it would fail with the following message:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_tmuJUwQ_atM/Sb-rjDB6HEI/AAAAAAAAAJU/ONquWYOJiJo/s1600-h/proppatherr3.jpg"&gt;&lt;img title="proppatherr" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="378" alt="proppatherr" src="http://lh3.ggpht.com/_tmuJUwQ_atM/Sb-rjafOtRI/AAAAAAAAAJY/JWRavH0TKng/proppatherr_thumb1.jpg?imgmax=800" width="642" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Matthew MacDonald seemed to support the second usage of PropertyPath in chapter 9 of his book &lt;a href="http://www.amazon.com/gp/product/1590599497?ie=UTF8&amp;amp;tag=techie2biz-20&amp;amp;linkCode=xm2&amp;amp;camp=1789&amp;amp;creativeASIN=1590599497"&gt;Pro Silverlight 2 in C# 2008&lt;/a&gt;.&amp;#160; I’m not sure right now what’s causing it to break when using that code form with F#.&amp;#160; Due to problems I’ve encountered with PropertyPath, I’m not able to implement recipe 2.11 completely.&amp;#160; I did managed to implement a stripped down version of recipe 2.11 that demonstrates background threads with animation.&amp;#160; Here’s the code that did work for me:&lt;/p&gt;

&lt;pre&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;#light&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt;&lt;span&gt; SilverLightFSharp&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.ComponentModel&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.IO&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.IO.IsolatedStorage&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.ServiceModel&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Browser&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Controls&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Markup&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Media&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Media.Animation&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Shapes&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; List&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;// Recipe 2-11 from Silverlight 2 Recipes book&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;// Executing work on a background thread with updates&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;// Simplified due to problems with Storyboard.SetTargetProperty and PropertyPath&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;// Added error page for debugging purposes&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;type&lt;/span&gt;&lt;span&gt; MyPage() = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;inherit&lt;/span&gt;&lt;span&gt; UserControl()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;do&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; xamlControls = &lt;/span&gt;&lt;br /&gt;&lt;span&gt;                &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&amp;lt;Grid xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                       xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                       xmlns:d='http://schemas.microsoft.com/expression/blend/2008' &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                       xmlns:mc='http://schemas.openxmlformats.org/markup-compatibility/2006' &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                       mc:Ignorable='d'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                       &amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;Grid.ColumnDefinitions&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;ColumnDefinition Width='0.068*'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;ColumnDefinition Width='0.438*'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;ColumnDefinition Width='0.495*'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;/Grid.ColumnDefinitions&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;Grid.RowDefinitions&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;RowDefinition Height='0.08*'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;RowDefinition Height='0.217*'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;RowDefinition Height='0.61*'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;RowDefinition Height='0.093*'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;/Grid.RowDefinitions&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;Button HorizontalAlignment='Stretch' Margin='5,8,5,8'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                     VerticalAlignment='Stretch' Grid.Column='1' Grid.Row='1'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      Content='Save Form Data'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;StackPanel HorizontalAlignment='Stretch'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      Margin='5,8,6,8' Grid.Column='1' Grid.Row='2'&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;TextBlock Height='Auto' Width='Auto' Text='Work Results Appear Below'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      TextWrapping='Wrap' Margin='4,4,4,4'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;TextBox Height='103' Width='Auto' Text='' TextWrapping='Wrap'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      Margin='4,4,4,4' x:Name='WorkResultsTextData'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;/StackPanel&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;Button HorizontalAlignment='Stretch' Margin='12,8,8,8'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      VerticalAlignment='Stretch'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                     Grid.Column='2' Grid.Row='1' Content='Load Form Data' /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;Button HorizontalAlignment='Stretch' Margin='10,2,8,6'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      VerticalAlignment='Stretch'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                       Grid.Column='1' Grid.Row='3' Content='Kick Off Work' x:Name='DoWorkButton'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;Border Grid.Column='2' Grid.Row='2' Grid.RowSpan='2' CornerRadius='10,10,10,10'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                       Margin='1.80200004577637,2,2,2'&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;Border.Background&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        &amp;lt;LinearGradientBrush EndPoint='0.560000002384186,0.00300000002607703'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                           StartPoint='0.439999997615814,0.996999979019165'&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                          &amp;lt;GradientStop Color='#FF586C57'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                          &amp;lt;GradientStop Color='#FFA3BDA3' Offset='0.536'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                          &amp;lt;GradientStop Color='#FF586C57' Offset='0.968999981880188'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        &amp;lt;/LinearGradientBrush&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;/Border.Background&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;StackPanel Margin='4,4,4,4' x:Name='FormData'&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        &amp;lt;TextBlock Height='Auto' Width='Auto' Text='First Name:' TextWrapping='Wrap'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        Margin='2,2,2,0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        &amp;lt;TextBox Height='Auto' Width='Auto' Text='' TextWrapping='Wrap' &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                          x:Name='Field1' Margin='2,0,2,4'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        &amp;lt;TextBlock Height='Auto' Width='Auto' Text='Last Name:'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                           TextWrapping='Wrap' Margin='2,4,2,0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        &amp;lt;TextBox Height='Auto' x:Name='Field2' Width='Auto' Text=''&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                          TextWrapping='Wrap' Margin='2,0,2,4'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        &amp;lt;TextBlock Height='Auto' Width='Auto' Text='Company:'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                          TextWrapping='Wrap' Margin='2,4,2,0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        &amp;lt;TextBox Height='Auto' x:Name='Field3' Width='Auto' Text=''&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                          TextWrapping='Wrap' Margin='2,0,2,2'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        &amp;lt;TextBlock Height='22.537' Width='182' Text='Title:'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                          TextWrapping='Wrap' Margin='2,4,2,0'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        &amp;lt;TextBox Height='20.772' x:Name='Field4' Width='182' Text=''&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                          TextWrapping='Wrap' Margin='2,0,2,2'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;/StackPanel&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;/Border&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;Ellipse x:Name='StatusEllipse' Margin='4,2,2,2' Grid.Row='3' Stroke='#FF000000'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      Fill='#FF2D4DE0' RenderTransformOrigin='0.5,0.5' &amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;Ellipse.RenderTransform&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        &amp;lt;TransformGroup&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                          &amp;lt;ScaleTransform/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                          &amp;lt;SkewTransform/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                          &amp;lt;RotateTransform/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                          &amp;lt;TranslateTransform/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        &amp;lt;/TransformGroup&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;/Ellipse.RenderTransform&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;ToolTipService.ToolTip&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        &amp;lt;ToolTip Content='Click button to start work.' /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;/ToolTipService.ToolTip&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;/Ellipse&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;Canvas HorizontalAlignment='Stretch' Margin='0,0,2,8' Grid.RowSpan='4'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      Grid.ColumnSpan='3' x:Name='PromptCancelCanvas' Visibility='Collapsed'&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;Rectangle Height='300' Width='400' Fill='#FF808080' Stroke='#FF000000'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        Stretch='Fill' Opacity='0.6'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;Canvas Height='106' Width='289' Canvas.Left='46' Canvas.Top='85'&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        &amp;lt;Rectangle Height='106' Width='289' Fill='#FFFFFFFF' Stroke='#FF000000'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                          RadiusX='23' RadiusY='23' Opacity='0.85'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        &amp;lt;Button Height='34' x:Name='ButtonConfirmCancelYes' Width='100'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                          Canvas.Left='15' Canvas.Top='49' Content='Yes'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        &amp;lt;Button Height='34' x:Name='ButtonConfirmCancelNo' Width='100'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                          Canvas.Left='164' Canvas.Top='49' Content='No' /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                        &amp;lt;TextBlock Width='134.835' Canvas.Left='75' Canvas.Top='12.463'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                          Text='Cancel Operation?' TextWrapping='Wrap'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;/Canvas&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;/Canvas&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;TextBlock Margin='67.8270034790039,0,-88.802001953125,0' Grid.Column='1'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      Grid.ColumnSpan='1' Text='BackgroundWorker Thread' TextWrapping='Wrap'/&amp;gt;                                                        &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                  &amp;lt;/Grid&amp;gt;&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;// Load xaml dynamically        &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; grid = XamlReader.Load(xamlControls) :?&amp;gt; Grid&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;// Find the controls...&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; statusEllipse = grid.FindName(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;StatusEllipse&amp;quot;&lt;/span&gt;&lt;span&gt;) :?&amp;gt; Ellipse &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; textarea = grid.FindName(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;WorkResultsTextData&amp;quot;&lt;/span&gt;&lt;span&gt;) :?&amp;gt; TextBox &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; doWorkButton = grid.FindName(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;DoWorkButton&amp;quot;&lt;/span&gt;&lt;span&gt;) :?&amp;gt; Button &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; cancelNoButton = grid.FindName(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;ButtonConfirmCancelNo&amp;quot;&lt;/span&gt;&lt;span&gt;) :?&amp;gt; Button         &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; cancelYesButton = grid.FindName(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;ButtonConfirmCancelYes&amp;quot;&lt;/span&gt;&lt;span&gt;) :?&amp;gt; Button &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; cancelCanvas = grid.FindName(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;PromptCancelCanvas&amp;quot;&lt;/span&gt;&lt;span&gt;) :?&amp;gt; Canvas &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//let storyboard = Resources.createStoryBoard()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;// Must preset opacity value&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        statusEllipse.Opacity &amp;lt;- 0.2&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; storyboard = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Storyboard()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; animation = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; DoubleAnimation(From=&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Nullable&amp;lt;float&amp;gt;(0.2),&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                                            To=&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Nullable&amp;lt;float&amp;gt;(1.0),&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                                            Duration= &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Duration(TimeSpan.FromSeconds(5.0)))&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        Storyboard.SetTarget(animation,statusEllipse)        &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;// This following line of code does not work - gives NullReference exception&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//Storyboard.SetTargetProperty(animation,new PropertyPath(&amp;quot;(UIElement.Opacity)&amp;quot;))&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        Storyboard.SetTargetProperty(animation,&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; PropertyPath(UIElement.OpacityProperty))&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        storyboard.Children.Add(animation)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; worker = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; BackgroundWorker(WorkerReportsProgress = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                                          WorkerSupportsCancellation = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;// Implement DoWorkButton_Click&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        doWorkButton.Click.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span&gt; worker.IsBusy = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;false&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                textarea.Text &amp;lt;- sprintf &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;Started : %s&amp;quot;&lt;/span&gt;&lt;span&gt;  (DateTime.Now.ToString())&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                worker.RunWorkerAsync(textarea.Text)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                storyboard.AutoReverse &amp;lt;- &lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                storyboard.RepeatBehavior &amp;lt;- RepeatBehavior.Forever&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                storyboard.Begin()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                )&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;// Implement ButtonConfirmCancelYes_Click&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        cancelYesButton.Click.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            worker.CancelAsync()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            cancelCanvas.Visibility &amp;lt;- Visibility.Collapsed)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;// Implement ButtonConfirmCancelNo_Click&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        cancelNoButton.Click.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            cancelCanvas.Visibility &amp;lt;- Visibility.Collapsed)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;// Implement StatusEllipse_MouseLeftButtonDown&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        statusEllipse.MouseLeftButtonDown.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span&gt; worker.IsBusy = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                cancelCanvas.Visibility &amp;lt;- Visibility.Visible)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;// Implement DoWork                                          &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        worker.DoWork.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;           [1..30] |&amp;gt; iter (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;               &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span&gt; worker.CancellationPending = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                  e.Cancel &amp;lt;- &lt;/span&gt;&lt;span style="color: #0000ff"&gt;false&lt;/span&gt;&lt;br /&gt;&lt;span&gt;               &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                  System.Threading.Thread.Sleep(1000);&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                  (int (floor (float i)*100.0/30.0))&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                  |&amp;gt; worker.ReportProgress)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;           e.Result &amp;lt;- sprintf &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;\nCompleted : %s&amp;quot;&lt;/span&gt;&lt;span&gt; (DateTime.Now.ToString()))&lt;/span&gt;&lt;br /&gt;&lt;span&gt;           &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;// Implement RunWorkerCompleted&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        worker.RunWorkerCompleted.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            storyboard.Stop()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span&gt; e.Cancelled = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;false&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                statusEllipse.Fill &amp;lt;- &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; SolidColorBrush(Color.FromArgb(255uy,0uy,255uy,0uy))&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                textarea.Text &amp;lt;- textarea.Text + e.Result.ToString()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                ToolTipService.SetToolTip(statusEllipse, &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;Work Complete.&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;                statusEllipse.Fill &amp;lt;- &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; SolidColorBrush(Color.FromArgb(255uy,255uy,255uy,0uy))&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; msg = sprintf &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;%s \nCanceled@: %s&amp;quot;&lt;/span&gt;&lt;span&gt; textarea.Text &amp;lt;| DateTime.Now.ToString()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                ToolTipService.SetToolTip(statusEllipse, msg))&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                                          &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;// Implement ProgressChanged&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        worker.ProgressChanged.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span&gt; cancelCanvas.Visibility = Visibility.Collapsed &lt;/span&gt;&lt;span style="color: #0000ff"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; msg = sprintf &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;%s Percent Complete.  Click to cancel...&amp;quot;&lt;/span&gt;&lt;span&gt; (e.ProgressPercentage.ToString())&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                ToolTipService.SetToolTip(statusEllipse, msg))&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;&lt;span&gt;.Width &amp;lt;- 400.0&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;&lt;span&gt;.Height &amp;lt;- 300.0&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;&lt;span&gt;.Content &amp;lt;- grid&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//base.Content &amp;lt;- testerror&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;type&lt;/span&gt;&lt;span&gt; ErrorPage = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;inherit&lt;/span&gt;&lt;span&gt; UserControl&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; (msg:string ) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&lt;span&gt; this = {} &lt;/span&gt;&lt;span style="color: #0000ff"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; textarea = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; TextBlock(Text=msg,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                                     TextWrapping=TextWrapping.Wrap,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                                     Margin=&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Thickness(4.0,4.0,4.0,4.0))&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; sp = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; StackPanel(HorizontalAlignment = HorizontalAlignment.Stretch,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                                Margin=&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Thickness(8.0,8.0,10.0,8.0))&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        sp.Children.Add(textarea)                                &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;&lt;span&gt;.Width &amp;lt;- 600.0&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;&lt;span&gt;.Height &amp;lt;- 1000.0&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;&lt;span&gt;.Content &amp;lt;- sp&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;end&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;type&lt;/span&gt;&lt;span&gt; MyApp = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;inherit&lt;/span&gt;&lt;span&gt; Application&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; () &lt;/span&gt;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&lt;span&gt; this = {} &lt;/span&gt;&lt;span style="color: #0000ff"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        this.Startup.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; _ &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; rootPanel = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; StackPanel()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;                this.RootVisual &amp;lt;- rootPanel&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                rootPanel.Children.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; MyPage())&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;with&lt;/span&gt;&lt;span&gt; _ &lt;/span&gt;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&lt;span&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;               &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; msg = e.Message + e.StackTrace&lt;/span&gt;&lt;br /&gt;&lt;span&gt;               rootPanel.Children.Clear()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;               rootPanel.Children.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; ErrorPage(msg)))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;        this.UnhandledException.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; args &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;           args.Handled &amp;lt;- &lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;br /&gt;&lt;span&gt;           &lt;/span&gt;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;br /&gt;&lt;span&gt;               &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; msg = args.ExceptionObject.Message + args.ExceptionObject.StackTrace&lt;/span&gt;&lt;br /&gt;&lt;span&gt;               &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; errmsg = msg.Replace(&lt;/span&gt;&lt;span style="color: #800000"&gt;'&amp;quot;'&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style="color: #800000"&gt;'\''&lt;/span&gt;&lt;span&gt;).Replace(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;\r\n&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span style="color: #800000"&gt;@&amp;quot;\n&amp;quot;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;br /&gt;&lt;span&gt;               &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;throw new Error(\&amp;quot;Unhandled error in Silverlight 2 Application &amp;quot;&lt;/span&gt;&lt;span&gt; + msg + &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;\&amp;quot;);&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;               |&amp;gt; HtmlPage.Window.Eval |&amp;gt; ignore&lt;/span&gt;&lt;br /&gt;&lt;span&gt;           &lt;/span&gt;&lt;span style="color: #0000ff"&gt;with&lt;/span&gt;&lt;span&gt; _  &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; HtmlPage.Window.Eval(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;throw new Error(\&amp;quot;Custom Error!\&amp;quot;);&amp;quot;&lt;/span&gt;&lt;span&gt;) |&amp;gt; ignore)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;end&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18281936-2003909851253799753?l=jyliao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jyliao.blogspot.com/feeds/2003909851253799753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18281936&amp;postID=2003909851253799753' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/2003909851253799753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/2003909851253799753'/><link rel='alternate' type='text/html' href='http://jyliao.blogspot.com/2009/03/silverlight-with-f-background-thread.html' title='Silverlight with F#: Background Thread and Animation'/><author><name>John Liao</name><uri>http://www.blogger.com/profile/04740715435312568366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_tmuJUwQ_atM/Sb-rjafOtRI/AAAAAAAAAJY/JWRavH0TKng/s72-c/proppatherr_thumb1.jpg?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18281936.post-8378415379468001041</id><published>2009-03-08T15:24:00.001-07:00</published><updated>2009-03-08T15:24:06.047-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='f#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><title type='text'>F# Silverlight, XAML and opening local files</title><content type='html'>&lt;p&gt;I’m working through more examples in the book &lt;a href="http://www.amazon.com/gp/product/1590599772?ie=UTF8&amp;amp;tag=techie2biz-20&amp;amp;linkCode=xm2&amp;amp;camp=1789&amp;amp;creativeASIN=1590599772"&gt;Silverlight 2 Recipes&lt;/a&gt;.&amp;#160; While it has been an interesting exercise to manually convert the XAML examples into F# code, it detracted me from learning about other aspects of Silverlight technology.&amp;#160; In this particular sample code, I decided to take the XAML output and dynamically load it as per the example from recipe 2-5.&amp;#160; Of course, once you load the UI controls via XAML, you’ll need to find those controls as per example from recipe 2-3 from the book.&amp;#160; Finally, the recipe I really wanted to develop is recipe 2-7 where the Silverlight app loads local files.&amp;#160; Below is the sample code:&lt;/p&gt;  &lt;pre&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;#light&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt;&lt;span&gt; SilverLightFSharp&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.IO&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.IO.IsolatedStorage&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Controls&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Media&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.ServiceModel&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Markup&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Browser&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; List&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;// Combining recipes 2-3,2-5 and 2-7 from Silverlight 2 Recipes book&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;// Dynamically loading XAML from managed code&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;// Find an element in XAML&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008000"&gt;// Opening local files&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;type&lt;/span&gt;&lt;span&gt; MyPage() = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;inherit&lt;/span&gt;&lt;span&gt; UserControl()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;do&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; xaml = &lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&amp;lt;Grid xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                   xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                   xmlns:d='http://schemas.microsoft.com/expression/blend/2008'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                   xmlns:mc='http://schemas.openxmlformats.org/markup-compatibility/2006'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                   mc:Ignorable='d'&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;Grid.Background&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                  &amp;lt;LinearGradientBrush EndPoint='0.5,1' StartPoint='0.5,0'&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;GradientStop Color='#FF000000'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;GradientStop Color='#FFFFFFFF' Offset='1'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                  &amp;lt;/LinearGradientBrush&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;/Grid.Background&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;Grid.RowDefinitions&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                  &amp;lt;RowDefinition Height='0.117*'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                  &amp;lt;RowDefinition Height='0.79*'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                  &amp;lt;RowDefinition Height='0.093*'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;/Grid.RowDefinitions&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;Grid.ColumnDefinitions&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                  &amp;lt;ColumnDefinition Width='0.058*'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                  &amp;lt;ColumnDefinition Width='0.252*'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                  &amp;lt;ColumnDefinition Width='0.64*'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                  &amp;lt;ColumnDefinition Width='0.05*'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;/Grid.ColumnDefinitions&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;Button Height='28.9' HorizontalAlignment='Stretch' Margin='8,8,11,0'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                 VerticalAlignment='Top' Width='81.8' Grid.Column='1' Grid.Row='1'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                 Content='Select Files' d:LayoutOverrides='Height' x:Name='ButtonSelectFiles'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;TextBlock Margin='4,2,2,2' Grid.Column='1' Grid.Row='2' Text='Status'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                   TextWrapping='Wrap' Grid.ColumnSpan='2' x:Name='StatusLabel'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;Border Grid.Column='2' Grid.Row='1' Margin='0,0,0,0' CornerRadius='12'&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                  &amp;lt;Border.Background&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;LinearGradientBrush EndPoint='0.916999995708466,0.0890000015497208'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                       StartPoint='-0.0489999987185001,2.12400007247925'&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;GradientStop Color='#FF1D351E'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;GradientStop Color='#FF1D351E' Offset='1'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                      &amp;lt;GradientStop Color='#FFB7D8BA' Offset='0.50900000333786011'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    &amp;lt;/LinearGradientBrush&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                  &amp;lt;/Border.Background&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                  &amp;lt;ListBox x:Name='FileList' Foreground='#FF000000' Height='217'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                    Width='236' Opacity='1'/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;                &amp;lt;/Border&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #800000"&gt;              &amp;lt;/Grid&amp;gt;&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;// Load xaml dynamically        &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; grid = XamlReader.Load(xaml) :?&amp;gt; Grid&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;// Find the controls...&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; status = grid.FindName(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;StatusLabel&amp;quot;&lt;/span&gt;&lt;span&gt;) :?&amp;gt; TextBlock&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; btnSelect = grid.FindName(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;ButtonSelectFiles&amp;quot;&lt;/span&gt;&lt;span&gt;) :?&amp;gt; Button&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; fileslist = grid.FindName(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;FileList&amp;quot;&lt;/span&gt;&lt;span&gt;) :?&amp;gt; ListBox&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//  open local files&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        btnSelect.Click.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; fileDlg = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; OpenFileDialog(Filter=&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;Image Files (*.jpg)|*.jpg|All Files (*.*)|*.*&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                                             Multiselect=&lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                                             FilterIndex=1)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                                             &lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; (=?!) (x: Nullable&amp;lt;'a&amp;gt;) (y:'a) = x.HasValue &amp;amp;&amp;amp; x.Value = y                                             &lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span&gt; (fileDlg.ShowDialog() =?! &lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;span&gt; )             &lt;/span&gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;then&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; files = fileDlg.Files&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                 status.Text &amp;lt;- (files |&amp;gt; Seq.length |&amp;gt; sprintf &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;%i file(s) selected&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;                 files |&amp;gt; Seq.iter (fileslist.Items.Add)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;            )&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;&lt;span&gt;.Width &amp;lt;- 400.0&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;&lt;span&gt;.Height &amp;lt;- 300.0&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;&lt;span&gt;.Content &amp;lt;- grid&lt;/span&gt;&lt;br /&gt;&lt;span&gt;       &lt;/span&gt;&lt;br /&gt;&lt;span&gt;       &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;type&lt;/span&gt;&lt;span&gt; MyApp = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;inherit&lt;/span&gt;&lt;span&gt; Application&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; () &lt;/span&gt;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&lt;span&gt; this = {} &lt;/span&gt;&lt;span style="color: #0000ff"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        this.Startup.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; _ &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; this.RootVisual &amp;lt;- &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; MyPage())            &lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//base.Exit.Add( fun _ -&amp;gt; ()) //this.Application_Exit)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//this.InitializeComponent()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;end&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18281936-8378415379468001041?l=jyliao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jyliao.blogspot.com/feeds/8378415379468001041/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18281936&amp;postID=8378415379468001041' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/8378415379468001041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/8378415379468001041'/><link rel='alternate' type='text/html' href='http://jyliao.blogspot.com/2009/03/f-silverlight-xaml-and-opening-local.html' title='F# Silverlight, XAML and opening local files'/><author><name>John Liao</name><uri>http://www.blogger.com/profile/04740715435312568366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18281936.post-5334968427752469654</id><published>2009-02-26T11:10:00.000-08:00</published><updated>2009-02-26T11:12:22.646-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='f#'/><title type='text'>F# Silverlight 2 and Isolated Storage</title><content type='html'>&lt;p&gt;I recently picked up a copy of the book &lt;a href="http://www.amazon.com/gp/product/1590599772?ie=UTF8&amp;amp;tag=techie2biz-20&amp;amp;linkCode=xm2&amp;amp;camp=1789&amp;amp;creativeASIN=1590599772"&gt;Silverlight 2 Recipes&lt;/a&gt; and wanted to try out some of the recipes by building F# version of them.&amp;nbsp;&amp;nbsp; One of the first recipes that caught my eye was recipe 2.6 which talks about working with IsolatedStorage.&amp;nbsp; One of the main issues I had with implementing this recipe in F# is the fact that the public methods for IsolatedStorageFile is different between .NET Framework 3.5 and for Silverlight 2.&amp;nbsp; Therefore, I was unable to call the CreateFile method of IsolatedStorageFile .&amp;nbsp; But thankfully, this problem was already resolved by Michael Giagnocavo in his blog on &lt;a href="http://www.atrevido.net/blog/2008/10/28/F+1962+And+Silverlight+2.aspx"&gt;F# 1.9.6.2 and Silverlight 2&lt;/a&gt;.&amp;nbsp; All I had to do is goto Project-&amp;gt;[ProjectName] Properties –&amp;gt; Build and enter the following flag in “Other flags:”&lt;/p&gt;&lt;pre&gt;--cliroot "C:\Program Files\Microsoft Silverlight\2.0.31005.0"&lt;/pre&gt;&lt;p&gt;After configuring the –&lt;code&gt;–cliroot &lt;/code&gt;flag, the source file compiled without problems.&amp;nbsp; Here’s the F# implementation of recipe 2.6 from the book:&lt;/p&gt;&lt;pre&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;#light&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt;&lt;span&gt; SilverLightFSharp&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.IO&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.IO.IsolatedStorage&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Controls&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Media&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.ServiceModel&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; List&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color: #008000"&gt;// Recipe 2-6 from Silverlight 2 Recipes book&lt;/span&gt;&lt;br&gt;&lt;span style="color: #008000"&gt;// Persisting Data on the Client&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;type&lt;/span&gt;&lt;span&gt; MyPage() = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;inherit&lt;/span&gt;&lt;span&gt; UserControl()&lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; settings = IsolatedStorageSettings.ApplicationSettings&lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; setting = &lt;/span&gt;&lt;span style="color: #800000"&gt;"MySettings"&lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; filename = &lt;/span&gt;&lt;span style="color: #800000"&gt;"FormFields.data"&lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; dataDirectory = &lt;/span&gt;&lt;span style="color: #800000"&gt;"FormData"&lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; filepath = System.IO.Path.Combine(dataDirectory, filename)&lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #008000"&gt;//new () as this = {} then&lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;do&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; buildgrid color =&lt;/span&gt;&lt;br&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; grid = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Grid(Background = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; SolidColorBrush(color))&lt;/span&gt;&lt;br&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; star = GridUnitType.Star&lt;/span&gt;&lt;br&gt;&lt;span&gt;            &lt;/span&gt;&lt;br&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;// Add column definitions&lt;/span&gt;&lt;br&gt;&lt;span&gt;            [0.06;0.455;0.485] &lt;/span&gt;&lt;br&gt;&lt;span&gt;            |&amp;gt; map (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; w &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; ColumnDefinition(Width=&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; GridLength(w,star)))&lt;/span&gt;&lt;br&gt;&lt;span&gt;            |&amp;gt; iter grid.ColumnDefinitions.Add&lt;/span&gt;&lt;br&gt;&lt;span&gt;            &lt;/span&gt;&lt;br&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;// Add row definitions&lt;/span&gt;&lt;br&gt;&lt;span&gt;            [0.08;0.217;0.61;0.093]&lt;/span&gt;&lt;br&gt;&lt;span&gt;            |&amp;gt; map (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; h &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; RowDefinition(Height=&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; GridLength(h,star)))&lt;/span&gt;&lt;br&gt;&lt;span&gt;            |&amp;gt; iter grid.RowDefinitions.Add&lt;/span&gt;&lt;br&gt;&lt;span&gt;            &lt;/span&gt;&lt;br&gt;&lt;span&gt;            grid&lt;/span&gt;&lt;br&gt;&lt;span&gt;            &lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; grid =  buildgrid Colors.Gray&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; gridadd (ui:#UIElement) row col =&lt;/span&gt;&lt;br&gt;&lt;span&gt;            grid.Children.Add(ui)&lt;/span&gt;&lt;br&gt;&lt;span&gt;            Grid.SetRow(ui,row)&lt;/span&gt;&lt;br&gt;&lt;span&gt;            Grid.SetColumn(ui,col)&lt;/span&gt;&lt;br&gt;&lt;span&gt;            &lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; sp = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; StackPanel(HorizontalAlignment = HorizontalAlignment.Stretch,&lt;/span&gt;&lt;br&gt;&lt;span&gt;                                Margin=&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Thickness(8.0,8.0,10.0,8.0))&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; TextBlock(Text=&lt;/span&gt;&lt;span style="color: #800000"&gt;"Enter Setting Value"&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span&gt;                      TextWrapping=TextWrapping.Wrap,&lt;/span&gt;&lt;br&gt;&lt;span&gt;                      Margin=&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Thickness(4.0,4.0,4.0,4.0))&lt;/span&gt;&lt;br&gt;&lt;span&gt;        |&amp;gt; sp.Children.Add&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; textdata = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; TextBox(Height=126.0,&lt;/span&gt;&lt;br&gt;&lt;span&gt;                                   Text=&lt;/span&gt;&lt;span style="color: #800000"&gt;""&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span&gt;                                   TextWrapping=TextWrapping.Wrap,&lt;/span&gt;&lt;br&gt;&lt;span&gt;                                   Margin=&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Thickness(4.0,4.0,4.0,4.0))&lt;/span&gt;&lt;br&gt;&lt;span&gt;        textdata |&amp;gt; sp.Children.Add&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span&gt;        gridadd sp 2 1&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;// Build Form&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; buildform () =&lt;/span&gt;&lt;br&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; brush = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; LinearGradientBrush&lt;/span&gt;&lt;br&gt;&lt;span&gt;                         (StartPoint = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Point(0.439999997615814,0.996999979019165),&lt;/span&gt;&lt;br&gt;&lt;span&gt;                          EndPoint = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Point(0.560000002384186,0.00300000002607703))&lt;/span&gt;&lt;br&gt;&lt;span&gt;                                                &lt;/span&gt;&lt;br&gt;&lt;span&gt;            [((255uy,58uy,108uy,87uy),0.0);&lt;/span&gt;&lt;br&gt;&lt;span&gt;             ((255uy,163uy,189uy,163uy),0.536);&lt;/span&gt;&lt;br&gt;&lt;span&gt;             ((255uy,58uy,108uy,87uy),0.968999981880188)]&lt;/span&gt;&lt;br&gt;&lt;span&gt;            |&amp;gt; map (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; (color,offset) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; GradientStop(Color=(color |&amp;gt; Color.FromArgb), Offset=offset))&lt;/span&gt;&lt;br&gt;&lt;span&gt;            |&amp;gt; iter brush.GradientStops.Add&lt;/span&gt;&lt;br&gt;&lt;span&gt;            &lt;/span&gt;&lt;br&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; form = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; StackPanel(HorizontalAlignment = HorizontalAlignment.Stretch,&lt;/span&gt;&lt;br&gt;&lt;span&gt;                                      VerticalAlignment = VerticalAlignment.Stretch,&lt;/span&gt;&lt;br&gt;&lt;span&gt;                                      Margin = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Thickness(4.0,4.0,4.0,4.0))&lt;/span&gt;&lt;br&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; border = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Border&lt;/span&gt;&lt;br&gt;&lt;span&gt;                          (HorizontalAlignment = HorizontalAlignment.Stretch,&lt;/span&gt;&lt;br&gt;&lt;span&gt;                           Margin = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Thickness(8.0,8.0,10.0,8.0),&lt;/span&gt;&lt;br&gt;&lt;span&gt;                           VerticalAlignment = VerticalAlignment.Stretch,&lt;/span&gt;&lt;br&gt;&lt;span&gt;                           CornerRadius = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; CornerRadius(10.0,10.0,10.0,10.0),&lt;/span&gt;&lt;br&gt;&lt;span&gt;                           Child=form,&lt;/span&gt;&lt;br&gt;&lt;span&gt;                           Background=brush)&lt;/span&gt;&lt;br&gt;&lt;span&gt;            gridadd border 2 2&lt;/span&gt;&lt;br&gt;&lt;span&gt;            Grid.SetRowSpan(border,2)&lt;/span&gt;&lt;br&gt;&lt;span&gt;            &lt;/span&gt;&lt;br&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; createLabel label = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; TextBlock(Text=label, &lt;/span&gt;&lt;br&gt;&lt;span&gt;                                                  TextWrapping=TextWrapping.Wrap,&lt;/span&gt;&lt;br&gt;&lt;span&gt;                                                  Margin = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Thickness(2.0,4.0,2.0,0.0))&lt;/span&gt;&lt;br&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; createTextbox () = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; TextBox(TextWrapping=TextWrapping.Wrap,&lt;/span&gt;&lt;br&gt;&lt;span&gt;                                               Margin = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Thickness(2.0,0.0,2.0,2.0))&lt;/span&gt;&lt;br&gt;&lt;span&gt;                                               &lt;/span&gt;&lt;br&gt;&lt;span&gt;                                                                                       &lt;/span&gt;&lt;br&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; formelements = &lt;/span&gt;&lt;br&gt;&lt;span&gt;               [&lt;/span&gt;&lt;span style="color: #800000"&gt;"First Name:"&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span style="color: #800000"&gt;"Last Name:"&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span style="color: #800000"&gt;"Company:"&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span style="color: #800000"&gt;"Title:"&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;br&gt;&lt;span&gt;               |&amp;gt; map (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; label &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; (createLabel label, createTextbox ()))&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span&gt;            &lt;/span&gt;&lt;br&gt;&lt;span&gt;            formelements |&amp;gt; iter (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; (label,tb) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br&gt;&lt;span&gt;               form.Children.Add(label)&lt;/span&gt;&lt;br&gt;&lt;span&gt;               form.Children.Add(tb))&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span&gt;            formelements&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; createbtn thickness row col content fn =&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;br&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; btn = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Button(HorizontalAlignment = HorizontalAlignment.Stretch,&lt;/span&gt;&lt;br&gt;&lt;span&gt;                                 Margin=thickness,&lt;/span&gt;&lt;br&gt;&lt;span&gt;                                 Content=content)&lt;/span&gt;&lt;br&gt;&lt;span&gt;            btn.Click.Add(fn)&lt;/span&gt;&lt;br&gt;&lt;span&gt;            btn.Click.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; evt &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; ())&lt;/span&gt;&lt;br&gt;&lt;span&gt;            gridadd btn row col&lt;/span&gt;&lt;br&gt;&lt;span&gt;         &lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; form = buildform()&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; fields = form |&amp;gt; map (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; (label,tb) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; tb)&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;// SaveFormData_Click&lt;/span&gt;&lt;br&gt;&lt;span&gt;        createbtn (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Thickness(8.0)) 1 1 &lt;/span&gt;&lt;span style="color: #800000"&gt;"Save Form Data"&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &amp;lt;| (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; evt &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br&gt;&lt;span&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;br&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;use&lt;/span&gt;&lt;span&gt; store = IsolatedStorageFile.GetUserStoreForApplication()&lt;/span&gt;&lt;br&gt;&lt;span&gt;                    store.CreateDirectory(dataDirectory)&lt;/span&gt;&lt;br&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;use&lt;/span&gt;&lt;span&gt; stream = store.CreateFile(filepath)&lt;/span&gt;&lt;br&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;use&lt;/span&gt;&lt;span&gt; writer = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; StreamWriter(stream)&lt;/span&gt;&lt;br&gt;&lt;span&gt;                    writer.AutoFlush &amp;lt;- &lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;br&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; data = fields |&amp;gt; map (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; field &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; field.Text + &lt;/span&gt;&lt;span style="color: #800000"&gt;"|"&lt;/span&gt;&lt;span&gt;)  &lt;/span&gt;&lt;br&gt;&lt;span&gt;                               |&amp;gt; fold_left (+) &lt;/span&gt;&lt;span style="color: #800000"&gt;""&lt;/span&gt;&lt;br&gt;&lt;span&gt;                    data |&amp;gt; writer.WriteLine&lt;/span&gt;&lt;br&gt;&lt;span&gt;                    textdata.Text &amp;lt;- &lt;/span&gt;&lt;span style="color: #800000"&gt;"Data saved to : "&lt;/span&gt;&lt;span&gt; + filepath + &lt;/span&gt;&lt;span style="color: #800000"&gt;"\n"&lt;/span&gt;&lt;span&gt; + data&lt;/span&gt;&lt;br&gt;&lt;span&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;with&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br&gt;&lt;span&gt;                   | :? IsolatedStorageException &lt;/span&gt;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&lt;span&gt; ex &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;  textdata.Text &amp;lt;- &lt;/span&gt;&lt;span style="color: #800000"&gt;"Error saving setting: "&lt;/span&gt;&lt;span&gt; + ex.Message&lt;/span&gt;&lt;br&gt;&lt;span&gt;                   | _ &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; textdata.Text &amp;lt;- &lt;/span&gt;&lt;span style="color: #800000"&gt;"Unable to open file... "&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;// ReadFormData_Click&lt;/span&gt;&lt;br&gt;&lt;span&gt;        createbtn (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Thickness(8.0)) 1 2 &lt;/span&gt;&lt;span style="color: #800000"&gt;"Load Form Data"&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &amp;lt;| (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; evt &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br&gt;&lt;span&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;br&gt;&lt;span&gt;                   &lt;/span&gt;&lt;span style="color: #0000ff"&gt;use&lt;/span&gt;&lt;span&gt; store = IsolatedStorageFile.GetUserStoreForApplication()&lt;/span&gt;&lt;br&gt;&lt;span&gt;                   &lt;/span&gt;&lt;span style="color: #0000ff"&gt;use&lt;/span&gt;&lt;span&gt; file = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; IsolatedStorageFileStream(filepath,FileMode.Open, store)&lt;/span&gt;&lt;br&gt;&lt;span&gt;                   &lt;/span&gt;&lt;span style="color: #0000ff"&gt;use&lt;/span&gt;&lt;span&gt; reader = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; StreamReader(file)&lt;/span&gt;&lt;br&gt;&lt;span&gt;                   &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; storedvalues = reader.ReadToEnd();&lt;/span&gt;&lt;br&gt;&lt;span&gt;                   &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; data = storedvalues.Split([|&lt;/span&gt;&lt;span style="color: #800000"&gt;'|'&lt;/span&gt;&lt;span&gt;|]) &lt;/span&gt;&lt;br&gt;&lt;span&gt;                              |&amp;gt; Array.to_seq |&amp;gt; Seq.take (List.length fields) &lt;/span&gt;&lt;br&gt;&lt;span&gt;                              |&amp;gt; Seq.to_list&lt;/span&gt;&lt;br&gt;&lt;span&gt;                   zip fields data |&amp;gt; iter (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; (tb,data) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; tb.Text &amp;lt;- data)&lt;/span&gt;&lt;br&gt;&lt;span&gt;                   &lt;/span&gt;&lt;span style="color: #008000"&gt;// For checking...&lt;/span&gt;&lt;br&gt;&lt;span&gt;                   textdata.Text &amp;lt;- storedvalues&lt;/span&gt;&lt;br&gt;&lt;span&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;with&lt;/span&gt;&lt;br&gt;&lt;span&gt;                   | :? IsolatedStorageException &lt;/span&gt;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&lt;span&gt; ex &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;  textdata.Text &amp;lt;- &lt;/span&gt;&lt;span style="color: #800000"&gt;"Error saving setting: "&lt;/span&gt;&lt;span&gt; + ex.Message&lt;/span&gt;&lt;br&gt;&lt;span&gt;                   | _ &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; textdata.Text &amp;lt;- &lt;/span&gt;&lt;span style="color: #800000"&gt;"Unable to open file... "&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span&gt;       &lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;// ButtonUpdateSetting - repurposed for diagnostics&lt;/span&gt;&lt;br&gt;&lt;span&gt;        createbtn (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Thickness(4.0,4.0,14.0,4.0)) 3 1 &lt;/span&gt;&lt;span style="color: #800000"&gt;"Update Setting"&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &amp;lt;| (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; evt &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br&gt;&lt;span&gt;               &lt;/span&gt;&lt;span style="color: #0000ff"&gt;use&lt;/span&gt;&lt;span&gt; store = IsolatedStorageFile.GetUserStoreForApplication()&lt;/span&gt;&lt;br&gt;&lt;span&gt;               &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; dirs = store.GetDirectoryNames(&lt;/span&gt;&lt;span style="color: #800000"&gt;"*"&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span&gt;               &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; files = store.GetFileNames(&lt;/span&gt;&lt;span style="color: #800000"&gt;"*"&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span&gt;               &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; dirtext = &lt;/span&gt;&lt;span style="color: #800000"&gt;"Directories = "&lt;/span&gt;&lt;span&gt; + (dirs |&amp;gt; Array.to_list |&amp;gt; map (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; t &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"\n"&lt;/span&gt;&lt;span&gt;+t)  |&amp;gt;fold_left (+) &lt;/span&gt;&lt;span style="color: #800000"&gt;""&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span&gt;               &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; filetext = &lt;/span&gt;&lt;span style="color: #800000"&gt;"Filenames = "&lt;/span&gt;&lt;span&gt; + (files |&amp;gt; Array.to_list |&amp;gt; map (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; t &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;"\n"&lt;/span&gt;&lt;span&gt;+t)  |&amp;gt;fold_left (+) &lt;/span&gt;&lt;span style="color: #800000"&gt;""&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span&gt;               textdata.Text &amp;lt;- dirtext + &lt;/span&gt;&lt;span style="color: #800000"&gt;"\n"&lt;/span&gt;&lt;span&gt; + filetext)&lt;/span&gt;&lt;br&gt;&lt;span&gt;                &lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;&lt;span&gt;.Width &amp;lt;- 400.0&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;&lt;span&gt;.Height &amp;lt;- 300.0&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;base&lt;/span&gt;&lt;span&gt;.Content &amp;lt;- grid&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;// Loaded...&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;br&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span&gt; settings.Keys.Count &amp;lt;&amp;gt; 0 &lt;/span&gt;&lt;span style="color: #0000ff"&gt;then&lt;/span&gt;&lt;br&gt;&lt;span&gt;               textdata.Text &amp;lt;- settings.[setting].ToString()&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;with&lt;/span&gt;&lt;span&gt; _  &lt;/span&gt;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&lt;span&gt; ex &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; textdata.Text &amp;lt;- &lt;/span&gt;&lt;span style="color: #800000"&gt;"Error saving setting: "&lt;/span&gt;&lt;span&gt; + ex.Message&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;end&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;type&lt;/span&gt;&lt;span&gt; MyApp = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;inherit&lt;/span&gt;&lt;span&gt; Application&lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; () &lt;/span&gt;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&lt;span&gt; this = {} &lt;/span&gt;&lt;span style="color: #0000ff"&gt;then&lt;/span&gt;&lt;br&gt;&lt;span&gt;        this.Startup.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; _ &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;  this.RootVisual &amp;lt;- &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; MyPage())&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//base.Exit.Add( fun _ -&amp;gt; ()) //this.Application_Exit)&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//this.InitializeComponent()&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;end&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18281936-5334968427752469654?l=jyliao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jyliao.blogspot.com/feeds/5334968427752469654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18281936&amp;postID=5334968427752469654' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/5334968427752469654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/5334968427752469654'/><link rel='alternate' type='text/html' href='http://jyliao.blogspot.com/2009/02/f-silverlight-2-and-isolated-storage.html' title='F# Silverlight 2 and Isolated Storage'/><author><name>John Liao</name><uri>http://www.blogger.com/profile/04740715435312568366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18281936.post-3697575529487061879</id><published>2009-02-18T17:46:00.000-08:00</published><updated>2009-02-18T17:52:46.942-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Glassfish metro'/><category scheme='http://www.blogger.com/atom/ns#' term='web services'/><category scheme='http://www.blogger.com/atom/ns#' term='f#'/><category scheme='http://www.blogger.com/atom/ns#' term='Apache web server'/><category scheme='http://www.blogger.com/atom/ns#' term='Tomcat'/><title type='text'>Interoperability – F# + Silverlight 2 on Apache + Metro Web Services on Tomcat</title><content type='html'>&lt;p&gt;I bought the books &lt;a href="http://www.amazon.com/gp/product/1933988428?ie=UTF8&amp;amp;tag=techie2biz-20&amp;amp;linkCode=xm2&amp;amp;camp=1789&amp;amp;creativeASIN=1933988428"&gt;Silverlight 2 in Action&lt;/a&gt; and &lt;a href="http://www.amazon.com/gp/product/1590599497?ie=UTF8&amp;amp;tag=techie2biz-20&amp;amp;linkCode=xm2&amp;amp;camp=1789&amp;amp;creativeASIN=1590599497"&gt;Pro Silverlight 2 in C# 2008&lt;/a&gt; for a while now and did not have a chance to work with Silverlight for the past several weeks.&amp;nbsp; However, recently I had to investigate using GlassFish’s &lt;a href="https://metro.dev.java.net"&gt;Metro&lt;/a&gt; library to build web services as it was highly recommended by colleagues.&amp;nbsp; I have previous familiarity with using Apache Axis to build web services as that web services stack had strong plugin support with Eclipse, my IDE of choice when it comes to Java development.&amp;nbsp; I thought this was a great opportunity to build an sample web service using Metro and build the web service client on Silverlight platform.&lt;/p&gt;&lt;p&gt;My sample web service code was intentionally simple and the java code is as follows:&lt;/p&gt;&lt;pre&gt;&lt;span style="color: #7f0055"&gt;package&lt;/span&gt;&lt;span style="color: #000000"&gt; sample.ws.metro;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color: #7f0055"&gt;import&lt;/span&gt;&lt;span style="color: #000000"&gt; javax.jws.WebService;&lt;/span&gt;&lt;br&gt;
&lt;span style="color: #646464"&gt;@WebService&lt;/span&gt;
&lt;span style="color: #7f0055"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #7f0055"&gt;class&lt;/span&gt;&lt;span style="color: #000000"&gt; HelloWorldService {&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;&lt;/span&gt;
    &lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #7f0055"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; String hello(String name)&lt;/span&gt;
    &lt;span style="color: #000000"&gt;{&lt;/span&gt;
        &lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #7f0055"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #2a00ff"&gt;"Hello, "&lt;/span&gt;&lt;span style="color: #000000"&gt; + name; &lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;    }&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;I followed the instructions on the web to create the applicationContext.xml and web.xml file and deployed it to my Tomcat server.&amp;nbsp; However, I had a hard time getting this simple example to work.&amp;nbsp; In the end, I downloaded Netbeans and created the web service solution in that IDE.&amp;nbsp; Netbeans generated the applicationContext.xml and web.xml file for me and it worked like a charm.&amp;nbsp; Once I have those configuration files, I could easily do subsequent changes in Eclipse without any problems.&amp;nbsp; This demonstrated how tool support can make life a lot easier for developers.&amp;nbsp; Once the initial setup is completed, it’s much simpler to build and modify from a working solution.&amp;nbsp; Here are the configuration files for those who might be interested:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;applicationContext.xml:&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;&lt;br&gt;&lt;span style="color: #008080"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;xml&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #7f007f"&gt;version&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #2a00ff"&gt;"1.0"&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #7f007f"&gt;encoding&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #2a00ff"&gt;"UTF-8"&lt;/span&gt;&lt;span style="color: #008080"&gt;?&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #008080"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;beans&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #7f007f"&gt;xmlns&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #2a00ff"&gt;"http://www.springframework.org/schema/beans"&lt;/span&gt;&lt;br&gt;&lt;span&gt;       &lt;/span&gt;&lt;span style="color: #7f007f"&gt;xmlns:xsi&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #2a00ff"&gt;"http://www.w3.org/2001/XMLSchema-instance"&lt;/span&gt;&lt;br&gt;&lt;span&gt;       &lt;/span&gt;&lt;span style="color: #7f007f"&gt;xmlns:p&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #2a00ff"&gt;"http://www.springframework.org/schema/p"&lt;/span&gt;&lt;br&gt;&lt;span&gt;       &lt;/span&gt;&lt;span style="color: #7f007f"&gt;xmlns:aop&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #2a00ff"&gt;"http://www.springframework.org/schema/aop"&lt;/span&gt;&lt;br&gt;&lt;span&gt;       &lt;/span&gt;&lt;span style="color: #7f007f"&gt;xmlns:tx&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #2a00ff"&gt;"http://www.springframework.org/schema/tx"&lt;/span&gt;&lt;br&gt;&lt;span&gt;       &lt;/span&gt;&lt;span style="color: #7f007f"&gt;xmlns:ws&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #2a00ff"&gt;"http://jax-ws.dev.java.net/spring/core"&lt;/span&gt;&lt;br&gt;&lt;span&gt;       &lt;/span&gt;&lt;span style="color: #7f007f"&gt;xmlns:wss&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #2a00ff"&gt;"http://jax-ws.dev.java.net/spring/servlet"&lt;/span&gt;&lt;br&gt;&lt;span&gt;       &lt;/span&gt;&lt;span style="color: #7f007f"&gt;xsi:schemaLocation&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #2a00ff"&gt;"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd&lt;/span&gt;&lt;br&gt;&lt;span style="color: #2a00ff"&gt;       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd&lt;/span&gt;&lt;br&gt;&lt;span style="color: #2a00ff"&gt;       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd&lt;/span&gt;&lt;br&gt;&lt;span style="color: #2a00ff"&gt;       http://jax-ws.dev.java.net/spring/core http://jax-ws.dev.java.net/spring/core.xsd&lt;/span&gt;&lt;br&gt;&lt;span style="color: #2a00ff"&gt;       http://jax-ws.dev.java.net/spring/servlet http://jax-ws.dev.java.net/spring/servlet.xsd"&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;  &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;wss&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;:binding&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #7f007f"&gt;url&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #2a00ff"&gt;"/helloworld"&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;     &lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;wss:&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;service&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;ws&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;:service&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #7f007f"&gt;bean&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #2a00ff"&gt;"#HelloWorldService"&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;           &lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;ref&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #7f007f"&gt;bean&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #2a00ff"&gt;"#HelloWorldService"&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;           &lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;ref&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;ws&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;:service&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;     &lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;wss&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;:service&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;  &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;wss&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;:binding&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;  &lt;/span&gt;&lt;span style="color: #3f5fbf"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #3f5fbf"&gt; this bean implements web service methods --&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;  &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;bean&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #7f007f"&gt;id&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #2a00ff"&gt;"HelloWorldService"&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #7f007f"&gt;class&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #2a00ff"&gt;"sample.ws.metro.HelloWorldService"&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #008080"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #008080"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;beans&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&amp;nbsp;&lt;strong&gt;web.xml:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;br&gt;&lt;span style="color: #008080"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;xml&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #7f007f"&gt;version&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #2a00ff"&gt;"1.0"&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #7f007f"&gt;encoding&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #2a00ff"&gt;"UTF-8"&lt;/span&gt;&lt;span style="color: #008080"&gt;?&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #008080"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;web-app&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #7f007f"&gt;xmlns:xsi&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #2a00ff"&gt;"http://www.w3.org/2001/XMLSchema-instance"&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #7f007f"&gt;xmlns&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #2a00ff"&gt;"http://java.sun.com/xml/ns/javaee"&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #7f007f"&gt;xmlns:web&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #2a00ff"&gt;"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #7f007f"&gt;xsi:schemaLocation&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #2a00ff"&gt;"http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #7f007f"&gt;id&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #2a00ff"&gt;"WebApp_ID"&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color: #7f007f"&gt;version&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #2a00ff"&gt;"2.5"&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;  &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;display-name&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;metropilot&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;display-name&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;  &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;welcome-file-list&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;welcome-file&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;index.html&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;welcome-file&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;welcome-file&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;index.htm&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;welcome-file&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;welcome-file&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;index.jsp&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;welcome-file&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;welcome-file&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;default.html&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;welcome-file&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;welcome-file&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;default.htm&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;welcome-file&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;welcome-file&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;default.jsp&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;welcome-file&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;  &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;welcome-file-list&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;  &lt;/span&gt;&lt;span style="color: #3f5fbf"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #3f5fbf"&gt; this is for Spring --&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;context-param&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;param-name&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;contextConfigLocation&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;param-name&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;param-value&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;/WEB-INF/applicationContext.xml&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;param-value&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;context-param&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;listener&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;listener-class&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;org.springframework.web.context.ContextLoaderListener&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;listener-class&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;listener&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;servlet&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;servlet-name&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;dispatcher&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;servlet-name&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;servlet-class&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;org.springframework.web.servlet.DispatcherServlet&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;servlet-class&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;load-on-startup&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;2&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;load-on-startup&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;servlet&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;servlet-mapping&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;servlet-name&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;dispatcher&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;servlet-name&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;url-pattern&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;*.htm&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;url-pattern&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;servlet-mapping&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;session-config&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;session-timeout&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;            30&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;session-timeout&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;session-config&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;  &lt;/span&gt;&lt;span style="color: #3f5fbf"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #3f5fbf"&gt; these are for JAX-WS --&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;  &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;servlet&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;servlet-name&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;jaxws-servlet&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;servlet-name&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;servlet-class&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;com.sun.xml.ws.transport.http.servlet.WSSpringServlet&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;servlet-class&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;  &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;servlet&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;  &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;servlet-mapping&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;servlet-name&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;jaxws-servlet&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;servlet-name&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;url-pattern&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;/ws&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;url-pattern&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #000000"&gt;  &lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;servlet-mapping&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;br&gt;&lt;span style="color: #008080"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #3f7f7f"&gt;web-app&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Similarly, on the Silverlight side…I needed the tools support in Silverlight on Visual Studio 2008 to help me generate the Service Reference library.&amp;nbsp; I opened up Visual Studio 2008, right-click my Silverlight library project and chose Add Service Reference… and then put in the url of my web service, which in my case was hosted at &lt;a title="http://localhost:8080/metropilot/ws/hello?wsdl" href="http://localhost:8080/metropilot/ws/hello?wsdl"&gt;http://localhost:8080/metropilot/ws/hello?wsdl&lt;/a&gt;.&amp;nbsp; I would then build it as a Silverlight library that I can reference in the F# project.&amp;nbsp; I assume and hope that when Visual Studio 2010 arrives, I can do all of this without leaving the F# environment.&amp;nbsp; Now I can write my F# Silverlight client which asks the user to type in a name that will be sent to the web service and display the returned greeting.&amp;nbsp; The F# client code is as follows:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;#light&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt;&lt;span&gt; SilverLightFSharp&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Controls&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.ServiceModel&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; List&lt;/span&gt;&lt;br&gt;&lt;br&gt;
&lt;span style="color: #008000"&gt;// Data Binding example&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;type&lt;/span&gt;&lt;span&gt; MyPage = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;inherit&lt;/span&gt;&lt;span&gt; UserControl&lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; () &lt;/span&gt;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&lt;span&gt; this = {} &lt;/span&gt;&lt;span style="color: #0000ff"&gt;then&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; sp = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; StackPanel()&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; textblock = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; TextBlock()&lt;/span&gt;&lt;br&gt;&lt;span&gt;        textblock.Text &amp;lt;- &lt;/span&gt;&lt;span style="color: #800000"&gt;"Please enter your name:"&lt;/span&gt;&lt;br&gt;&lt;span&gt;        sp.Children.Add(textblock)&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; textbox = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; TextBox()&lt;/span&gt;&lt;br&gt;&lt;span&gt;        sp.Children.Add(textbox)&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; button = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Button(Content=&lt;/span&gt;&lt;span style="color: #800000"&gt;"Get Greeting..."&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span&gt;        sp.Children.Add(button)&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span&gt;        button.Click.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; binding = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; BasicHttpBinding();&lt;/span&gt;&lt;br&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; endpoint = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; EndpointAddress(&lt;/span&gt;&lt;span style="color: #800000"&gt;"http://localhost:8080/metropilot/ws/hello?wsdl"&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; service = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; ServiceLibrary.MetroPilotService.HelloWorldServiceClient(binding,endpoint)&lt;/span&gt;&lt;br&gt;&lt;span&gt;            service.helloCompleted.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;                    textblock.Text &amp;lt;- e.Result.ToString()&lt;/span&gt;&lt;br&gt;&lt;span&gt;                    service.CloseAsync())&lt;/span&gt;&lt;br&gt;&lt;span&gt;            service.helloAsync(textbox.Text))&lt;/span&gt;&lt;br&gt;&lt;span&gt;                &lt;/span&gt;&lt;br&gt;&lt;span&gt;        this.Width &amp;lt;- 400.0&lt;/span&gt;&lt;br&gt;&lt;span&gt;        this.Height &amp;lt;- 300.0&lt;/span&gt;&lt;br&gt;&lt;span&gt;        this.Content &amp;lt;- sp&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;end&lt;/span&gt;&lt;br&gt;&lt;br&gt;
&lt;span style="color: #0000ff"&gt;type&lt;/span&gt;&lt;span&gt; MyApp = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;inherit&lt;/span&gt;&lt;span&gt; Application&lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; () &lt;/span&gt;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&lt;span&gt; this = {} &lt;/span&gt;&lt;span style="color: #0000ff"&gt;then&lt;/span&gt;&lt;br&gt;&lt;span&gt;        this.Startup.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; _ &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;  this.RootVisual &amp;lt;- &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; MyPage())&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//base.Exit.Add( fun _ -&amp;gt; ()) //this.Application_Exit)&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;//this.InitializeComponent()&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;end&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/pre&gt;&lt;p&gt;My application.xap file has the following files:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;AppManifest.xaml&lt;/li&gt;&lt;li&gt;FSharp.Core.dll&lt;/li&gt;&lt;li&gt;ServiceLibrary.dll – this was the library generated using Visual Studio 2008 via Add Reference… &lt;/li&gt;&lt;li&gt;SilverlightFSharp.dll – the compiled client code&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Since I’m running this Silverlight client on an Apache web server that’s running on port 8000 and my web services was running on a Tomcat server on port 8080, I had to create the clientaccesspolicy.xml and crossdomain.xml file and put it in the root folder of the Tomcat server or the Silverlight client would refuse to access the web service on my Tomcat server.&amp;nbsp; &lt;/p&gt;&lt;p&gt;My clientaccesspolicy.xml is as follows:&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #a31515"&gt;xml&lt;/span&gt;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;version&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;1.0&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;encoding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;utf-8&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;?&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;access-policy&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;cross-domain-access&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;policy&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;allow-from&lt;/span&gt;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;http-request-headers&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;*&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;domain&lt;/span&gt;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;uri&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;*&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;      &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;allow-from&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;grant-to&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;resource&lt;/span&gt;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;path&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;include-subpaths&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;      &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;grant-to&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;policy&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;  &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;cross-domain-access&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;access-policy&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;p&gt;My crossdomain.xml file is as follows:&lt;/p&gt;&lt;pre&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #a31515"&gt;xml&lt;/span&gt;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;version&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;1.0&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;?&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color: #a31515"&gt;DOCTYPE&lt;/span&gt;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;cross-domain-policy&lt;/span&gt;&lt;span style="color: #0000ff"&gt; SYSTEM &lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;cross-domain-policy&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;allow-http-request-headers-from&lt;/span&gt;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;domain&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;*&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;headers&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;*&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;cross-domain-policy&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Finally, after all these configurations, I got my F# Silverlight 2 client code running on Apache web server talking to my Java based web services running on Tomcat.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18281936-3697575529487061879?l=jyliao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jyliao.blogspot.com/feeds/3697575529487061879/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18281936&amp;postID=3697575529487061879' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/3697575529487061879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/3697575529487061879'/><link rel='alternate' type='text/html' href='http://jyliao.blogspot.com/2009/02/interoperability-f-silverlight-2-on.html' title='Interoperability – F# + Silverlight 2 on Apache + Metro Web Services on Tomcat'/><author><name>John Liao</name><uri>http://www.blogger.com/profile/04740715435312568366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18281936.post-7479918926986190283</id><published>2009-01-08T17:20:00.000-08:00</published><updated>2009-01-08T17:22:41.879-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='Apache web server'/><title type='text'>Hosting Silverlight Applications on Apache Web Server</title><content type='html'>&lt;p&gt;My previous posting prompted a reader to ask me why I'm hosting my Silverlight application on IIS on Windows Server 2008.  I did not have a good answer for that.  I simply chose Windows Server 2008 because I wanted to install Windows 2008 Server and play around in that environment.  In retrospect, it was a good first choice as it allowed to build and deploy Silverlight application with the least amount of fuss and configuration.  That success encourage me to explore building Silverlight application further.&lt;/p&gt;&lt;p&gt;However, recently I've been investigating this hosting issue more and fortuitously discover &lt;a href="http://www.cjcraft.com/Blog/2007/05/08/HowToConfigureIIS50AndIIS60ToDeploySilverlightApplications.aspx"&gt;Chris Craft's blog entry&lt;/a&gt; on hosting Silverlight application.  All I needed was to register additional mime types!  I immediately went and added the following mime types to my Apache Web Server:&lt;/p&gt;&lt;p&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;manifest&lt;/td&gt;&lt;td&gt;application/manifest&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;.xaml&lt;/td&gt;&lt;td&gt;application/xaml+xml&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;.dll&lt;/td&gt;&lt;td&gt;application/x-msdownload&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;.application&lt;/td&gt;&lt;td&gt;application/x-ms-application&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;.xbap&lt;/td&gt;&lt;td&gt;application/x-ms-xbap&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;.deploy&lt;/td&gt;&lt;td&gt;application/octet-stream&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;
&lt;p&gt;Now I can run my Silverlight application from an Apache web server!  It wasn't until now that I realize that the Silverlight application runs entirely on the client.  That means that I no longer need to develop the middle tier with .NET technology and can easily have my Silverlight application interact with a Java middle tier.  For work environments that mandate Java middle tier, I can now promote Silverlight as a presentation tier solution.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18281936-7479918926986190283?l=jyliao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jyliao.blogspot.com/feeds/7479918926986190283/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18281936&amp;postID=7479918926986190283' title='22 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/7479918926986190283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/7479918926986190283'/><link rel='alternate' type='text/html' href='http://jyliao.blogspot.com/2009/01/hosting-silverlight-applications-on.html' title='Hosting Silverlight Applications on Apache Web Server'/><author><name>John Liao</name><uri>http://www.blogger.com/profile/04740715435312568366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>22</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18281936.post-6046150356504381571</id><published>2008-12-23T16:35:00.000-08:00</published><updated>2008-12-23T16:47:52.456-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='f#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><title type='text'>Simple Video Hosting with F# and Silverlight 2</title><content type='html'>&lt;p&gt;I use to hate household maintenance projects such as replacing a leaky faucet or fixing a clogged water pipe.&amp;nbsp; I typically get frustrated because I would run into problems disassembling the plumbing components or find out that I don’t have the right tools to reassemble the plumbing components.&amp;nbsp; Lately, however, I have had much more success with my household plumbing projects.&amp;nbsp; When my kitchen faucet broke, I had a relatively painless experience in replacing the hardware.&amp;nbsp; I attribute this painless experience to the fact that I followed a video tutorial instead of printed material and come to appreciate the power and benefits of a video tutorial.&lt;/p&gt;&lt;p&gt;And similarly, I find myself looking for videos tutorials when it comes learning about complex technologies.&amp;nbsp; Lately, I have looked at SharePoint video tutorials and found them immensely helpful.&amp;nbsp; This got me interested in how finding out easy it is to host video content in Silverlight 2.&amp;nbsp; The answer is that it’s extremely easy and here’s a simple F# implementation of a video player in Silverlight 2.&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;#light&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt;&lt;span&gt; SilverLightFSharp&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Controls&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Controls.Primitives&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Data&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; System.Windows.Media&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;open&lt;/span&gt;&lt;span&gt; List&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color: #008000"&gt;// Simple &lt;/span&gt;&lt;span style="color: #008000"&gt;Video Player Example&lt;/span&gt;&lt;span style="color: #008000"&gt; in Silverlight 2 with F#&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;type&lt;/span&gt;&lt;span&gt; MyPage = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;inherit&lt;/span&gt;&lt;span&gt; UserControl&lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; () &lt;/span&gt;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&lt;span&gt; this = {} &lt;/span&gt;&lt;span style="color: #0000ff"&gt;then&lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;/span&gt;&lt;br&gt;&lt;span&gt;        this.Width &amp;lt;- 400.0&lt;/span&gt;&lt;br&gt;&lt;span&gt;        this.Height &amp;lt;- 400.0&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; textbox = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; TextBox(TextAlignment =TextAlignment.Center,&lt;/span&gt;&lt;br&gt;&lt;span&gt;                                  VerticalAlignment=VerticalAlignment.Top,&lt;/span&gt;&lt;br&gt;&lt;span&gt;                                  Text=&lt;/span&gt;&lt;span style="color: #800000"&gt;"Silverlight Video Example"&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span&gt;                               &lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; media = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; MediaElement(VerticalAlignment=VerticalAlignment.Center,&lt;/span&gt;&lt;br&gt;&lt;span&gt;                                     HorizontalAlignment=HorizontalAlignment.Center,&lt;/span&gt;&lt;br&gt;&lt;span&gt;                                     Width=400.0,Height=300.0)&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span&gt;           &lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; playButton = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Button(Content=&lt;/span&gt;&lt;span style="color: #800000"&gt;"Play"&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; pauseButton = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Button(Content=&lt;/span&gt;&lt;span style="color: #800000"&gt;"Pause"&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; stopButton = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Button(Content=&lt;/span&gt;&lt;span style="color: #800000"&gt;"Stop"&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span&gt;        playButton.Click.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; _ &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; media.Play())&lt;/span&gt;&lt;br&gt;&lt;span&gt;        pauseButton.Click.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; _ &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; media.Pause())&lt;/span&gt;&lt;br&gt;&lt;span&gt;        stopButton.Click.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; _ &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt; media.Stop())&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; createGrid numrows numcols = &lt;/span&gt;&lt;br&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; grid = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Grid()&lt;/span&gt;&lt;br&gt;&lt;span&gt;            [1..numrows] |&amp;gt; iter (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; _ &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;               &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; RowDefinition(Height=GridLength.Auto) |&amp;gt; grid.RowDefinitions.Add)&lt;/span&gt;&lt;br&gt;&lt;span&gt;            [1..numcols] |&amp;gt; iter (&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; _ &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;               &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; ColumnDefinition(Width=GridLength.Auto) |&amp;gt; grid.ColumnDefinitions.Add)&lt;/span&gt;&lt;br&gt;&lt;span&gt;            grid&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; addTo (grid:Grid) item row column =&lt;/span&gt;&lt;br&gt;&lt;span&gt;            grid.Children.Add(item) &lt;/span&gt;&lt;br&gt;&lt;span&gt;            Grid.SetRow(item,row)&lt;/span&gt;&lt;br&gt;&lt;span&gt;            Grid.SetColumn(item,column)&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; grid = createGrid 1 3&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;br&gt;&lt;span&gt;        addTo grid playButton 0 0&lt;/span&gt;&lt;br&gt;&lt;span&gt;        addTo grid pauseButton 0 1&lt;/span&gt;&lt;br&gt;&lt;span&gt;        addTo grid stopButton 0 2&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;br&gt;&lt;span&gt;        media.Source &amp;lt;- &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; Uri(&lt;/span&gt;&lt;span style="color: #800000"&gt;"test.wmv"&lt;/span&gt;&lt;span&gt;,UriKind.Relative)&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;br&gt;&lt;span&gt;        media.DownloadProgressChanged.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; e &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; percentage = media.DownloadProgress*100.0&lt;/span&gt;&lt;br&gt;&lt;span&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; status = (Printf.sprintf &lt;/span&gt;&lt;span style="color: #800000"&gt;"%3.2f percent done"&lt;/span&gt;&lt;span&gt; percentage)&lt;/span&gt;&lt;br&gt;&lt;span&gt;            textbox.Text &amp;lt;-status)&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;let&lt;/span&gt;&lt;span&gt; stack = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; StackPanel(Background=&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; SolidColorBrush(Colors.White))&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span&gt;        textbox |&amp;gt; stack.Children.Add     &lt;/span&gt;&lt;br&gt;&lt;span&gt;        media |&amp;gt; stack.Children.Add &lt;/span&gt;&lt;br&gt;&lt;span&gt;        grid |&amp;gt; stack.Children.Add&lt;/span&gt;&lt;br&gt;&lt;span&gt;        &lt;/span&gt;&lt;br&gt;&lt;span&gt;        this.Content &amp;lt;- stack                  &lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;end&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;type&lt;/span&gt;&lt;span&gt; MyApp = &lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;inherit&lt;/span&gt;&lt;span&gt; Application&lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;/span&gt;&lt;br&gt;&lt;span&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; () &lt;/span&gt;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&lt;span&gt; this = {} &lt;/span&gt;&lt;span style="color: #0000ff"&gt;then&lt;/span&gt;&lt;br&gt;&lt;span&gt;        this.Startup.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;fun&lt;/span&gt;&lt;span&gt; _ &lt;/span&gt;&lt;span style="color: #0000ff"&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;  this.RootVisual &amp;lt;- &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span&gt; MyPage())&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;end&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;br&gt;&lt;/pre&gt;
&lt;p&gt;In order to get this to work, I had to add system.dll and System.Core.dll to the .xap file. Make sure you grab these dll files from the Silverlight 2 SDK and not from the .Net Framework.&lt;/p&gt;&lt;p&gt;I had a request to post the .xap file and here are they are. The zip files contain both the source file along with the .xap and testpage.html file that is deployed on the server.&amp;nbsp; The deployment items are in the webdeploy folder of the zip file. The file simplebutton.zip is the source and deployment content for the previous post the file simplevideo.zip is the source and deployment content for this post.&lt;/p&gt;&lt;p&gt;&lt;a href="http://cid-75f9e5e23058a802.skydrive.live.com/self.aspx/Public/simplebutton.zip"&gt;simplebutton.zip&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://cid-75f9e5e23058a802.skydrive.live.com/self.aspx/Public/simplevideo.zip"&gt;simplevideo.zip&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18281936-6046150356504381571?l=jyliao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jyliao.blogspot.com/feeds/6046150356504381571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18281936&amp;postID=6046150356504381571' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/6046150356504381571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/6046150356504381571'/><link rel='alternate' type='text/html' href='http://jyliao.blogspot.com/2008/12/simple-video-hosting-with-f-and.html' title='Simple Video Hosting with F# and Silverlight 2'/><author><name>John Liao</name><uri>http://www.blogger.com/profile/04740715435312568366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18281936.post-8379930640610275296</id><published>2008-11-20T15:06:00.000-08:00</published><updated>2008-11-20T15:27:03.668-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Presentation Foundation'/><category scheme='http://www.blogger.com/atom/ns#' term='f#'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Virtual PC'/><title type='text'>F# and Silverlight 2.0</title><content type='html'>&lt;p&gt;One of the appeal of learning WPF is that now I can leverage what I learned in WPF and apply them to building web applications via Silverlight 2.0.  This blog talks about setting up a very simple Silverlight 2.0 web application with F#. &lt;/p&gt;&lt;p&gt;Since my laptop is running Windows XP, I needed to build an environment with which I can host my Silverlight application.  I decided to build a Virtual PC environment running Windows Server 2008.  I'm using F# version 1.9.6.2 to build this sample Silverlight application.&lt;/p&gt;&lt;p&gt;Below is the simple Silverlight application with only a single clickable button:&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;#light&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;namespace&lt;/span&gt;&lt;span style="color:#;"&gt; SilverLightFSharp&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; System&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; System.Windows&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; System.Windows.Controls&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;type&lt;/span&gt;&lt;span style="color:#;"&gt; MyPage = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;inherit&lt;/span&gt;&lt;span style="color:#;"&gt; UserControl&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; () &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;as&lt;/span&gt;&lt;span style="color:#;"&gt; this = {} &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;then&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;// Add button and do something with it...&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; btn = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; Button(HorizontalAlignment = HorizontalAlignment.Center,&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                             VerticalAlignment = VerticalAlignment.Center)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        btn.Content &amp;lt;- &lt;/span&gt;&lt;span style="color:#800000;"&gt;"Click me"&lt;/span&gt;&lt;span style="color:#;"&gt;                             &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        btn.Click.Add(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;fun&lt;/span&gt;&lt;span style="color:#;"&gt; _ &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                      btn.Content &amp;lt;- &lt;/span&gt;&lt;span style="color:#800000;"&gt;"The button has been clicked!"&lt;/span&gt;&lt;span style="color:#;"&gt;)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        this.Content &amp;lt;- btn&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;end&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;type&lt;/span&gt;&lt;span style="color:#;"&gt; MyApp = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;inherit&lt;/span&gt;&lt;span style="color:#;"&gt; Application&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; () &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;as&lt;/span&gt;&lt;span style="color:#;"&gt; this = {} &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;then&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        this.Startup.Add(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;fun&lt;/span&gt;&lt;span style="color:#;"&gt; _ &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#;"&gt;  this.RootVisual &amp;lt;- &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; MyPage())&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//base.Exit.Add( fun _ -&amp;gt; ()) //this.Application_Exit)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//this.InitializeComponent()&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;end&lt;/span&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;
&lt;br&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;I also needed some scaffolding in order to get this Silverlight application to run.  One of the scaffolding pieces I need is the &lt;b&gt;AppManifest.xaml&lt;/b&gt; file.  Below is the content of that &lt;b&gt;AppManifest.xml&lt;/b&gt; file with the EntryPointAssembly and EntryPointType attributes set to my F# code.&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Deployment&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; xmlns&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="http://schemas.microsoft.com/client/2007/deployment"&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;           &lt;/span&gt;&lt;span style="color:#FF0000;"&gt; xmlns&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;:&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;x&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;           &lt;/span&gt;&lt;span style="color:#FF0000;"&gt; EntryPointAssembly&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="SilverLightFSharp"&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;           &lt;/span&gt;&lt;span style="color:#FF0000;"&gt; EntryPointType&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="SilverLightFSharp.MyApp"&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; RuntimeVersion&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="2.0.31005.0"&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#A31515;"&gt;  &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Deployment.Parts&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#A31515;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;AssemblyPart&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; x&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;:&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="SilverLightFSharp"&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Source&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="SilverLightFSharp.dll" /&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#A31515;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;AssemblyPart&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; x&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;:&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="FSharp.Core"&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Source&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="FSharp.Core.dll" /&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#A31515;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;AssemblyPart&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; x&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;:&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="System.Windows.Controls"&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Source&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="System.Windows.Controls.dll" /&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#A31515;"&gt;  &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Deployment.Parts&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;Deployment&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;I'll also need a test html page to host my silverlight application.  I created a &lt;b&gt;TestPage.html&lt;/b&gt; to host my Silverlight application.  Please note that for the Silverlight control host has the source referencing the file &lt;b&gt;simplebutton.xap&lt;/b&gt;.  Not to worry, &lt;b&gt;simplebutton.xap&lt;/b&gt; is merely a zip file that contains the following files:&lt;br/&gt;&lt;ul&gt;&lt;li&gt;AppManifest.xaml&lt;/li&gt;&lt;li&gt;FSharp.Core.dll&lt;/li&gt;&lt;li&gt;System.Windows.Control.dll&lt;/li&gt;&lt;li&gt;SilverlightFsharp.dll&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;p&gt;Here's the &lt;b&gt;TestPage.html&lt;/b&gt; code:&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color:#A31515;"&gt;DOCTYPE&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;html&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;PUBLIC&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;"-//W3C//DTD XHTML 1.0 Transitional//EN"&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;html&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;xmlns&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="http://www.w3.org/1999/xhtml"&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#008000;"&gt;&amp;lt;!-- saved from url=(0014)about:internet --&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;head&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;title&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#;"&gt;SilverlightFSharp&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;title&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;style&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="text/css"&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#A31515;"&gt;html&lt;/span&gt;&lt;span style="color:#;"&gt;, &lt;/span&gt;&lt;span style="color:#A31515;"&gt;body&lt;/span&gt;&lt;span style="color:#;"&gt; {&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;height&lt;/span&gt;&lt;span style="color:#;"&gt;: &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;100%&lt;/span&gt;&lt;span style="color:#;"&gt;;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;overflow&lt;/span&gt;&lt;span style="color:#;"&gt;: &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;auto&lt;/span&gt;&lt;span style="color:#;"&gt;;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    }&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#A31515;"&gt;body&lt;/span&gt;&lt;span style="color:#;"&gt; {&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;padding&lt;/span&gt;&lt;span style="color:#;"&gt;: &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;0&lt;/span&gt;&lt;span style="color:#;"&gt;;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;margin&lt;/span&gt;&lt;span style="color:#;"&gt;: &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;0&lt;/span&gt;&lt;span style="color:#;"&gt;;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    }&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#A31515;"&gt;#silverlightControlHost&lt;/span&gt;&lt;span style="color:#;"&gt; {&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;height&lt;/span&gt;&lt;span style="color:#;"&gt;: &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;100%&lt;/span&gt;&lt;span style="color:#;"&gt;;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    }&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;style&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;script&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="text/javascript"&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;function&lt;/span&gt;&lt;span style="color:#;"&gt; onSilverlightError(sender, args) {&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;var&lt;/span&gt;&lt;span style="color:#;"&gt; appSource = &lt;/span&gt;&lt;span style="color:#A31515;"&gt;""&lt;/span&gt;&lt;span style="color:#;"&gt;;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#;"&gt; (sender != &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#;"&gt; &amp;amp;&amp;amp; sender != 0) {&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                appSource = sender.getHost().Source;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            } &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;var&lt;/span&gt;&lt;span style="color:#;"&gt; errorType = args.ErrorType;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;var&lt;/span&gt;&lt;span style="color:#;"&gt; iErrorCode = args.ErrorCode;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;var&lt;/span&gt;&lt;span style="color:#;"&gt; errMsg = &lt;/span&gt;&lt;span style="color:#A31515;"&gt;"Unhandled Error in Silverlight 2 Application "&lt;/span&gt;&lt;span style="color:#;"&gt; +  appSource + &lt;/span&gt;&lt;span style="color:#A31515;"&gt;"\n"&lt;/span&gt;&lt;span style="color:#;"&gt; ;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            errMsg += &lt;/span&gt;&lt;span style="color:#A31515;"&gt;"Code: "&lt;/span&gt;&lt;span style="color:#;"&gt;+ iErrorCode + &lt;/span&gt;&lt;span style="color:#A31515;"&gt;"    \n"&lt;/span&gt;&lt;span style="color:#;"&gt;;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            errMsg += &lt;/span&gt;&lt;span style="color:#A31515;"&gt;"Category: "&lt;/span&gt;&lt;span style="color:#;"&gt; + errorType + &lt;/span&gt;&lt;span style="color:#A31515;"&gt;"       \n"&lt;/span&gt;&lt;span style="color:#;"&gt;;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            errMsg += &lt;/span&gt;&lt;span style="color:#A31515;"&gt;"Message: "&lt;/span&gt;&lt;span style="color:#;"&gt; + args.ErrorMessage + &lt;/span&gt;&lt;span style="color:#A31515;"&gt;"     \n"&lt;/span&gt;&lt;span style="color:#;"&gt;;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#;"&gt; (errorType == &lt;/span&gt;&lt;span style="color:#A31515;"&gt;"ParserError"&lt;/span&gt;&lt;span style="color:#;"&gt;)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            {&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                errMsg += &lt;/span&gt;&lt;span style="color:#A31515;"&gt;"File: "&lt;/span&gt;&lt;span style="color:#;"&gt; + args.xamlFile + &lt;/span&gt;&lt;span style="color:#A31515;"&gt;"     \n"&lt;/span&gt;&lt;span style="color:#;"&gt;;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                errMsg += &lt;/span&gt;&lt;span style="color:#A31515;"&gt;"Line: "&lt;/span&gt;&lt;span style="color:#;"&gt; + args.lineNumber + &lt;/span&gt;&lt;span style="color:#A31515;"&gt;"     \n"&lt;/span&gt;&lt;span style="color:#;"&gt;;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                errMsg += &lt;/span&gt;&lt;span style="color:#A31515;"&gt;"Position: "&lt;/span&gt;&lt;span style="color:#;"&gt; + args.charPosition + &lt;/span&gt;&lt;span style="color:#A31515;"&gt;"     \n"&lt;/span&gt;&lt;span style="color:#;"&gt;;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            }&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;else&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#;"&gt; (errorType == &lt;/span&gt;&lt;span style="color:#A31515;"&gt;"RuntimeError"&lt;/span&gt;&lt;span style="color:#;"&gt;)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            {           &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#;"&gt; (args.lineNumber != 0)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                {&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                    errMsg += &lt;/span&gt;&lt;span style="color:#A31515;"&gt;"Line: "&lt;/span&gt;&lt;span style="color:#;"&gt; + args.lineNumber + &lt;/span&gt;&lt;span style="color:#A31515;"&gt;"     \n"&lt;/span&gt;&lt;span style="color:#;"&gt;;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                    errMsg += &lt;/span&gt;&lt;span style="color:#A31515;"&gt;"Position: "&lt;/span&gt;&lt;span style="color:#;"&gt; +  args.charPosition + &lt;/span&gt;&lt;span style="color:#A31515;"&gt;"     \n"&lt;/span&gt;&lt;span style="color:#;"&gt;;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                }&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                errMsg += &lt;/span&gt;&lt;span style="color:#A31515;"&gt;"MethodName: "&lt;/span&gt;&lt;span style="color:#;"&gt; + args.methodName + &lt;/span&gt;&lt;span style="color:#A31515;"&gt;"     \n"&lt;/span&gt;&lt;span style="color:#;"&gt;;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            }&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;throw&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; Error(errMsg);&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        }&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;script&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;head&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;body&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;&amp;lt;!-- Runtime errors from Silverlight will be displayed here.&lt;/span&gt;&lt;br&gt;&lt;span style="color:#008000;"&gt;This will contain debugging information and should be removed or hidden when debugging is completed --&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;div&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;id&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;='errorLocation'&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;style&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;font-size&lt;/span&gt;&lt;span style="color:#;"&gt;: &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;small&lt;/span&gt;&lt;span style="color:#;"&gt;;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;color&lt;/span&gt;&lt;span style="color:#;"&gt;: &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Gray&lt;/span&gt;&lt;span style="color:#;"&gt;;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;div&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;div&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;id&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="silverlightControlHost"&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;&lt;/span&gt;&lt;span style="color:#;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;object&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;data&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="data:application/x-silverlight,"&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="application/x-silverlight-2"&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;width&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="100%"&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;height&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="100%"&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;&lt;/span&gt;&lt;span style="color:#;"&gt;&lt;/span&gt;&lt;span style="color:#;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;param&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="source"&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;value&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="simplebutton.xap"/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;&lt;/span&gt;&lt;span style="color:#;"&gt;&lt;/span&gt;&lt;span style="color:#;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;param&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="onerror"&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;value&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="onSilverlightError"&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;&lt;/span&gt;&lt;span style="color:#;"&gt;&lt;/span&gt;&lt;span style="color:#;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;param&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="background"&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;value&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="white"&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;&lt;/span&gt;&lt;span style="color:#;"&gt;&lt;/span&gt;&lt;span style="color:#;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;param&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="minRuntimeVersion"&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;value&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="2.0.31005.0"&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;&lt;/span&gt;&lt;span style="color:#;"&gt;&lt;/span&gt;&lt;span style="color:#;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;param&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="autoUpgrade"&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;value&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="true"&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;&lt;/span&gt;&lt;span style="color:#;"&gt;&lt;/span&gt;&lt;span style="color:#;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;a&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;href&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="http://go.microsoft.com/fwlink/?LinkID=124807"&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;style&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;text-decoration&lt;/span&gt;&lt;span style="color:#;"&gt;: &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;none&lt;/span&gt;&lt;span style="color:#;"&gt;;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;"&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;     &lt;/span&gt;&lt;span style="color:#;"&gt;&lt;/span&gt;&lt;span style="color:#;"&gt;&lt;/span&gt;&lt;span style="color:#;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;img&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;src&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="http://go.microsoft.com/fwlink/?LinkId=108181"&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;alt&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="Get Microsoft Silverlight"&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;style&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;="&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;border-style&lt;/span&gt;&lt;span style="color:#;"&gt;: &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;none"/&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;&lt;/span&gt;&lt;span style="color:#;"&gt;&lt;/span&gt;&lt;span style="color:#;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;a&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;&lt;/span&gt;&lt;span style="color:#;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;object&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;&lt;/span&gt;&lt;span style="color:#;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#A31515;"&gt;iframe&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;style&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;='&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;visibility&lt;/span&gt;&lt;span style="color:#;"&gt;:&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;hidden&lt;/span&gt;&lt;span style="color:#;"&gt;;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;height&lt;/span&gt;&lt;span style="color:#;"&gt;:&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;0&lt;/span&gt;&lt;span style="color:#;"&gt;;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;width&lt;/span&gt;&lt;span style="color:#;"&gt;:&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;0&lt;/span&gt;&lt;span style="color:#;"&gt;;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;border&lt;/span&gt;&lt;span style="color:#;"&gt;:&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;0px'&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;iframe&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;div&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;body&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#A31515;"&gt;html&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;
&lt;/p&gt;&lt;p&gt;After I copy &lt;b&gt;simplebutton.xap&lt;/b&gt; and &lt;b&gt;TestPage.html&lt;/b&gt; to my IIS webserver, I am rewarded with the following results:&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_tmuJUwQ_atM/SSXt3VmFxsI/AAAAAAAAAHs/-pbQB0ugdvo/s1600-h/silverlightbtn1.jpg"&gt;&lt;img style="float:left; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px; height: 283px;" src="http://2.bp.blogspot.com/_tmuJUwQ_atM/SSXt3VmFxsI/AAAAAAAAAHs/-pbQB0ugdvo/s320/silverlightbtn1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5270880473852528322" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_tmuJUwQ_atM/SSXt3tE72DI/AAAAAAAAAH0/f-ZoNjzfqjM/s1600-h/silverlightbtn2.jpg"&gt;&lt;img style="float:left; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px; height: 283px;" src="http://1.bp.blogspot.com/_tmuJUwQ_atM/SSXt3tE72DI/AAAAAAAAAH0/f-ZoNjzfqjM/s320/silverlightbtn2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5270880480155916338" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18281936-8379930640610275296?l=jyliao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jyliao.blogspot.com/feeds/8379930640610275296/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18281936&amp;postID=8379930640610275296' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/8379930640610275296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/8379930640610275296'/><link rel='alternate' type='text/html' href='http://jyliao.blogspot.com/2008/11/f-and-silverlight-20.html' title='F# and Silverlight 2.0'/><author><name>John Liao</name><uri>http://www.blogger.com/profile/04740715435312568366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_tmuJUwQ_atM/SSXt3VmFxsI/AAAAAAAAAHs/-pbQB0ugdvo/s72-c/silverlightbtn1.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18281936.post-1421999173873250928</id><published>2008-10-28T17:37:00.000-07:00</published><updated>2008-10-28T17:39:57.846-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='f#'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><title type='text'>Create SharePoint BDC connector for AdventureWorks database with F# Script</title><content type='html'>&lt;p&gt;I have been exploring how to create Business Data Catalog in the SharePoint environment.  It seems the best way to create BDC application definition file is via a tool called &lt;a href="http://www.lightningtools.com/bdc-meta-man/default.aspx"&gt;BDC Meta Man&lt;/a&gt;, which provides a graphical environment to create the definition file.  For my own understanding, I tried to script the creation of the BDC application definition file.  In the F# script below, I created the BDC to the HR data in the sample AdventureWorks SQL Server database.  This script loosely follows Chapter 4 of Patrick Tisseghem's book &lt;a href="http://www.amazon.com/gp/product/0735623686?ie=UTF8&amp;tag=techie2biz-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0735623686"&gt;Inside Microsoft  Office SharePoint  Server 2007&lt;/a&gt;.&lt;/p&gt;&lt;hr/&gt;&lt;p&gt;&lt;pre&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;#light&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;#I&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;@"C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\ISAPI"&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;#r&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;@"Microsoft.SharePoint.dll"&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;#r&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;@"Microsoft.SharePoint.Portal.dll"&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;#r&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;@"Microsoft.Office.Server.dll"&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; Microsoft.Office.Server.ApplicationRegistry.Administration&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; Microsoft.Office.Server.ApplicationRegistry.Infrastructure&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; Microsoft.Office.Server.ApplicationRegistry.SystemSpecific.Db&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; List&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; System.Data&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#;"&gt;SqlSessionProvider.Instance().SetSharedResourceProviderToUse(&lt;/span&gt;&lt;span style="color:#800000;"&gt;"&lt;/span&gt;&lt;span style="color:#800000;"&gt;SharedServices1&lt;/span&gt;&lt;span style="color:#800000;"&gt;"&lt;/span&gt;&lt;span style="color:#;"&gt;)&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#008000;"&gt;// Create LOB System&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; lobsystem = &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;   (&lt;/span&gt;&lt;span style="color:#800000;"&gt;"Adventure Works Human Resources Data"&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#800000;"&gt;"Microsoft.Office.Server.ApplicationRegistry.SystemSpecific.Db.DbSystemUtility"&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#800000;"&gt;"Microsoft.Office.Server.ApplicationRegistry.SystemSpecific.Db.DbConnectionManager"&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#800000;"&gt;"Microsoft.Office.Server.ApplicationRegistry.SystemSpecific.Db.DbEntityInstance"&lt;/span&gt;&lt;span style="color:#;"&gt;) &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;   |&amp;gt; ApplicationRegistry.Instance.LobSystems.Create&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#008000;"&gt;// Add property defining the character % will be replacing the * wildcar entered by users&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;(&lt;/span&gt;&lt;span style="color:#800000;"&gt;"WildcardCharacter"&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;span style="color:#800000;"&gt;"%"&lt;/span&gt;&lt;span style="color:#;"&gt;) |&amp;gt; lobsystem.Properties.Add&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;lobsystem.Update()&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#008000;"&gt;// Create LOB System instance&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; sysInstance = lobsystem.LobSystemInstances.Create(&lt;/span&gt;&lt;span style="color:#800000;"&gt;"HR data"&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#;"&gt;)&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#;"&gt;(&lt;/span&gt;&lt;span style="color:#800000;"&gt;"AuthenticationMode"&lt;/span&gt;&lt;span style="color:#;"&gt;,DbAuthenticationMode.RevertToSelf) |&amp;gt; sysInstance.Properties.Add &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;(&lt;/span&gt;&lt;span style="color:#800000;"&gt;"DatabaseAccessProvider"&lt;/span&gt;&lt;span style="color:#;"&gt;, DbAccessProvider.SqlServer) |&amp;gt; sysInstance.Properties.Add &lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#;"&gt;[(&lt;/span&gt;&lt;span style="color:#800000;"&gt;"RdbConnection Data Source"&lt;/span&gt;&lt;span style="color:#;"&gt;, &lt;/span&gt;&lt;span style="color:#800000;"&gt;"&lt;/span&gt;&lt;span style="color:#800000;"&gt;MOSS"&lt;/span&gt;&lt;span style="color:#;"&gt;);&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt; (&lt;/span&gt;&lt;span style="color:#800000;"&gt;"RdbConnection Initial Catalog"&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;span style="color:#800000;"&gt;"AdventureWorks"&lt;/span&gt;&lt;span style="color:#;"&gt;);&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt; (&lt;/span&gt;&lt;span style="color:#800000;"&gt;"RdbConnection Integrated Security"&lt;/span&gt;&lt;span style="color:#;"&gt;, &lt;/span&gt;&lt;span style="color:#800000;"&gt;"SSPI"&lt;/span&gt;&lt;span style="color:#;"&gt;)]&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;|&amp;gt; iter (&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;fun&lt;/span&gt;&lt;span style="color:#;"&gt; (k,v) &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#;"&gt; sysInstance.Properties.Add (k,v)) &lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#;"&gt;sysInstance.Update()&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#008000;"&gt;// Create Employee Entity&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; entity = lobsystem.Entities.Create(&lt;/span&gt;&lt;span style="color:#800000;"&gt;"Employee"&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#;"&gt;)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; identifier = entity.Identifiers.Create(&lt;/span&gt;&lt;span style="color:#800000;"&gt;"[EmployeeID]"&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;span style="color:#800000;"&gt;"System.Int32"&lt;/span&gt;&lt;span style="color:#;"&gt;)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; mthd = entity.Methods.Create(&lt;/span&gt;&lt;span style="color:#800000;"&gt;"GetEmployees"&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#;"&gt;)&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#;"&gt;(&lt;/span&gt;&lt;span style="color:#800000;"&gt;"RdbCommandText"&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;@"Select [EmployeeID],[Title],[FirstName],[MiddleName],[LastName],[Suffix],[JobTitle],[Phone],[EmailAddress],[EmailPromotion],[AddressLine1],[AddressLine2],[City],[StateProvinceName],[PostalCode],[CountryRegionName],[AdditionalContactInfo] From HumanResources.[vEmployee]"&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;) |&amp;gt; mthd.Properties.Add&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#;"&gt;(&lt;/span&gt;&lt;span style="color:#800000;"&gt;"RdbCommandType"&lt;/span&gt;&lt;span style="color:#;"&gt;,CommandType.Text)  |&amp;gt; mthd.Properties.Add&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; createParameter (thismethod:Method) name direction =&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;     (name,&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#;"&gt;,direction,&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;      &lt;/span&gt;&lt;span style="color:#800000;"&gt;"Microsoft.Office.Server.ApplicationRegistry.Infrastructure.DotNetTypeReflector"&lt;/span&gt;&lt;span style="color:#;"&gt;)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;      |&amp;gt; thismethod.Parameters.Create&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;      &lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; parEmployees =  createParameter mthd &lt;/span&gt;&lt;span style="color:#800000;"&gt;"Employees"&lt;/span&gt;&lt;span style="color:#;"&gt; Microsoft.Office.Server.ApplicationRegistry.MetadataModel.DirectionType.Return&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; tdEmployees =&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; root = &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;       (&lt;/span&gt;&lt;span style="color:#800000;"&gt;"EmployeeDataReader"&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#800000;"&gt;"System.Data.IDataReader, System.Data, Version=2.0.3600.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#;"&gt;)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;       |&amp;gt; parEmployees.CreateRootTypeDescriptor&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; node = &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;       (&lt;/span&gt;&lt;span style="color:#800000;"&gt;"EmployeeDataRecord"&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#800000;"&gt;"System.Data.IDataRecord, System.Data, Version=2.0.3600.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;&lt;span style="color:#;"&gt;)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;       |&amp;gt; root.ChildTypeDescriptors.Create&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;   &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;   ((&lt;/span&gt;&lt;span style="color:#800000;"&gt;"EmployeeID"&lt;/span&gt;&lt;span style="color:#;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#;"&gt;, &lt;/span&gt;&lt;span style="color:#800000;"&gt;"System.Int32"&lt;/span&gt;&lt;span style="color:#;"&gt;, identifier, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;&lt;span style="color:#;"&gt;)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    |&amp;gt; node.ChildTypeDescriptors.Create).LocalizedDisplayName &amp;lt;- &lt;/span&gt;&lt;span style="color:#800000;"&gt;"Employee ID"&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;   &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; firstname = &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;      (&lt;/span&gt;&lt;span style="color:#800000;"&gt;"FirstName"&lt;/span&gt;&lt;span style="color:#;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#;"&gt;, &lt;/span&gt;&lt;span style="color:#800000;"&gt;"System.String"&lt;/span&gt;&lt;span style="color:#;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;&lt;span style="color:#;"&gt;)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;     |&amp;gt; node.ChildTypeDescriptors.Create&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;   firstname.LocalizedDisplayName &amp;lt;- &lt;/span&gt;&lt;span style="color:#800000;"&gt;"First Name"&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;   firstname.Update()&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; lastname = &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;      (&lt;/span&gt;&lt;span style="color:#800000;"&gt;"LastName"&lt;/span&gt;&lt;span style="color:#;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#;"&gt;, &lt;/span&gt;&lt;span style="color:#800000;"&gt;"System.String"&lt;/span&gt;&lt;span style="color:#;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;&lt;span style="color:#;"&gt;)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;      |&amp;gt; node.ChildTypeDescriptors.Create&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;   lastname.LocalizedDisplayName &amp;lt;- &lt;/span&gt;&lt;span style="color:#800000;"&gt;"Last Name"&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;   lastname.Update()&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;   &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;   [(&lt;/span&gt;&lt;span style="color:#800000;"&gt;"JobTitle"&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;span style="color:#800000;"&gt;"System.String"&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;span style="color:#800000;"&gt;"Job Title"&lt;/span&gt;&lt;span style="color:#;"&gt;);&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    (&lt;/span&gt;&lt;span style="color:#800000;"&gt;"Phone"&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;span style="color:#800000;"&gt;"System.String"&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;span style="color:#800000;"&gt;"Phone"&lt;/span&gt;&lt;span style="color:#;"&gt;);&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    (&lt;/span&gt;&lt;span style="color:#800000;"&gt;"EmailAddress"&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;span style="color:#800000;"&gt;"System.String"&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;span style="color:#800000;"&gt;"Email"&lt;/span&gt;&lt;span style="color:#;"&gt;);   &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    (&lt;/span&gt;&lt;span style="color:#800000;"&gt;"AddressLine1"&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;span style="color:#800000;"&gt;"System.String"&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;span style="color:#800000;"&gt;"Address"&lt;/span&gt;&lt;span style="color:#;"&gt;);   &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    (&lt;/span&gt;&lt;span style="color:#800000;"&gt;"City"&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;span style="color:#800000;"&gt;"System.String"&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;span style="color:#800000;"&gt;"City"&lt;/span&gt;&lt;span style="color:#;"&gt;);       &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    (&lt;/span&gt;&lt;span style="color:#800000;"&gt;"StateProvinceName"&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;span style="color:#800000;"&gt;"System.String"&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;span style="color:#800000;"&gt;"State"&lt;/span&gt;&lt;span style="color:#;"&gt;);       &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    (&lt;/span&gt;&lt;span style="color:#800000;"&gt;"PostalCode"&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;span style="color:#800000;"&gt;"System.String"&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;span style="color:#800000;"&gt;"Zip"&lt;/span&gt;&lt;span style="color:#;"&gt;);       &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    ] |&amp;gt; iter (&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;fun&lt;/span&gt;&lt;span style="color:#;"&gt; (label,typename,display) &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;       ((label, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#;"&gt;, typename, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#;"&gt;, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;&lt;span style="color:#;"&gt;)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;       |&amp;gt; node.ChildTypeDescriptors.Create).LocalizedDisplayName &amp;lt;- display)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;   root&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#;"&gt;   &lt;/span&gt;&lt;br&gt;&lt;span style="color:#008000;"&gt;// Create method instances&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; getEmployees = &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;   (&lt;/span&gt;&lt;span style="color:#800000;"&gt;"EmployeeFinderInstance"&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#;"&gt;,tdEmployees,Microsoft.Office.Server.ApplicationRegistry.MetadataModel.MethodInstanceType.Finder)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;   |&amp;gt; mthd.MethodInstances.Create&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18281936-1421999173873250928?l=jyliao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jyliao.blogspot.com/feeds/1421999173873250928/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18281936&amp;postID=1421999173873250928' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/1421999173873250928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/1421999173873250928'/><link rel='alternate' type='text/html' href='http://jyliao.blogspot.com/2008/10/create-sharepoint-bdc-connector-for.html' title='Create SharePoint BDC connector for AdventureWorks database with F# Script'/><author><name>John Liao</name><uri>http://www.blogger.com/profile/04740715435312568366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18281936.post-928621763529866409</id><published>2008-10-13T17:13:00.000-07:00</published><updated>2008-10-13T17:15:34.300-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2007'/><category scheme='http://www.blogger.com/atom/ns#' term='webparts'/><category scheme='http://www.blogger.com/atom/ns#' term='f#'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows SharePoint Services'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><title type='text'>Add Web Part to SharePoint with F# Script</title><content type='html'>&lt;p&gt;In building deployment scripts for SharePoint, there are times when I want to automate the deployment of webparts by building a script to automatically add web parts to specific web pages.  I found a book that talked about writing these types of scripts in Mark Gerow's &lt;a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;location=http%3A%2F%2Fwww.amazon.com%2FSharePoint-2007-Development-Recipes-Problem-Solution%2Fdp%2F1430209615%2F&amp;tag=techie2biz-20&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325"&gt;SharePoint 2007 Development Recipes&lt;/a&gt;, which had many other useful examples of scripting SharePoint 2007.  He's already written a C# version of this script that I've decided to implement in F# for contrast. &lt;/p&gt;&lt;p&gt;Here's the F# version of the code:&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;#light&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;#I&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;@"C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\ISAPI"&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;#r&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;@"Microsoft.SharePoint.dll"&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; Microsoft.SharePoint&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; Microsoft.SharePoint.WebPartPages&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; System.Web.UI.WebControls.WebParts&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; System.Xml&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; addWebPart page wp zone order pscope (web:SPWeb) =&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; webparts = (page, pscope) |&amp;gt; web.GetLimitedWebPartManager&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;      (wp,zone,order) |&amp;gt; webparts.AddWebPart&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;      wp |&amp;gt; webparts.SaveChanges&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;      &lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; disableCheckout (splist:SPList) spOperation =&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;  &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; oldvalue = splist.ForceCheckout&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;  splist.ForceCheckout &amp;lt;- &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;  splist.Update()&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;  &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;  spOperation &lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#;"&gt;  splist.ForceCheckout &amp;lt;- oldvalue&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;  splist.Update()&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; spUnsafeUpdate spOperation (siteurl:string) (webname:string) doclib  =&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; site = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; SPSite(siteurl)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; web = site.OpenWeb(webname)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;   web.AllowUnsafeUpdates &amp;lt;- &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;   &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;   &lt;/span&gt;&lt;span style="color:#008000;"&gt;// Disable versioning when updating Document Library&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;match&lt;/span&gt;&lt;span style="color:#;"&gt; doclib &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;with&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;   | &lt;/span&gt;&lt;span style="color:#800000;"&gt;""&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;       spOperation web&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;   | _ &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;       disableCheckout&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;       &amp;lt;| web.Lists.Item(doclib)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;       &amp;lt;| spOperation web &lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#;"&gt;   web.Update()&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;   web.Dispose()&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;   site.Dispose()&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;  &lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; siteurl = &lt;/span&gt;&lt;span style="color:#800000;"&gt;"http://localhost&lt;/span&gt;&lt;span style="color:#800000;"&gt;/"&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; webname = &lt;/span&gt;&lt;span style="color:#800000;"&gt;"recipes"&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; doclibName=&lt;/span&gt;&lt;span style="color:#800000;"&gt;""&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#008000;"&gt;// Add page viewer web part&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; viewer = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; PageViewerWebPart(SourceType=PathPattern.URL,&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                                   ContentLink=&lt;/span&gt;&lt;span style="color:#800000;"&gt;"http://msdn.microsoft.com/en-us/fsharp/default.aspx"&lt;/span&gt;&lt;span style="color:#;"&gt;)&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#008000;"&gt;// Add webpart using unsafe updates...&lt;/span&gt;&lt;br&gt;&lt;span style="color:#008000;"&gt;// Experimenting with ranges of expression with F#'s pipeline operators.  &lt;/span&gt;&lt;br&gt;&lt;span style="color:#008000;"&gt;// Traditional format for the following  code would be&lt;/span&gt;&lt;br&gt;&lt;span style="color:#008000;"&gt;// spUnsafeUpdate siteurl webname doclibName (addWebPart "Default.aspx" editor "Right" 0 Personalization.Shared)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;addWebPart&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;  &amp;lt;| &lt;/span&gt;&lt;span style="color:#800000;"&gt;"Default.aspx"&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;  &amp;lt;| viewer&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;  &amp;lt;| &lt;/span&gt;&lt;span style="color:#800000;"&gt;"Left"&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;  &amp;lt;| 0&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;  &amp;lt;| PersonalizationScope.Shared&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;|&amp;gt; spUnsafeUpdate &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;  &amp;lt;| siteurl &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;  &amp;lt;| webname &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;  &amp;lt;| doclibName &lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#008000;"&gt;// Add content editor web part&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; xmlDoc = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; XmlDocument()&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; xmlElem = xmlDoc.CreateElement(&lt;/span&gt;&lt;span style="color:#800000;"&gt;"xmlElem"&lt;/span&gt;&lt;span style="color:#;"&gt;)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;xmlElem.InnerText &amp;lt;- &lt;/span&gt;&lt;span style="color:#800000;"&gt;"Test content editor web part"&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; editor = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; ContentEditorWebPart(Content=xmlElem)&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#;"&gt;addWebPart&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;  &amp;lt;| &lt;/span&gt;&lt;span style="color:#800000;"&gt;"Default.aspx"&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;  &amp;lt;| editor&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;  &amp;lt;| &lt;/span&gt;&lt;span style="color:#800000;"&gt;"Right"&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;  &amp;lt;| 0&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;  &amp;lt;| PersonalizationScope.Shared&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;|&amp;gt; spUnsafeUpdate &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;  &amp;lt;| siteurl &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;  &amp;lt;| webname &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;  &amp;lt;| doclibName &lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/pre&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18281936-928621763529866409?l=jyliao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jyliao.blogspot.com/feeds/928621763529866409/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18281936&amp;postID=928621763529866409' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/928621763529866409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/928621763529866409'/><link rel='alternate' type='text/html' href='http://jyliao.blogspot.com/2008/10/add-web-part-to-sharepoint-with-f.html' title='Add Web Part to SharePoint with F# Script'/><author><name>John Liao</name><uri>http://www.blogger.com/profile/04740715435312568366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18281936.post-838011633541893094</id><published>2008-10-01T08:35:00.000-07:00</published><updated>2008-10-01T08:38:18.268-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2007'/><category scheme='http://www.blogger.com/atom/ns#' term='f#'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows SharePoint Services'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><title type='text'>More SharePoint scripting with F#</title><content type='html'>&lt;p&gt;F# Interactive mode in Visual Studio is a great way to interactively script SharePoint objects.  I'd almost compare this to using sql query editor against a database.  I can write the SharePoint code in Visual Studio and have all the code completion and type checking features.  I can select the portion of the source code and execute it by pressing Alt+Enter.  It's pretty sweet.  Combine this with queries built with CAML statements, I can basically do ad hoc queries against SharePoint objects.  I don't know any other tool in the SharePoint tool suite that can do this.  I can easily imagine a SharePoint management studio tool built with customized Visual Studio plugins that provide a way to explore the SharePoint objects graphically similar to what SQL Server Management Studio does for SQL Server database and uses F# to manipulate SharePoint similar to how SQL manipulates the database.&lt;/p&gt;&lt;p&gt;Here are some example scripts adapted from the book &lt;a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;location=http%3A%2F%2Fwww.amazon.com%2Fdp%2F0735623201%2F&amp;tag=techie2biz-20&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325"&gt;Inside Microsoft Windows SharePoint Services 3.0 by Ted Pattison and Daniel Larson&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;#light&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;#I&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;@"C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\ISAPI"&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;#r&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;@"Microsoft.SharePoint.dll"&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; System&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; Microsoft.SharePoint&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#008000;"&gt;// Utility functions to convert SPxCollection to seq&amp;lt;SPx&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; SPListToSeq (splist:SPListCollection) =       &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    seq { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt;&lt;span style="color:#;"&gt; i &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;in&lt;/span&gt;&lt;span style="color:#;"&gt; 0 .. (splist.Count-1) &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#;"&gt; splist.get_Item(i)}&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; SPFieldToSeq (splist:SPFieldCollection) =       &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    seq { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt;&lt;span style="color:#;"&gt; i &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;in&lt;/span&gt;&lt;span style="color:#;"&gt; 0 .. (splist.Count-1) &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#;"&gt; splist.get_Item(i)}&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; SPListItemToSeq (splist:SPListItemCollection) =       &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    seq { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt;&lt;span style="color:#;"&gt; i &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;in&lt;/span&gt;&lt;span style="color:#;"&gt; 0 .. (splist.Count-1) &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#;"&gt; splist.get_Item(i)}&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; SPContentTypeToSeq (splist:SPContentTypeCollection) =       &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    seq { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt;&lt;span style="color:#;"&gt; i &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;in&lt;/span&gt;&lt;span style="color:#;"&gt; 0 .. (splist.Count-1) &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#;"&gt; splist.get_Item(i)}&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; site = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; SPSite(&lt;/span&gt;&lt;span style="color:#800000;"&gt;"http://localhost/"&lt;/span&gt;&lt;span style="color:#;"&gt;)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; web = site.OpenWeb()&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#008000;"&gt;// Add new SharePoint List called "F# SharePoint News&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; id = (&lt;/span&gt;&lt;span style="color:#800000;"&gt;"F# SharePoint News"&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;          &lt;/span&gt;&lt;span style="color:#800000;"&gt;"List for news on F# and SharePoint items."&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;          SPListTemplateType.Announcements)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;         |&amp;gt; web.Lists.Add&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; list = web.Lists.[id]&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;list.OnQuickLaunch &amp;lt;- &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;list.Update()&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#008000;"&gt;// Add news item to the newly created SharePoint List&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; newItem = list.Items.Add()&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;newItem.[&lt;/span&gt;&lt;span style="color:#800000;"&gt;"Title"&lt;/span&gt;&lt;span style="color:#;"&gt;] &amp;lt;-&lt;/span&gt;&lt;span style="color:#800000;"&gt;"Check for expired items today!"&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;newItem.[&lt;/span&gt;&lt;span style="color:#800000;"&gt;"Body"&lt;/span&gt;&lt;span style="color:#;"&gt;] &amp;lt;- &lt;/span&gt;&lt;span style="color:#800000;"&gt;"We're are expiring this today and see if our query works!"&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;newItem.[&lt;/span&gt;&lt;span style="color:#800000;"&gt;"Expires"&lt;/span&gt;&lt;span style="color:#;"&gt;] &amp;lt;- DateTime.Now &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;newItem.Update()&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#008000;"&gt;// Checking all items in "F# SharePoint News" list that expires today&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; queryClause = &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;@"&amp;lt;Where&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#800000;"&gt;      &amp;lt;Eq&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#800000;"&gt;         &amp;lt;FieldRef Name='Expires' /&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#800000;"&gt;         &amp;lt;Value Type='DateTime'&amp;gt;&amp;lt;Today /&amp;gt;&amp;lt;/Value&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#800000;"&gt;      &amp;lt;/Eq&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#800000;"&gt; &amp;lt;/Where&amp;gt;"&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; query = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; SPQuery(ViewFields = &lt;/span&gt;&lt;span style="color:#800000;"&gt;@"&amp;lt;FieldRef Name='Title'/&amp;gt;&amp;lt;FieldRef Name='Expires'/&amp;gt;"&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                        Query=queryClause) &lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; mylist = web.Lists.[&lt;/span&gt;&lt;span style="color:#800000;"&gt;"F# Sharepoint News"&lt;/span&gt;&lt;span style="color:#;"&gt;]&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;SPListItemToSeq (mylist.GetItems(query))&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;|&amp;gt; Seq.iter (&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;fun&lt;/span&gt;&lt;span style="color:#;"&gt; x &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#;"&gt; printf &lt;/span&gt;&lt;span style="color:#800000;"&gt;"%s\n"&lt;/span&gt;&lt;span style="color:#;"&gt; x.Title)&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#008000;"&gt;// Checking available content types&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;SPContentTypeToSeq web.AvailableContentTypes&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;|&amp;gt; Seq.iter (&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;fun&lt;/span&gt;&lt;span style="color:#;"&gt; x &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#;"&gt; printf &lt;/span&gt;&lt;span style="color:#800000;"&gt;"%s\n\tDescription = %s\n\tID=%s\n"&lt;/span&gt;&lt;span style="color:#;"&gt; x.Name x.Description (x.Id.ToString()))&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#;"&gt;web.Close()&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;site.Close()&lt;/span&gt;&lt;/pre&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18281936-838011633541893094?l=jyliao.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jyliao.blogspot.com/feeds/838011633541893094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18281936&amp;postID=838011633541893094' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/838011633541893094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18281936/posts/default/838011633541893094'/><link rel='alternate' type='text/html' href='http://jyliao.blogspot.com/2008/10/more-sharepoint-scripting-with-f.html' title='More SharePoint scripting with F#'/><author><name>John Liao</name><uri>http://www.blogger.com/profile/04740715435312568366</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18281936.post-3244477904441492496</id><published>2008-09-23T08:49:00.000-07:00</published><updated>2008-09-23T09:21:39.920-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint 2007'/><category scheme='http://www.blogger.com/atom/ns#' term='webparts'/><category scheme='http://www.blogger.com/atom/ns#' term='f#'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><title type='text'>A more complicated SharePoint web part examples in F# with RSS Viewer and Feed List</title><content type='html'>&lt;style&gt;
code {color : maroon; font-weight:bold}
&lt;/style&gt;
&lt;p&gt;I still up to my old tricks with learning new Microsoft Technologies by using F# as the implementation language.  I find that by using a different programming language than the one in the book forces me to think through the author's implementation while I transliterate the code into F#. Other bonuses include learning to program in F# and in the process, I often trigger errors while learning the new technology that serendipitously provide me opportunites to explore the technologies in depth. &lt;/p&gt;&lt;p&gt;Lately, I've been exploring SharePoint by going through the book &lt;a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;location=http%3A%2F%2Fwww.amazon.com%2Fdp%2F0735623201%2F&amp;tag=techie2biz-20&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325"&gt;Inside Microsoft Windows SharePoint Services 3.0 by Ted Pattison and Daniel Larson&lt;/a&gt; and working through the code examples in Chapter 4 of the book, specifically the RSS Viewer Web Part and the Feed List Web Part example. &lt;/p&gt;&lt;p&gt;In the &lt;a href="http://jyliao.blogspot.com/2008/09/exploring-sharepoint-2007-object-model.html"&gt;previous blog&lt;/a&gt;, I mentioned that I had to write a &lt;code&gt;SPListCollectionAdapter&lt;/code&gt; in C# to wrap &lt;code&gt;SPListCollection&lt;/code&gt; so I can use it like standard sequences in F#.  I figured out a F# workaround for it so that I don't have to switch back and forth to resolve the problem.  In the implementation of the F# solution, I found myself getting really annoyed by the SharePoint libray designers in not implementing the &lt;code&gt;IEnumerable&lt;/code&gt; interface in &lt;code&gt;SPBaseCollection&lt;/code&gt; so that I don't need to write the adapter in the first place.  The second major issue with the &lt;code&gt;SPBaseCollection&lt;/code&gt; is that it did not specify and overridable &lt;code&gt;Item&lt;/code&gt; property and left it to the implementation class to arbitrarily define the access to the item in the collection list.  I have no idea why the SharePoint library designers did this.  So instead of writing the following function that can be take any subclass of &lt;code&gt;SPBaseCollection&lt;/code&gt;:&lt;/p&gt; &lt;p&gt;&lt;pre&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; toSeq (splist: #SPBaseCollection) =&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        seq { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt;&lt;span style="color:#;"&gt; i &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;in&lt;/span&gt;&lt;span style="color:#;"&gt;  0 .. (splist.Count-1) &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#;"&gt;  splist.get_Item(i)}&lt;/span&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;I'm now forced to write an adapter for each of the &lt;code&gt;SPBaseCollection&lt;/code&gt; subclasses as shown in the following:&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; SPListToSeq (splist:SPListCollection) =&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;       seq { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt;&lt;span style="color:#;"&gt; i &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;in&lt;/span&gt;&lt;span style="color:#;"&gt; 0 .. (splist.Count-1) &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#;"&gt; splist.get_Item(i)}&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                  &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; SPWebToSeq (splist:SPWebCollection) =&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;       seq { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt;&lt;span style="color:#;"&gt; i &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;in&lt;/span&gt;&lt;span style="color:#;"&gt; 0 .. (splist.Count-1) &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#;"&gt; splist.get_Item(i)}&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;In the implementation and testing process, I ran into problems and SharePoint showed some very unhelpful error messages.  I found it invaluable to change SharePoint Web.config debug settings as outline in &lt;a href="http://www.sharepointblogs.com/jessefitz/archive/2008/04/09/sharepoint-web-config-debug-settings.aspx"&gt;Jesse's SharePoint Blog.&lt;/a&gt;  Combining that with a custom file logger, I managed to identify all my bugs and resolved the issues.&lt;/p&gt;&lt;p&gt;Here's a screenshot of the implemented RSS Viewer Web Part implemented in F# with the feed url pointed to F# Planet...&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_tmuJUwQ_atM/SNkRY1RQOGI/AAAAAAAAAHc/pi8xeg16Vws/s1600-h/rssviewer.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_tmuJUwQ_atM/SNkRY1RQOGI/AAAAAAAAAHc/pi8xeg16Vws/s320/rssviewer.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5249245958991001698" /&gt;&lt;/a&gt;
&lt;p&gt;Here's a screenshot of the implemented Feed List Web Part that is connected to the RSS Viewer Web Part&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_tmuJUwQ_atM/SNkRnw1EwbI/AAAAAAAAAHk/zr79Jdnn_R0/s1600-h/FeedAndViewer.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_tmuJUwQ_atM/SNkRnw1EwbI/AAAAAAAAAHk/zr79Jdnn_R0/s320/FeedAndViewer.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5249246215497105842" /&gt;&lt;/a&gt;
&lt;p&gt;In the F# implementation, probably the most notable change is implementation of &lt;code&gt;AddLists&lt;/code&gt; member function in FeedListWebPart class as &lt;code&gt;getSPLists&lt;/code&gt; in the example F# code. Instead of iterating through each SPList in the collection and using the &lt;code&gt;if&lt;/code&gt; statement to determine whether we should add the &lt;code&gt;SPList&lt;/code&gt; to the newly created collection, the F# version takes the entire list and  pipleline it through a series of filter function to get the file list.  F# helped me to think of operations at the granularity of the list level instead of at the items level.  Here's the implementation in F#:&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;#light&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;namespace&lt;/span&gt;&lt;span style="color:#;"&gt; DemoWebParts&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; System&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; System.Collections.Generic&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; System.ComponentModel&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; System.Data&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; System.IO&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; System.Net&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; System.Reflection&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; System.Web&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; System.Web.UI&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; System.Web.UI.WebControls&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; System.Web.UI.WebControls.WebParts&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; System.Xml&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; System.Xml.Xsl&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; Microsoft.SharePoint.WebControls&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; Microsoft.SharePoint&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;open&lt;/span&gt;&lt;span style="color:#;"&gt; Microsoft.SharePoint.Utilities&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#008000;"&gt;// This is a utility debugging tool that I've used to dump deugging info to a file.&lt;/span&gt;&lt;br&gt;&lt;span style="color:#008000;"&gt;// I can simple call it as Log.dump "Error messages"&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;module&lt;/span&gt;&lt;span style="color:#;"&gt; Log =&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; dump (msg:string) =&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        using (File.AppendText(&lt;/span&gt;&lt;span style="color:#800000;"&gt;@"c:\logs\sharepoint.log"&lt;/span&gt;&lt;span style="color:#;"&gt;))&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;           (&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;fun&lt;/span&gt;&lt;span style="color:#;"&gt; writer &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#;"&gt; writer.WriteLine(msg))&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;           &lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;module&lt;/span&gt;&lt;span style="color:#;"&gt; SPCollectionUtility =&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;// This is what I would like to do but could not due to&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;// the design of SPBaseCollection&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;(*&lt;/span&gt;&lt;br&gt;&lt;span style="color:#008000;"&gt;    let toSeq (splist: #SPBaseCollection) =&lt;/span&gt;&lt;br&gt;&lt;span style="color:#008000;"&gt;        seq { for i in  0 .. (splist.Count-1) -&amp;gt;  splist.get_Item(i)}&lt;/span&gt;&lt;br&gt;&lt;span style="color:#008000;"&gt;        *)&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; SPListToSeq (splist:SPListCollection) =&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;       seq { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt;&lt;span style="color:#;"&gt; i &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;in&lt;/span&gt;&lt;span style="color:#;"&gt; 0 .. (splist.Count-1) &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#;"&gt; splist.get_Item(i)}&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                  &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; SPWebToSeq (splist:SPWebCollection) =&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;       seq { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt;&lt;span style="color:#;"&gt; i &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;in&lt;/span&gt;&lt;span style="color:#;"&gt; 0 .. (splist.Count-1) &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#;"&gt; splist.get_Item(i)}&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;module&lt;/span&gt;&lt;span style="color:#;"&gt; WebPartResources =&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; GetNamedResource (reference:obj) (filename:string) =&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;use&lt;/span&gt;&lt;span style="color:#;"&gt; stream = filename |&amp;gt; Assembly.GetExecutingAssembly().GetManifestResourceStream&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;use&lt;/span&gt;&lt;span style="color:#;"&gt; reader = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; StreamReader(stream)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        reader.ReadToEnd()&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; GetNamedResourceStream (reference:obj) (filename:string) =&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        filename&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        |&amp;gt; Assembly.GetExecutingAssembly().GetManifestResourceStream&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;   &lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;type&lt;/span&gt;&lt;span style="color:#;"&gt; RenderMode =&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    | Full&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    | Titles  &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;module&lt;/span&gt;&lt;span style="color:#;"&gt; RenderModeUtility =    &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;// Helper function for RenderMode&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; label mode =&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;match&lt;/span&gt;&lt;span style="color:#;"&gt; mode &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;with&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        | Full &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;"Full"&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        | Titles &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;"Titles"&lt;/span&gt;&lt;span style="color:#;"&gt;      &lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; setmode label =&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;match&lt;/span&gt;&lt;span style="color:#;"&gt; label &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;with&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        | &lt;/span&gt;&lt;span style="color:#800000;"&gt;"Full"&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#;"&gt; Full&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        | &lt;/span&gt;&lt;span style="color:#800000;"&gt;"Titles"&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#;"&gt; Titles &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        | _ &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#;"&gt; failwith &lt;/span&gt;&lt;span style="color:#800000;"&gt;"value must be Full or Titles to be RenderMode"&lt;/span&gt;&lt;span style="color:#;"&gt;   &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;type&lt;/span&gt;&lt;span style="color:#;"&gt; RssViewEditorPart() = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;inherit&lt;/span&gt;&lt;span style="color:#;"&gt; EditorPart()&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;mutable&lt;/span&gt;&lt;span style="color:#;"&gt; (txtXmlUrl:TextBox) = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                                        &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;mutable&lt;/span&gt;&lt;span style="color:#;"&gt; (lstHeadlineMode:RadioButtonList) = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;do&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;base&lt;/span&gt;&lt;span style="color:#;"&gt;.Title &amp;lt;- &lt;/span&gt;&lt;span style="color:#800000;"&gt;"RSS View Custom Editor"&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#;"&gt; this.CreateChildControls() =   &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        txtXmlUrl &amp;lt;- &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; TextBox(Width=&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; Unit(&lt;/span&gt;&lt;span style="color:#800000;"&gt;"100%"&lt;/span&gt;&lt;span style="color:#;"&gt;),&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                                TextMode=TextBoxMode.MultiLine,&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                                Rows = 3)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                                        &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;// Add controls to the radio button list&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        lstHeadlineMode &amp;lt;- &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; RadioButtonList()&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        (RenderModeUtility.label RenderMode.Full) |&amp;gt; lstHeadlineMode.Items.Add&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        (RenderModeUtility.label RenderMode.Titles) |&amp;gt; lstHeadlineMode.Items.Add&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; LiteralControl(&lt;/span&gt;&lt;span style="color:#800000;"&gt;"Feed Url:&amp;lt;br/&amp;gt;"&lt;/span&gt;&lt;span style="color:#;"&gt;) |&amp;gt; this.Controls.Add&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        txtXmlUrl |&amp;gt; this.Controls.Add&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;match&lt;/span&gt;&lt;span style="color:#;"&gt; this.WebPartManager.Personalization.Scope &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;with&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;          | PersonalizationScope.User &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#;"&gt; txtXmlUrl |&amp;gt; this.Controls.Add&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;          | _ &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#;"&gt; ()&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; LiteralControl(&lt;/span&gt;&lt;span style="color:#800000;"&gt;"Headline Mode:&amp;lt;br/&amp;gt;"&lt;/span&gt;&lt;span style="color:#;"&gt;) |&amp;gt; this.Controls.Add&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        lstHeadlineMode |&amp;gt; this.Controls.Add&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#;"&gt; this.SyncChanges() = &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        this.EnsureChildControls()&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; targetPart = this.WebPartToEdit :?&amp;gt; RssViewWebPart&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; SelectedMode = targetPart.HeadlineMode&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; item = lstHeadlineMode.Items.FindByText(SelectedMode)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        item.Selected &amp;lt;- &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        txtXmlUrl.Text &amp;lt;- targetPart.XmlUrl&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#;"&gt; this.ApplyChanges() = &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        this.EnsureChildControls()&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; targetPart = this.WebPartToEdit :?&amp;gt; RssViewWebPart&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        targetPart.XmlUrl &amp;lt;- txtXmlUrl.Text&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        targetPart.HeadlineMode &amp;lt;- lstHeadlineMode.SelectedValue&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;end&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;and&lt;/span&gt;&lt;span style="color:#;"&gt; RssViewWebPart() = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;inherit&lt;/span&gt;&lt;span style="color:#;"&gt; WebPart()&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;   &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;mutable&lt;/span&gt;&lt;span style="color:#;"&gt; (xmlUrl:string) = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;mutable&lt;/span&gt;&lt;span style="color:#;"&gt; headlineMode = RenderMode.Full&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;mutable&lt;/span&gt;&lt;span style="color:#;"&gt; (exceptionDetail:string) = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;mutable&lt;/span&gt;&lt;span style="color:#;"&gt; (xmlstream:Stream) = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;(*&lt;/span&gt;&lt;br&gt;&lt;span style="color:#008000;"&gt;    // Did not need to implement this...&lt;/span&gt;&lt;br&gt;&lt;span style="color:#008000;"&gt;    interface IWebEditable with&lt;/span&gt;&lt;br&gt;&lt;span style="color:#008000;"&gt;        member this.WebBrowsableObject &lt;/span&gt;&lt;br&gt;&lt;span style="color:#008000;"&gt;            with get() = box this&lt;/span&gt;&lt;br&gt;&lt;span style="color:#008000;"&gt;        override this.CreateEditorParts () =&lt;/span&gt;&lt;br&gt;&lt;span style="color:#008000;"&gt;            let parts = new List&amp;lt;EditorPart&amp;gt;(1);&lt;/span&gt;&lt;br&gt;&lt;span style="color:#008000;"&gt;            parts.Add(new RssViewEditorPart(ID=(this.ID+"_rssViewEditor")))&lt;/span&gt;&lt;br&gt;&lt;span style="color:#008000;"&gt;            new EditorPartCollection(base.CreateEditorParts(),parts)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#008000;"&gt;    *)&lt;/span&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#;"&gt; this.CreateEditorParts () =&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; parts = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; List&amp;lt;EditorPart&amp;gt;(1);&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; part =&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; RssViewEditorPart(ID=(this.ID+&lt;/span&gt;&lt;span style="color:#800000;"&gt;"_rssViewEditor"&lt;/span&gt;&lt;span style="color:#;"&gt;)) &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        parts.Add(part)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; EditorPartCollection(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;base&lt;/span&gt;&lt;span style="color:#;"&gt;.CreateEditorParts(),parts)&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;member&lt;/span&gt;&lt;span style="color:#;"&gt; this.Redirect () =&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        this.Context.Response.Redirect(this.XmlUrl)        &lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    [&amp;lt;Personalizable(PersonalizationScope.Shared);WebBrowsable(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;&lt;span style="color:#;"&gt;)&amp;gt;]&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;member&lt;/span&gt;&lt;span style="color:#;"&gt; this.XmlUrl&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;with&lt;/span&gt;&lt;span style="color:#;"&gt; get() =  xmlUrl&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;and&lt;/span&gt;&lt;span style="color:#;"&gt; set value = xmlUrl &amp;lt;-  value&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    [&amp;lt;Personalizable(PersonalizationScope.User);WebBrowsable(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;&lt;span style="color:#;"&gt;)&amp;gt;]&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;member&lt;/span&gt;&lt;span style="color:#;"&gt; this.HeadlineMode&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;with&lt;/span&gt;&lt;span style="color:#;"&gt; get() = RenderModeUtility.label headlineMode&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;and&lt;/span&gt;&lt;span style="color:#;"&gt; set value = headlineMode &amp;lt;- (RenderModeUtility.setmode value)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#;"&gt; this.Verbs&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;with&lt;/span&gt;&lt;span style="color:#;"&gt; get() =&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; verbs = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; List&amp;lt;WebPartVerb&amp;gt;()&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            verbs.Add(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; WebPartVerb(this.ID + &lt;/span&gt;&lt;span style="color:#800000;"&gt;"_ClientSideRssOpenerVerb"&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                                      sprintf &lt;/span&gt;&lt;span style="color:#800000;"&gt;"window.open('%s','RSSXML')"&lt;/span&gt;&lt;span style="color:#;"&gt; this.XmlUrl,&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                                      Text = &lt;/span&gt;&lt;span style="color:#800000;"&gt;"Open RSS Feed"&lt;/span&gt;&lt;span style="color:#;"&gt;))&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            verbs.Add(                                     &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; handler = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; WebPartEventHandler(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;fun&lt;/span&gt;&lt;span style="color:#;"&gt; _ _ &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;match&lt;/span&gt;&lt;span style="color:#;"&gt; String.IsNullOrEmpty(this.XmlUrl) &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;with&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                    | &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#;"&gt; this.Redirect()&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                    | &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#;"&gt; ())&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; WebPartVerb(this.ID + &lt;/span&gt;&lt;span style="color:#800000;"&gt;"_ServerSideRssOpenerVerb"&lt;/span&gt;&lt;span style="color:#;"&gt;, &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                                handler,&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                                Text = &lt;/span&gt;&lt;span style="color:#800000;"&gt;"View RSS Source Feed 3.0"&lt;/span&gt;&lt;span style="color:#;"&gt;))&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                                             &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; WebPartVerbCollection(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;base&lt;/span&gt;&lt;span style="color:#;"&gt;.Verbs, verbs )&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                    &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#;"&gt; this.OnInit (e:EventArgs) = &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;base&lt;/span&gt;&lt;span style="color:#;"&gt;.OnInit(e)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        this.HelpUrl &amp;lt;- &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            (this.GetType(), &lt;/span&gt;&lt;span style="color:#800000;"&gt;"help.html"&lt;/span&gt;&lt;span style="color:#;"&gt;)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            |&amp;gt; this.Page.ClientScript.GetWebResourceUrl&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        this.HelpMode &amp;lt;- WebPartHelpMode.Modeless&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#;"&gt; this.OnPreRender (e:EventArgs) =&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;base&lt;/span&gt;&lt;span style="color:#;"&gt;.OnPreRender(e)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#;"&gt; (String.IsNullOrEmpty(this.XmlUrl)) &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;then&lt;/span&gt;&lt;span style="color:#;"&gt; ()&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;elif&lt;/span&gt;&lt;span style="color:#;"&gt; this.WebPartManager.DisplayMode.AllowPageDesign &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;then&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; LiteralControl(&lt;/span&gt;&lt;span style="color:#800000;"&gt;"No display while in design mode."&lt;/span&gt;&lt;span style="color:#;"&gt;) &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            |&amp;gt; this.Controls.Add &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;else&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;try&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; req = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; Uri(this.XmlUrl) |&amp;gt; WebRequest.CreateDefault&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                req.Credentials &amp;lt;- CredentialCache.DefaultCredentials&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                req.Timeout &amp;lt;- 10000 &lt;/span&gt;&lt;span style="color:#008000;"&gt;// 10 seconds&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; beginHandler = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; BeginEventHandler(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;fun&lt;/span&gt;&lt;span style="color:#;"&gt; _ _ callback state &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                    req.BeginGetResponse(callback,state))&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; successHandler = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; EndEventHandler(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;fun&lt;/span&gt;&lt;span style="color:#;"&gt; result &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;try&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                        xmlstream &amp;lt;- req.EndGetResponse(result).GetResponseStream()&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;with&lt;/span&gt;&lt;span style="color:#;"&gt; wex &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                        exceptionDetail &amp;lt;- wex.Message)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; errorHandler = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; EndEventHandler(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;fun&lt;/span&gt;&lt;span style="color:#;"&gt; _ &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; errmsg = sprintf &lt;/span&gt;&lt;span style="color:#800000;"&gt;"The request timed out while waiting for %s"&lt;/span&gt;&lt;span style="color:#;"&gt; this.XmlUrl&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; Label(Text=errmsg) |&amp;gt; this.Controls.Add)&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; PageAsyncTask(beginHandler,successHandler,errorHandler,&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#;"&gt;)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                |&amp;gt;  this.Page.RegisterAsyncTask&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;with&lt;/span&gt;&lt;span style="color:#;"&gt; :? System.Security.SecurityException &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; errmsg = &lt;/span&gt;&lt;span style="color:#800000;"&gt;"Permission denied - please set trust level to WSS_Medium."&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; LiteralControl(errmsg) &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                |&amp;gt; this.Controls.Add&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#;"&gt; this.RenderContents (writer:HtmlTextWriter) =&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;base&lt;/span&gt;&lt;span style="color:#;"&gt;.RenderContents(writer)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#;"&gt; exceptionDetail &amp;lt;&amp;gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;then&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            writer.Write(exceptionDetail)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;elif&lt;/span&gt;&lt;span style="color:#;"&gt; (String.IsNullOrEmpty(this.XmlUrl) || xmlstream = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#;"&gt;) &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;then&lt;/span&gt;&lt;span style="color:#;"&gt; ()&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;else&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; transformer = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; XslCompiledTransform()&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; xslt = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;match&lt;/span&gt;&lt;span style="color:#;"&gt; headlineMode &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;with&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                       | Full &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;"RSS.xslt"&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                       | Titles &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;"RssTitles.xslt"&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;use&lt;/span&gt;&lt;span style="color:#;"&gt; res = WebPartResources.GetNamedResourceStream this xslt&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; XmlTextReader(res) |&amp;gt; transformer.Load&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;try&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;use&lt;/span&gt;&lt;span style="color:#;"&gt; input = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; XmlTextReader(xmlstream)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;use&lt;/span&gt;&lt;span style="color:#;"&gt; output = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; XmlTextWriter(writer.InnerWriter)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                (input,output) |&amp;gt; transformer.Transform&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;with&lt;/span&gt;&lt;span style="color:#;"&gt; e &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                writer.Write(e.Message)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#;"&gt; xmlstream &amp;lt;&amp;gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;then&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                   xmlstream.Close()&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                   xmlstream.Dispose()&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    [&amp;lt;ConnectionConsumer(&lt;/span&gt;&lt;span style="color:#800000;"&gt;"Xml URL Consumer"&lt;/span&gt;&lt;span style="color:#;"&gt;,AllowsMultipleConnections=&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;&lt;span style="color:#;"&gt;)&amp;gt;]        &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;member&lt;/span&gt;&lt;span style="color:#;"&gt; this.SetConnectionInterface (provider:IWebPartField) =&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        provider.GetFieldValue(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; FieldCallback(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;fun&lt;/span&gt;&lt;span style="color:#;"&gt; providedUrl &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#;"&gt; providedUrl = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;then&lt;/span&gt;&lt;span style="color:#;"&gt; ()&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;else&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; urls = (providedUrl :?&amp;gt; String).Split([|&lt;/span&gt;&lt;span style="color:#800000;"&gt;','&lt;/span&gt;&lt;span style="color:#;"&gt;|])&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                this.XmlUrl &amp;lt;- urls |&amp;gt; Array.to_list |&amp;gt; List.hd))&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;end&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000FF;"&gt;type&lt;/span&gt;&lt;span style="color:#;"&gt; FeedListWebPart() = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;inherit&lt;/span&gt;&lt;span style="color:#;"&gt; WebPart()&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;mutable&lt;/span&gt;&lt;span style="color:#;"&gt; xmlurl = &lt;/span&gt;&lt;span style="color:#800000;"&gt;""&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; spfilters = [SPListTemplateType.Categories;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                     SPListTemplateType.MasterPageCatalog;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                     SPListTemplateType.WebPageLibrary;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                     SPListTemplateType.WebPartCatalog;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                     SPListTemplateType.WebTemplateCatalog;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                     SPListTemplateType.UserInformation;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                     SPListTemplateType.ListTemplateCatalog;]&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;rec&lt;/span&gt;&lt;span style="color:#;"&gt; getSPLists (web:SPWeb) =&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        Seq.append&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;           &lt;/span&gt;&lt;span style="color:#008000;"&gt;// e.g. foreach (SPList list in web.Lists)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;           &lt;/span&gt;&lt;span style="color:#008000;"&gt;//(new SPListCollectionAdapter(web.Lists)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;           (SPCollectionUtility.SPListToSeq web.Lists&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            |&amp;gt; Seq.filter (&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;fun&lt;/span&gt;&lt;span style="color:#;"&gt; x &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#;"&gt; x.AllowRssFeeds)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            |&amp;gt; Seq.filter (&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;fun&lt;/span&gt;&lt;span style="color:#;"&gt; x &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#;"&gt; x.EnableSyndication)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            |&amp;gt; Seq.filter (&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;fun&lt;/span&gt;&lt;span style="color:#;"&gt; x &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#;"&gt; List.map ((&amp;lt;&amp;gt;) x.BaseTemplate) spfilters&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                                    |&amp;gt; List.fold_left (&amp;amp;&amp;amp;) &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#;"&gt;)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            |&amp;gt; Seq.filter (&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;fun&lt;/span&gt;&lt;span style="color:#;"&gt; x &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                x.DoesUserHavePermissions(SPBasePermissions.ViewListItems)))&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;           &lt;/span&gt;&lt;span style="color:#008000;"&gt;// e.g. foreach (SPWeb subweb in web.Webs)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//(new SPWebCollectionAdapter(web.Webs)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;           (SPCollectionUtility.SPWebToSeq web.Webs&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;             |&amp;gt; Seq.filter (&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;fun&lt;/span&gt;&lt;span style="color:#;"&gt; w &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                 w.DoesUserHavePermissions(SPBasePermissions.ViewListItems))&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;             |&amp;gt; Seq.map getSPLists |&amp;gt; Seq.concat)&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#;"&gt; this.CreateChildControls() =&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;base&lt;/span&gt;&lt;span style="color:#;"&gt;.CreateChildControls()&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; list = SPContext.Current.Web |&amp;gt; getSPLists&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; view = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; SPGridView(AutoGenerateColumns=&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;&lt;span style="color:#;"&gt;)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        this.Controls.Add(            &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            [&lt;/span&gt;&lt;span style="color:#800000;"&gt;"Title"&lt;/span&gt;&lt;span style="color:#;"&gt;;&lt;/span&gt;&lt;span style="color:#800000;"&gt;"ItemCount"&lt;/span&gt;&lt;span style="color:#;"&gt;]&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            |&amp;gt; List.iter (&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;fun&lt;/span&gt;&lt;span style="color:#;"&gt; x &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;               &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; BoundField(DataField=x,HeaderText=x)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;               |&amp;gt; view.Columns.Add)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            view.Columns.Add(&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;               &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; button = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; CommandField(HeaderText=&lt;/span&gt;&lt;span style="color:#800000;"&gt;"Action"&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                                             SelectText=&lt;/span&gt;&lt;span style="color:#800000;"&gt;"Show RSS"&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                                             ShowSelectButton=&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#;"&gt;)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;               button.ControlStyle.Width &amp;lt;- &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; Unit(75.0)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;               button)&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            view.SelectedIndexChanged.Add(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;fun&lt;/span&gt;&lt;span style="color:#;"&gt; x &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;               xmlurl &amp;lt;- view.SelectedValue.ToString())                                            &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            view&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            )&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#;"&gt; this.Page.IsPostBack = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;&lt;span style="color:#;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;then&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; table = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; DataTable()&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            [&lt;/span&gt;&lt;span style="color:#800000;"&gt;"Title"&lt;/span&gt;&lt;span style="color:#;"&gt;;&lt;/span&gt;&lt;span style="color:#800000;"&gt;"ItemCount"&lt;/span&gt;&lt;span style="color:#;"&gt;;&lt;/span&gt;&lt;span style="color:#800000;"&gt;"XmlUrl"&lt;/span&gt;&lt;span style="color:#;"&gt;;&lt;/span&gt;&lt;span style="color:#800000;"&gt;"ID"&lt;/span&gt;&lt;span style="color:#;"&gt;]&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            |&amp;gt; List.iter (&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;fun&lt;/span&gt;&lt;span style="color:#;"&gt; x &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#;"&gt; table.Columns.Add(x) |&amp;gt; ignore)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;// Need to build DataRows &amp;amp; DataTable...&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; buildrow (list:SPList) =&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; row = table.NewRow()&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                row.[&lt;/span&gt;&lt;span style="color:#800000;"&gt;"Title"&lt;/span&gt;&lt;span style="color:#;"&gt;] &amp;lt;- list.Title&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                row.[&lt;/span&gt;&lt;span style="color:#800000;"&gt;"ItemCount"&lt;/span&gt;&lt;span style="color:#;"&gt;] &amp;lt;- list.ItemCount.ToString()&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                row.[&lt;/span&gt;&lt;span style="color:#800000;"&gt;"ID"&lt;/span&gt;&lt;span style="color:#;"&gt;] &amp;lt;- list.ID&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; url = sprintf &lt;/span&gt;&lt;span style="color:#800000;"&gt;"%s/_layouts/listfeed.aspx?List=%s"&lt;/span&gt;&lt;span style="color:#;"&gt; list.ParentWebUrl (list.ID.ToString())&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                row.[&lt;/span&gt;&lt;span style="color:#800000;"&gt;"XmlUrl"&lt;/span&gt;&lt;span style="color:#;"&gt;] &amp;lt;- &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                    this.Page.Request.Url.GetLeftPart(UriPartial.Authority) +&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                    SPUtility.MapWebURLToVirtualServerURL(list.ParentWeb,url)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                table.Rows.Add(row)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            Seq.iter buildrow list&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            view.DataKeyNames &amp;lt;- [|&lt;/span&gt;&lt;span style="color:#800000;"&gt;"XmlUrl"&lt;/span&gt;&lt;span style="color:#;"&gt;|]&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            view.DataSource &amp;lt;- table&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            view.DataBind()&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    [&amp;lt;WebBrowsable(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#;"&gt;);&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;      Category(&lt;/span&gt;&lt;span style="color:#800000;"&gt;"Configuration"&lt;/span&gt;&lt;span style="color:#;"&gt;);&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;      Personalizable(PersonalizationScope.User);&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;      DefaultValue(&lt;/span&gt;&lt;span style="color:#800000;"&gt;""&lt;/span&gt;&lt;span style="color:#;"&gt;);&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;      WebDisplayName(&lt;/span&gt;&lt;span style="color:#800000;"&gt;"Xml Url"&lt;/span&gt;&lt;span style="color:#;"&gt;);&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;      WebDescription(&lt;/span&gt;&lt;span style="color:#800000;"&gt;"F# RSS Feed XML URL"&lt;/span&gt;&lt;span style="color:#;"&gt;)&amp;gt;]&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;member&lt;/span&gt;&lt;span style="color:#;"&gt; this.XmlUrl&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;       &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;with&lt;/span&gt;&lt;span style="color:#;"&gt; get() = xmlurl&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;       &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;and&lt;/span&gt;&lt;span style="color:#;"&gt; set value = &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#;"&gt; String.IsNullOrEmpty(xmlurl) &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;then&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;let&lt;/span&gt;&lt;span style="color:#;"&gt; uri = &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#;"&gt; Uri(value)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                xmlurl &amp;lt;- uri.AbsolutePath  &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;else&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                xmlurl &amp;lt;- &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;interface&lt;/span&gt;&lt;span style="color:#;"&gt; IWebPartField &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;with&lt;/span&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;member&lt;/span&gt;&lt;span style="color:#;"&gt; this.Schema  &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;with&lt;/span&gt;&lt;span style="color:#;"&gt; get() =  &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;                TypeDescriptor.GetProperties(this).Find(&lt;/span&gt;&lt;span style="color:#800000;"&gt;"XmlUrl"&lt;/span&gt;&lt;span style="color:#;"&gt;,&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;&lt;span style="color:#;"&gt;)&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;member&lt;/span&gt;&lt;span style="color:#;"&gt; this.GetFieldValue (callback:FieldCallback) =&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            (this :&amp;gt; IWebPartField).Schema.GetValue(this)&lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;            |&amp;gt; callback.Invoke&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#;"&gt;        &lt;/span&gt;&lt;br&gt;&lt;span style="color:#;"&gt;    [&amp;lt;ConnectionProvider(&lt;/span&gt;&lt;span style="color:#800000;"&gt;"XmlUrl Provider"&lt;/span&gt;&lt;span style="color:#;"&gt;)
