Canviar la pantalla Splash de Windows Phone

windows_phone_logo-300x300

Una aplicación amb Windows Phone crea una imatge Splash anomenada SplashScreenImage.jpg.

 

Si volem canviar sempre hem de conservar el nom i l’extensió. Per tant estem molt limitats. Espero que canvii.

Anuncis

Starting custom Sharepoint timer programatically II

A few days ago I wrote about How to start custom SharePoint timer programatically. In this post, I talked about the problems that we could find before starting a Sharepoint timer programatically.

Today, I want to expand on this topic with another post. First, I want to talk about instruccions that we need for starting the timer.

Below, there is a piece of code to start the timer programatically.

public staticvoid StartJob(thisSPSite Site, string JobName, Dictionary<string, object> properties)

{

SPSecurity.RunWithElevatedPrivileges(delegate()

{

   using (SPSite elevatedSite = newSPSite(Site.ID))

{

     SPSite site = elevatedSite;

     SPJobDefinition myjob = FindJob(elevatedSite,JobName);

foreach(string k in properties.Keys)

{

myjob.Properties[k] = properties[k];

}

myjob.RunNow();

}

});

}

It’s nothing special. Maybe the way that we can find the timer job instance is a bit important to know how to avoid problems.

public staticSPJobDefinition FindJob(thisSPSite elevatedSite, string JobName)

{

 SPJobDefinition myjob = null;

 foreach (SPJobDefinition job in elevatedSite.WebApplication.JobDefinitions)

{

   if (job.Name.Equals(JobName, StringComparison.OrdinalIgnoreCase))

{

myjob = job;

      break;

}

}

 return myjob;

}

In timer job, also, there is a way to bypass parameters by properties. This properties could be persistent or not, it depends on how you declare it in timer job.

It’s very common that a timer job is instantiate in site level and we need to execute to web level. This kind of problem can be resolved using properties. You can see an example on this lines.

Dictionary<string, object> properties = newDictionary<string, object>();

properties.Add(“isManual”, true);

properties.Add(“force-web-id”, SPContext.Current.Web.ID);

SPContext.Current.Web.Site.StartJob(JobDefinition.Name, properties);

And what about its status? Reading the status of timer job could be a little complicated. You need to reiterate the status list and get the last log written by the job. For example if job is running:

public static bool IsJobRunning(thisSPSite Site, string JobName)

{

 bool isrunning = false;

 InformationJob ijob = newInformationJob();

 SPSecurity.RunWithElevatedPrivileges(delegate()

{

  using (SPSite elevatedSite = newSPSite(Site.ID))

{

    SPJobDefinition myjob = FindJob(elevatedSite,JobName);

    if (myjob.IsDisabled)

{

isrunning = false;

}

    else

{

      try

{

         var e = myjob.HistoryEntries.OrderByDescending(i => i.StartTime).First();

isrunning = e.Status ==SPRunningJobStatus.Initialized;

}

      catch

{

isrunning =false;

}

}

}

});

 return isrunning;

}

I recommend creating another list to register your own log and to set one mark for knowing when it begins and another for knowing when it finishes. Here you can see an example of the list:

logjob

So, in this way, you only need to read your own log and find the mark that tells you what the status of your job is. For example if  job is finished:

private bool IsJobFinished()

{

  bool isFinished = false;

InformationJob ijob = newInformationJob();

SPSecurity.RunWithElevatedPrivileges(delegate()

{

using (SPSite elevatedSite = newSPSite(SPContext.Current.Site.ID))

{

SPJobDefinition myjob = FindJob(elevatedSite);

if (myjob.IsDisabled)

{

isFinished =false;

}

     else

{

        try

{

          SPList listLog = SPContext.Current.Web.GetListByUrl(JobDefinition.LogListUrl);

          if (listLog.Items.Count == 0)

{

isFinished =true;

}

          else

{

            var joblog = listLog.Items.OfType<SPListItem>().Where(i =>

i[“TypeMessage”].ToString() == TypeMessageLogJobs.End.ToString() &&

((DateTime)i[“Timestamp”]).CompareTo(listLog.Items.OfType<SPListItem>().Max(ii => (DateTime)ii[“Timestamp”])) == 0 ).First();

isFinished =true;

}

}

catch

{

isFinished =false;

}

}

}

});

   return isFinished;

}

Navegación a paginas XAML de otros ensamblados

Tanto en WPF como en Silverlight como en Windows Phone trabajamos con ventanas escritas en XAML que son XML que definen la interface de usuario.

Puede ser muy habitual tener definidas estas ventanas en otros ensamblados, como por ejemplo librerías, y en el momento de querer navegar hasta esta ventana tenemos la duda de como se puede hacer ya que el servicio de navegación en WPF funciona con Uri.

Así que, cual es la Uri de una ventana definida en otro ensamblado?

/{assemblyName};component/{pathToResource}

Como por ejemplo : “/SharedPages;component/TestPage.xaml” donde SharedPages es el nombre del ensamblado y /TestPage.xaml la ruta a partir de la raíz del proyecto para encontrar la ventana.

Canviar la pàgina d’inici en Windows Phone

windows_phone_logo-300x300

Amb un dels projectes que estic treballo amb Windows Phone, concretament amb Windows Phone 8. M’he trobat amb la necessitat de modificar la pàgina d’inici de l’aplicació. Pensant que era com les aplicacions WPF de escriptori entro a les propietats del projecte i em fixo amb la propietat “Objeto de inicio” i veig qu correctament està posat en App. Així que miro dins la classe App de la meva aplicació tot buscant alguna instrucció que redirigeixi la RootFrame a MainPage.xaml, però tampoc.

És llavors quan em decideixo a buscar per internet com es fa i em trobo amb pàgines que parlen de Windows Phone 7 amb el Visual Studio 2010 em donen la clau de que s’ha de modificar el fitxer WMAppManifest.xml que es troba dins la carpeta Properties del projecte.

Setting start page of Windows Phone dynamically through code

Així que jo, amb el Visual Studio 2012 obro el fitxer i em trobo amb la pantalla següent

wmmanifest1

Efectivament veig el camp que indica la pàgina inicial i la trec, però el Visual Studio 2012 m’avisa amb error de que és obligatori al guardar.

wmmanifest2

Miro el seu codi XML i veig que s’ha guardat en blanc tal i com vull.

wmmanifest3

Compilo tot correcte i funciona.

Així que fet, per canviar la pàgina inicial de una aplicació Windows Phone s’indica des de WMAppManifest.xml