Queremos crear web parts Silverlight y que todos ellos compartan las mismas propiedades básicas y el mismo método render. Así que extendiendo Microsoft.SharePoint.WebPartPages.WebPart crearemos un BaseSilverlightWebPart con estas características (overridando
La clase base quedó así:
public abstract class BaseSilverlightWebpart : Microsoft.SharePoint.WebPartPages.WebPart { #region Web Part Properties [Personalizable(PersonalizationScope.Shared)] [WebBrowsable(true)] [System.ComponentModel.Category("Stratex")] [WebDisplayName("XAP List URL")] [Description("Select the URL of the XAP list.")] public string XAPListUrl { get; set; } #endregion #region Private Properties Dictionary<string, string> InitParams; #endregion #region Abstract /// <summary> /// Setup here the of the XAP you will use /// </summary> public abstract string XAPName { get; } /// <summary> /// Setup here the initial parameters you will use in your Silverlight Web Part /// </summary> public abstract void SetUpParameters(); #endregion #region Methods public void AddParameter(string Name, string Value) { if (InitParams == null) InitParams = new Dictionary<string, string>(); if (InitParams.ContainsKey(Name)) InitParams[Name] = Value; else InitParams.Add(Name, Value); } #endregion #region Overrides protected override void CreateChildControls() { SetUpParameters(); if (string.IsNullOrEmpty(XAPListUrl)) XAPListUrl = string.Format("{0}/Lists/XAPLibrary/", SPContext.Current.Web.ServerRelativeUrl); //Sometimes when you create the web part it's 0px by 0px... ¬ ¬ if (string.IsNullOrEmpty(Height)) Height = "150px"; if (string.IsNullOrEmpty(Width)) Width = "150px"; LiteralControl obj = new LiteralControl(); obj.Text = "<object id='silverlightHost' height='" + Height + "' width='" + Width + @"' data='data:application/x-silverlight-2,' type='application/x-silverlight-2' style='display:block' class='ms-dlgDisable'> <param name='Source' value='" + XAPListUrl + XAPName + @"' /> <param name='MinRuntimeVersion' value='3.0.40624.0' /> <param name='Background' value='#00FFFFFF' /> <param name='windowless' value='true' /> <param name='autoUpgrade' value='true' /> "; if (InitParams.Count > 0) { obj.Text +="<param name='initParams' value='"; int i = 0; foreach (var param in InitParams) { if (i++ == 0) obj.Text += string.Format("{0}={1}", param.Key, param.Value); else obj.Text += string.Format(", {0}={1}", param.Key, param.Value); } obj.Text += @"' /> "; } obj.Text += @"<a href='http://go.microsoft.com/fwlink/?LinkID=149156&v=3.0.40624.0' style='text-decoration: none;'> <img src='http://go.microsoft.com/fwlink/?LinkId=108181' alt='Click here to install Silverlight' style='border-style: none'/> </a> </object>"; this.Controls.Add(obj); } #endregion }Extendiéndola podemos crear un web part Silverlight fácilmente:
public class DynamicStrategyMap : BaseSilverlightWebpart { #region Overrides public override string XAPName { get { return "StratexPointStrategyMap.xap"; } } public override void SetUpParameters() { AddParameter("site", HttpUtility.UrlEncode(SPContext.Current.Web.ServerRelativeUrl)); } #endregion }Fíjate que no tienes que overridar
También podemos añadir propiedades nuevas como aquí:
public class StratexHeartBeat : BaseSilverlightWebpart { #region WebPartProperties [Personalizable(PersonalizationScope.Shared)] [WebBrowsable(true)] [System.ComponentModel.Category("Stratex")] [WebDisplayName("NumberOfEvents")] public string NumberOfEvents { get; set; } [Personalizable(PersonalizationScope.Shared)] [WebBrowsable(true)] [System.ComponentModel.Category("Stratex")] [WebDisplayName("TimerLapse")] public string TimerLapse { get; set; } [Personalizable(PersonalizationScope.Shared)] [WebBrowsable(true)] [System.ComponentModel.Category("Stratex")] [WebDisplayName("Indicator Summary Url")] public string IndicatorSummaryUrl { get; set; } #endregion #region Overrides public override string XAPName { get { return "StratexHeartBeat.xap"; } } public override void SetUpParameters() { AddParameter("site", HttpUtility.UrlEncode(SPContext.Current.Web.Url)); if (string.IsNullOrEmpty(IndicatorSummaryUrl)) IndicatorSummaryUrl = string.Format("{0}/Lists/WebPartPages/IndicatorSummary.aspx", SPContext.Current.Web.ServerRelativeUrl); AddParameter("indicatorsummaryurl", IndicatorSummaryUrl); if (Common.ConvertToInt(NumberOfEvents) < 1) NumberOfEvents = "1"; AddParameter("numberofnews", NumberOfEvents); if (Common.ConvertToInt(TimerLapse) < 1) TimerLapse = "1"; AddParameter("timerlapse", TimerLapse); } #endregion }O incluso podemos añadir más código al método render overridando el método render overridado en la clase base
public class Commentary : BaseSilverlightWebpart { #region Overrides public override string XAPName { get { return "Commentary.xap"; } } public override void SetUpParameters() { AddParameter("site", HttpUtility.UrlEncode(SPContext.Current.Web.ServerRelativeUrl)); } protected override void CreateChildControls() { base.CreateChildControls(); //We are using this code to be able to close the explorer window from Silverlight LiteralControl JavaScript = new LiteralControl(); JavaScript.Text = @"<script type='text/javascript'> function doCloseLocal() { var version = parseFloat(navigator.appVersion.split('MSIE')[1]); if (version >= 7) {window.open('', '_parent', ''); } else { window.opener = self; } window.close(); } </script>"; this.Controls.Add(JavaScript); } #endregion }Fíjate también que antes de añadir el nuevo control hemos llamado al render de la clase base para que el web part se renderice
Y esta es la pinta que tiene el override en la vida real. Ahora sí que tiene sentido…
No hay comentarios:
Publicar un comentario