TFS API - Exemples en C#

 06/09/2017 |   Admin |  C#


Se connecter au team project :

Pour la démo je mets les settings directement dans les classes/méthodes. Dans la vrai vie, on utilisera un fichier de conf ou autre ;)

public static Uri CollectionUri = new Uri("https://adresse-serveur-tfs/tfs/DefaultCollection");
public static NetworkCredential NetworkCredential = new NetworkCredential(@"login", "pwd"); 

TfsTeamProjectCollection teamProjectCollection = new TfsTeamProjectCollection(CollectionUri , NetworkCredential ); 
workItemStore = teamProjectCollection.GetService(); 

if (!teamProjectCollection.HasAuthenticated) { 
    throw new Exception("Not Authenticated"); 
} 

// Ici seront faites, toutes les opérations (read + write)
teamProjectCollection.Dispose(); 

 

Lire un WorkItem

 

// Ici on souhaite obtenir un WI en fonction de son titre.
string query = "SELECT * FROM Issue WHERE Title = '" + title + "'";

WorkItemCollection workItemCol = workItemStore.Query(query); // Exécution de la requête
WorkItem workItem = workItemStore.Query(query)[0]; // récupération du WI

#if DEBUG
	// Liste tous les champs du WI, très utile en debug pour connaître le nom des champs
     	var filedsStr = string.Join(" - ", workItem.Fields.Cast().Select(f => f.ReferenceName).ToList());

#endif
      	// get title
        var
...

Lire >>

Pierre-Henri - L'appli windows phone

 24/05/2016 |   Admin |  Windows phone


L'application Pierre-Henri pour windows phone vient de voir le jour. Le but de développer cette application était avant tout pour le fun et aussi pour tester les possibilités du CMS Orchard.

J'ai donc développé une API "Orchard.PhApi" (qui sera prochainement disponible sous forme de plugin). Cette API permet de requêter Orchard afin d'obtenir le contenu dont j'avais besoin pour l'application mobile, à savoir, le contenu des pages et du blog.

L'application est disponible via cette url : http://windowsphone.com/s?appid=91f66219-d58b-40cc-a547-a3028214d984

L'application affiche le menu et le contenu dynamiquement en fonction de l'API Orchard. Cette application mobile pourra donc être connectée à n'importe quel site Orchard, c'est pour cette raison que j'essairai d'en faire un projet open source, soit windows universal app, ou alors un projet Xamarin.

Un post plus détaillé mettera en avant les technos utilisées pour réaliser au mieux cette appli.

Lire >>

Windows phone 10 - Afficher un popup de confirmation avant de fermer l'application

 24/05/2016 |   Admin |  Windows phone


Dans une application universelle, pour la famille Windows Phone, l'appui sur le bouton Back entraine un retour sur la page précédente. Si cette dernière est la première page de l'application, l'application va se fermer.

Ce fonctionnement est logique mais un utilisateur peut utiliser cette fonction intentionnellement. C'est pour cela que l'ajout d'un popup de confirmation peut-être utile dans certains cas.

Dans la méthode OnLaunched de la classe App (App.xaml.cs)

Dans un premier temps, il faut tester si le device est un téléphone et si le bouton back est présent :

if (ApiInformation.IsTypePresent("Windows.Phone.UI.Input.HardwareButtons"))
{
    HardwareButtons.BackPressed += OnBackPressed;
}

Ensuite, déclarer une méthode privée au sein de cette même classe :

private async void OnBackPressed(object sender, BackPressedEventArgs e)
{
    var frame = (Frame)Window.Current.Content;
    e.Handled = true;

    if (frame.CanGoBack)
    {        
        frame.GoBack();
    }
    else
    {
        var msg = new MessageDialog("Etes-vous sûr de vouloir quitter l'application ?");
        var okBtn = new UICommand("Oui");
        var cancelBtn = new UICommand("Non");
        msg.Commands.Add(okBtn);
        msg.Commands.Add(cancelBtn);
        IUICommand result = await msg.ShowAsync();
 
       if (result != null && result.Label == "Oui")
       {
            Application.Current.Exit();
       }
    }
}

[Capture]

Lire >>

FileHelper pour Winrt - Windows Phone et Windows 8.1

 05/04/2016 |   Admin |  Xamarin


Il existe des API du Framework .NET qui n'existent pas dans les API .NET des Windows Store Apps.

Par exemple Sytem.IO, dans l'API .Net pour les Windows Apps ne contient pas System.IO.IsolatedStorage mais Windows.Storage.

Cette API fournit un comportement similaire mais son utiliastion est très différente. 

Après le développement de plusieurs applications Windows Store, j'ai remarqué que le développement d'une classe FileHelper serait utile.

En effet, des méthodes comme FileExists() ou FolderExists() ne sont pas proposés par Windows.Storage alors que leur utilisation est quasiment inévitable.

J'ai donc décidé de mettre ce code sur GitHub pour qu'il puisse être réutilisé et amélioré. Le code source ainsi que le sample d'une Universal Apps sont disponibles.

Voici la liste des fonctions majeures proposées :

FileHelper :

FileExistsAsync()

FolderExistsAsync()

GetFileStreamAsync()

GetContentFromFileAsync()

GetFileBytesAsync()

WriteToFileAsync()

ConvertStorageFileToBase64StringAsync()

EnumerateFilesAsync()

GetSubFoldersAsync()

DeserialiseXml<T>()

ZipHelper :

ZipFileAsync()

UnZipFileAsync()

Vous pouvez retrouver ce projet sur GitHub et le package nuget correspondant : Ph.WinRtFileHelper

Lire >>

Publier une application Windows sans passer par le Store et sans avoir de compte développeur

 06/11/2015 |   Admin |  Universal Windows Platform


Pour tester une application Windows store, vous serez quasiment obligé d'éxécuter l'application sur des tablettes et des PC en mode Debug sans passer par le Store.

Pour publier une application Windows 8 ou Windows 10 sans passer par le Store "SideLoading" il suffit de :

1) Créer les packages de l'application

Clic droit sur le projet, puis Windows Store > Créer des packages d'application...

Répondre Non à la question suivante, puis Suivant

Il faudra au moins sélectionner la cible x86 ou x64 en fonction de la plateforme ciblée.

2) Hack du script d'installation

Cette étape est nécessaire seulement si la machine cible n'est pas équipée de Visual Studio et que l'on ne désire pas saisir de compte développeur Windows.

Ouvrir le fichier "Add-AppDevPackage.ps1" généré précedemment, avec un éditeur de texte et rechercher la ligne suivante:

$NeedDeveloperLicense = CheckIfNeedDeveloperLicense

Remplacer par:

$NeedDeveloperLicense = $false

3) Installation de l'éxécutable

 Sur la tablette ou le PC client, copier le dossier généré précédemment. Ouvrir le dossier ayant la version désirée, puis faire un clic droit sur le fichier "Add-AppDevPackage.ps1" et "Exécuter avec PowerShell'

Suivre les instructions, appuyer sur entrer

Installation du certificat de test, entrer « Y / O / U » pour continuer (en fonction de la langue) 

Installation terminée, appuyer sur entrer

La tuile pour démarrer l’application apparait sur le menu de démarrage (Sur Windows 10, elle apparaitra dans le menu démarrer « applications récentes » 

4) Autoriser Windows à executer des applications de confiance (allow trusted apps to run) 

Comme dans l'étape 2, si Visual Studio est installé sur le poste, cette étape est inutile. Sinon il faudra mettre à jour une clé dans la base de registre.

Ouvrir l’éditeur de stratégie de groupe locale avec gpedit.msc et changer les 2 valeurs suivantes : (Seulement la première pour Windows 8)

En anglais : Local Computer Policy > Computer Configuration > Administrative Templates > Windows Components > App Package Deployment > Allow all trusted apps to install setting Les clés suivantes vienent dêtre créées :

HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Appx\AllowAllTrustedApps = 1 HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Appx\AllowDevelopmentWithoutDevLicence = 1

Pour Windows 10, il sera également nécessaire d’activer le mode développeur : Cortana -> « développeur ». De plus la clé de registre AllowDevelopmentWithoutDevLicence ne sera pas présente dans gEdit.

Et voila, votre application est installée sans être passé par le Store ;)

Lire >>

Implémentation de "User Dialogs" pour Windows phone 8, Windows 8 et Xamarin pour Windows

 04/11/2015 |   Admin |  Xamarin


Voici un exemple d'implémentation du plugin UserDialogs pour la plateforme Windows.

L'auteur du plugin a indiqué qu'il ne supportera pas Windows 8. Il préfère se concentrer sur le développement du plugin pour Windows 10.

ConfirmAsync

public async Task<bool> ConfirmAsync(string message, string title = null, string okText = "OK", string cancelText = "Cancel")
{
   var messgeDialog = new MessageDialog(message, title);
   messgeDialog.Commands.Add(new UICommand(okText));
   messgeDialog.Commands.Add(new UICommand(cancelText));
   messgeDialog.DefaultCommandIndex = 0;
   messgeDialog.CancelCommandIndex = 1;
   var result = await messgeDialog.ShowAsync();
   if (result.Label.Equals(okText))
   {
      return true;
   }
   else
   {
      return false;
   } 
}

AlertAsync

public async Task AlertAsync(string message, string title = null, string okText = "OK")
{
   var md = new MessageDialog(message, title);
   await md.ShowAsync();
}

PromptAsync

public async Task PromptAsync(string message, string title = null, string okText = "OK", string cancelText = "Cancel", string placeholder = "", bool secure = false)
{
   var dialog = new PromptDialog(message, placeholder);
   var result = await dialog.ShowAsync();
   if (result != null)
   {
      return result;
   }
   else
   {
     
...

Lire >>

Exemples Linq

 02/11/2015 |   Admin |  C#

Tags: linq

Comparer deux listes :

Obtenir les résultats communs entre la list2 et la list1

 var result = list2.Where(l2 => list1.Any(l1 => l1.Id == l2.Id)).ToList();

Obtenir les résultats de list1 qui ne sont pas dans list2

var result = list1.Where(l2 => !list2.Any(l1 => l1.Id == l2.Id)).ToList();

Lire >>

Tutorial - Créer une application mobile et desktop avec Mvc3

 02/06/2015 |   Admin |  Javascript


Dans ce tutorial nous allons voir la facon la plus simple de développer une application web a la fois compatible 'desktop' et mobile. Avec l'apparence d'une apps.

Pour cela nous allons utiliser le plugin 51Degrees et Jquery Mobile.

Avec cette méthode, le contenu de l'application web et le contenu de l'application desktop seront les memes mais présentés de facon tres différentes. Dans une application professionnelle, souvent on souahite un site assez différent de l'application web. Nous verrons cela dans un autre tutorial mais le principe de base sera quasiment le meme.

Avec MVC4, tout sera déja intégré, mais en attendant l'arrivée de MVC4 c'est ici que ca se passe !

1) Créer une nouvelle application web de type MVC3:

 

 

2) Créer une nouvelle mise en page (layout) pour les mobiles

Copier coller le layout par defaut et le renommer _LayoutMobile.cshtml. Pour les futurs tests, vous pouvez rajouter un texte pour différencier les vues:

3) Modifier le "sélectionneur de mise en page" /Views/_ViewStart.cshtml

Remplacer:

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

Par:

@{
    Layout = Request.Browser.IsMobileDevice ? "~/Views/Shared/_LayoutMobile.cshtml" : "~/Views/Shared/_Layout.cshtml";
}

4) Tester notre application avec un navigateur de type Desktop et avec un émulateur mobile

Si vous ne voullez pas vous embeter avec un émulateur je vous conseil d'utiliser firefox avec l'extension User Agent Switcher

Sinon vous pouvez utiliser l'émulateur windows phone fournit par le windows phone sdk, ou l'émulateur iphone/ipad disponnible ici.

C'est partit pour les tests:

- Desktop (ici avec Firefox)

- Mobile (ici avec ibbdemo3)

Nous pouvons voir le texte "Hello I am a mobile"affiché

5) Probleme avec cette technique :

Tous les appareils et navigateur mobiles ne sont pas détecté par défaut avec le framework .Net

Example avec opera mobile :

C'est la version desktop qui est affiché

Pour remédier a ce problème, c'est ici que le plugin 51Degrees intervient

6) Installation du plugin 51Degrees

Pour cela, ouvrir la console NuGet package manager (Ou directement avec l'outil NuGet) et entrer la commande : Install-Package 51Degrees.mobi

Première chose a faire :

Plusieurs fichiers ont été créés, ouvrir le fichier de configuration 51Degrees.mobi.config et commenter ces lignes (Ces lignes servent uniquement pour une application ASP.NET):

<!--<redirect firstRequestOnly="false"
              mobileHomePageUrl="~/mobile/default.aspx"
              timeout="20"
              devicesFile="~/App_Data/Devices.dat"
              mobilePagesRegex="mobile">
</redirect>-->

Apres avoir compiler et rafraichi opera mobile, notre application est opérationelle pour la pluspart des mobiles du marché (De plus 51Degrees peut recevoir des mises a jour)

7) Maintenant a vous de personnaliser le design de votre application mobile

Courte introduction a jQueryMobile:

Retour a la console NuGet: Install-Package jquery.mobile

Que se passe t-il, il y a des fichiers partout ! Pas de panique... On va arranger ca.

Dans le dossier theme, creer un dossier 'mobile' et déposez y tous les fichiers liés a Jquery mobile. Deplacez le fichier Site.css dans le theme 'base'.

Ne pas oublier de mettre a jour _Layout.cshtml avec le theme par defaut et la nouvelle version de JQuery.

Voici a quoi ressemble le layout _LayoutMobile.cshtml pour utiliser jQueryMobile:

<link href="@Url.Content("~/Content/themes/mobile/Site.css")" rel="stylesheet" type="text/css" />
<link href="@Url.Content("~/Content/themes/mobile/jquery.mobile-1.1.1.min.css")" rel="stylesheet" type="text/css" />
<script src="@Url.Content("~/Scripts/jquery-1.6.4.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.mobile-1.1.1.min.js")" type="text/javascript"></script>

Nous pouvons maintenant commencer a faire joujou avec les éléments jQuery mobile :

<div data-role="page" class="page">
        <div data-role="header">
            <div id="title">
                <h1>My Mobile MVC Application</h1>
            </div>
            <div id="logindisplay">
                @Html.Partial("_LogOnPartial")
            </div>
            <div data-role="navbar">
                <ul>
                    <li>@Html.ActionLink("Home", "Index", "Home")</li>
                    <li>@Html.ActionLink("About", "About", "Home")</li>
                </ul>
            </div>
        </div>
        <section id="main" style="min-height: 300px">
            @RenderBody()
        </section>
        <div data-role="footer" style="text-align: center">
            Copyright : @DateTime.Now.Year
        </div>
</div>

Pour plus d'exemples : go to http://jquerymobile.com/demos

8) Résultat final:

Voila c'est fini !

Lire >>