Idag gästspelade jag på Pontus Haglunds sommarkollo-semiarie "Sharepoint för utvecklare" och visade hur lätt det är att integrera Silverlight i Sharepoint.

Mina slides finns här (jag är förstås grymt avundsjuk på Pontus som körde sina slides med pptPlex).

Jag visade dels hur du kan lägga till en Sharepoint-webpart för att kunna använda Vertigos underbara Slide.Show Silverlight 1.0-bildvisare (as featured on MSDN.se!).

Koden för min webpart nedan:

 

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Web.UI;
using System.Web.UI.WebControls.WebParts;
using System.ComponentModel;
using System.Text;
 
namespace SLDemo1
{
    [Guid("02b3a17c-b19e-42de-bafa-eb5da4268c23")]
    public class SLDemo1Webpart : Microsoft.SharePoint.WebPartPages.WebPart
    {
        private bool error = false;
 
        private string silverlightJSPath = "/_layouts/Silverlight/";
        private string slideShowJS = "SlideShow/SlideShow.js";
 
        
        [Browsable(true),
        Personalizable(), WebBrowsable,
        Category("Custom Settings"),
        DefaultValue("/_layouts/Silverlight/"),
        Description("Silverlight JS path - ex:/_layouts/Silverlight/")]
        public string SilverlightJSPath
        {
            get
            {
                return silverlightJSPath;
            }
 
            set
            {
                silverlightJSPath = value;
            }
        }
 
        [Browsable(true),
        Personalizable(), WebBrowsable,
        Category("Custom Settings"),
        DefaultValue("SlideShow/SlideShow.js"),
        Description("SlideShow js subpath + name - ex: SlideShow/SlideShow.js")]
        public string SlideShowJS
        {
            get
            {
                return slideShowJS;
            }
 
            set
            {
                slideShowJS = value;
            }
        }
 
        public SLDemo1Webpart()
        {
            this.ExportMode = WebPartExportMode.All;
        }
 
        /// <summary>
        /// Create all your controls here for rendering.
        /// Try to avoid using the RenderWebPart() method.
        /// </summary>
        protected override void CreateChildControls()
        {
            if (!error)
            {
                try
                {
 
                    base.CreateChildControls();
                    StringBuilder sb = new StringBuilder();
                    sb.Append("<div id='SilverlightControlHost" + this.ClientID + "' Class=''>");
                    sb.Append("<script type=\"text/javascript\"> ");
                    sb.Append("new SlideShow.Control(new SlideShow.XmlConfigProvider());");
                    sb.Append("</script></div>");
 
                    // Your code here...
                    this.Controls.Add(new LiteralControl(sb.ToString()));
                }
                catch (Exception ex)
                {
                    HandleException(ex);
                }
            }
        }
 
 
 
        protected override void OnPreRender(EventArgs e)
        {
 
            String jsString;
            jsString = "<script type=\"text/javascript\" src=\"" + silverlightJSPath + slideShowJS + "\"></script>\n";
 
            if (!Page.ClientScript.IsClientScriptBlockRegistered("SlideShowJS"))
                Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "SlideShowJS", jsString);
 
            jsString = "<script type=\"text/javascript\" src=\"" + silverlightJSPath + "Silverlight.js\"></script>\n";
 
            if (!Page.ClientScript.IsClientScriptBlockRegistered("SilverlightJS"))
                Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "SilverlightJS", jsString);
        }
 
        /// <summary>
        /// Ensures that the CreateChildControls() is called before events.
        /// Use CreateChildControls() to create your controls.
        /// </summary>
        /// <param name="e"></param>
        protected override void OnLoad(EventArgs e)
        {
            if (!error)
            {
                try
                {
                    base.OnLoad(e);
                    this.EnsureChildControls();
 
                    // Your code here...
                }
                catch (Exception ex)
                {
                    HandleException(ex);
                }
            }
        }
 
        /// <summary>
        /// Clear all child controls and add an error message for display.
        /// </summary>
        /// <param name="ex"></param>
        private void HandleException(Exception ex)
        {
            this.error = true;
            this.Controls.Clear();
            this.Controls.Add(new LiteralControl(ex.Message));
        }
    }
}

 

Jag visade även hur du kan bygga en generisk Sharepoint Webpart som kan rendera en Silverlight 2-applikation utifrån valfri .XAP-fil som du refererar till (förutsatt förstås att Silverlight-applikationen "står på egna ben" som Pontus så galant översatte "self contained" till).

Här är koden för min generiska Silverlight 2-webpart:

 

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Web.UI;
using System.Web.UI.WebControls.WebParts;
using System.Text;
 
namespace GenericXAPWebPart
{
    [Guid("27ba16c8-ae2e-4e21-b43f-316f0518d667")]
    public class GenericXAPWebPart : Microsoft.SharePoint.WebPartPages.WebPart
    {
        private bool error = false;
        private string xap = null;
 
        [Personalizable(PersonalizationScope.Shared)]
        [WebBrowsable(true)]
        [System.ComponentModel.Category("Custom Settings")]
        [WebDisplayName("XAP-fil")]
        [WebDescription("Sökväg och namn på XAP-fil")]
        public string XAP
        {
            get
            {
                if (xap == null)
                {
                    xap = "error";
                }
                return xap;
            }
            set { xap = value; }
        }
 
 
        public GenericXAPWebPart()
        {
            this.ExportMode = WebPartExportMode.All;
        }
 
        /// <summary>
        /// Create all your controls here for rendering.
        /// Try to avoid using the RenderWebPart() method.
        /// </summary>
        protected override void CreateChildControls()
        {
            if (!error)
            {
                try
                {
                    base.CreateChildControls();
                    StringBuilder sb = new StringBuilder();
 
                    sb.Append("<object style='width: 100%; height: 100%' type='application/x-silverlight'>');
                    sb.Append("<param name='source' value='" + xap + "' />");
                    sb.Append("<param name='version' value='2.0' />");
                    sb.Append("<param name='enableHtmlAccess' value='true' />");
                    sb.Append("</object>");
 
                    this.Controls.Add(new LiteralControl(sb.ToString()));
                }
                catch (Exception ex)
                {
                    HandleException(ex);
                }
            }
        }
 
        /// <summary>
        /// Ensures that the CreateChildControls() is called before events.
        /// Use CreateChildControls() to create your controls.
        /// </summary>
        /// <param name="e"></param>
        protected override void OnLoad(EventArgs e)
        {
            if (!error)
            {
                try
                {
                    base.OnLoad(e);
                    this.EnsureChildControls();
 
                    // Your code here...
                }
                catch (Exception ex)
                {
                    HandleException(ex);
                }
            }
        }
 
        /// <summary>
        /// Clear all child controls and add an error message for display.
        /// </summary>
        /// <param name="ex"></param>
        private void HandleException(Exception ex)
        {
            this.error = true;
            this.Controls.Clear();
            this.Controls.Add(new LiteralControl(ex.Message));
        }
    }
}