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