Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

il m'a été demandé, à plusieurs reprises, comment je faisais pour simuler l'envoi de mail lors de mes démos de Workflow Foundation.

Ma solution est plutôt simple : j'utilise la configuration par défaut du SmtpClient et j'oriente les mails vers un dossier local. Dans mes projets de démos et de tests, j'ai toujours la configuration suivante pour mes clients SMTP.

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

  <system.net>

    <mailSettings>

      <smtp deliveryMethod="SpecifiedPickupDirectory">

        <specifiedPickupDirectory pickupDirectoryLocation="D:\mails"/>

      </smtp>

    </mailSettings>

  </system.net>

</configuration>

 

Note : Il faut créer le dossier avant de lancer des tests. Sinon, on obtient un message d'insulte nous disant que le dossier n'existe pas

À partir du moment où j'utilise cette configuration, toutes mes instances de type SmtpClient enverront leurs mails dans mon dossier « D:\mails\ ».

Les avantages sont nombreux :

  • Je peux travailler en déplacement (et sans réseau).
  • Je n'ai rien installé sur mon PC, je n'installerais donc rien sur un serveur de tests.
  • Quand je publie une version en production, la configuration de Release replace cette section (pas besoin de changer le code).
  • Mes projets de tests unitaires peuvent jouer ce code sans polluer ma boite mail.
  • Je peux avoir autant de destinataires que je veux (pour du Workflow, c'est très important).
  • Mes mails ne vont pas inutilement sur internet pour revenir sur mon PC.
  • Je n'attends pas des heures après un mail qui n'arrive pas !

 

 

 

Par une journée de pluie (comme on les aime), un code est tombé de l'étagère d'un collègue. Quand on regarde l'étagère du collègue via Visual Studio, celui-ci est introuvable. Pourtant, il a bien été posé sur l'étagère…

Avec un Visual Studio 2010 sans Power Tools, il est heureusement possible de consulter la liste de Shelvesets de tous les collègues. Pour cela, il suffit de saisir « * », là ou Visual Studio s'attend à voir apparaitre le nom du propriétaire des Shelvesets.

Résultat : un code retrouvé… et une vie sauvée.

Si comme certains, vous vous plaignez de n’avoir plus qu’un graphique affichant l’utilisation globale de vos CPU, sachez qu’il existe une option permettant de revenir à un affichage par CPU.

La mise en œuvre est simple. À partir de l’onglet performance du gestionnaire des tâches, on peut faire un click droit sur le graphique global et on choisit “Processeurs logiques”. 

W8_CPU02

 

Ceci permet d’avoir l’affichage suivant.

W8_CPU03

 

Et pour les amoureux des interfaces minimalistes, l’option “Affichage de résumé du graphique” nous permet d’avoir un boite de dialogue réduite :

W8_CPU04

Elle est pas belle la vie?!

Les ressources de nos très chers serveurs ne sont malheureusement pas illimitées (même dans le cloud). Il arrive toujours un moment où l’on doit se rendre à l’évidence. Soit on joue la guerre à l’armement, soit on se raisonne.

Une fois n’est pas coutume, je vais vous proposer une approche raisonnable. Partons sur un exemple simple. Supposons que vous êtes dans le cas où vous avez créé un service WCF qui accède à une ressource présente sur votre serveur (ex : disques durs, sonde de température, dongle USB, base de données). Vous savez très bien qu’au-delà d’un certain nombre d’utilisations simultané de cette ressource, les performances sont dégradées (voire pire, le matériel n’est plus accessible, ou la base de données passe hors ligne).

Votre esprit s’agite, vous voyez déjà deux ou trois solutions se profiler à l’horizon :

  • Sémaphore
  • Verrous attribués temporairement
  • Mécanisme de synchro maison
  • Singleton pour la gestion du nombre de clients entrants.
  • .. etc…

Mais j’arrive avec mes gros sabots et je dis STOP ! Pourquoi réinventer une roue carrée alors que WCF a de quoi gérer ça via ses behaviors ? (OK : en général quand je dis behavior, tout le monde par en courant)

Qui plus est, il n’y a rien à coder !

Le service doit être lié à un behavior disposant d’un paramètre serviceThrottling. Celui-ci dispose d’un attribut très intéressant, le maxConcurrentInstances (comme sont nom l’indique, il limite le nombre d’instances de votre service).

Par exemple, si mon service ne doit pas avoir plus de 10 instances concurrentes :

<system.serviceModel>
  <behaviors>
    <serviceBehaviors>
      <behavior 
        name="behaviorThrottled">
        <!-- Limite le nombre d'instance du service à 10-->
        <serviceThrottling 
          maxConcurrentInstances="10" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <services>
    <service 
      name="WcfService1.Service1"
      behaviorConfiguration="behaviorThrottled">
      <endpoint 
        binding="netTcpBinding"
        contract="WcfService1.IService1" />
    </service>
  </services>
</system.serviceModel>

Si l’envie vous prend, vous pouvez aussi utiliser les attributs maxConcurrentCalls et maxConcurrentSessions qui peuvent être très pratiques pour limiter l’impact sur le serveur lors de la montée en charge de vos services (ou vous protéger contre des attaques DOS).

Ce matin en voulant installer l'application Windows Phone pour Windows 8, j'ai lancé une petite recherche dans le store :

windows store

Une fois de plus je me suis retrouvé face à une liste bien plus grande que ce dont j'avais besoin. Heureusement, à coup de filtres, j'ai trouvé mon bonheur.

Cette situation ne m'arrivant pas pour la première fois, j'ai beaucoup de mal à comprendre nos "journalistes spécialisés".

Pourquoi s'acharnent-ils encore à dire que le store est vide? (certains auraient-ils peur, de voir baisser la rentabilité de leurs placements boursiers dans une certaine coopérative fruitière?)

Dernièrement, je me suis retrouvé dans une situation absurde. Je ne savais pas où trouver les pack de langues pour un SharePoint Server 2013. Après quelques recherches, je me suis rendu compte que le seul moyen de les télécharger était d’utiliser un abonnement MSDN. Arrivé sur mon espace de téléchargement, j’ai trouvé un beau paquet de fichiers à télécharger… beaucoup trop.

Pour vous éviter de galérer, j’ai pris le temps de faire une petite capture d’écran de ce qu’il faut chercher. A savoir : “Office Server 2013 Language Pack”. Pour l’exemple, j’ai choisi de télécharger le pack “Anglais” et le pack “Français”.

SP2013_Install language pack 01

 

Après téléchargement il suffit de charger l’iso sur son serveur et de lancer le setup.

SP2013_Install language pack 02

 

Il faudra être patient…

SP2013_Install language pack 03

 

Bien entendu, cette patience payera. Mais on sera amené à lancer l’assistant de configuration de SharePoint (là aussi la patience sera de mise)

SP2013_Install language pack 04

 

Quand la configuration de SharePoint est terminée, on peut accéder au panneau de configuration de l’un se ses sites. On peut alors voir apparaitre un lien pour changer la langue du site.

SP2013_Install language pack 05

 

 

Il suffit alors de cocher les langues que l’on veut utiliser. On valider, et le tour est joué. (pour preuve, ma capture d’écran est en français)

SP2013_Install language pack 06

Tada!!!

(Quelles sont loin les galères de WSS)

On l'a dit et redit, vérifier les UserAgent d'un navigateur pour l'exclure d'un site ou pour bloquer des fonctionnalités, c'es mal. Qui plus est le faire à contresens, c'est absurde.

Pour ceux qui se prennent pour dieu, car ils savent trouver le UserAgent, regardez la capture suivante (site EDF dédié aux paiements des factures, client Windows 8 avec IE10).

Bravo le useragent sniffing

Voici une erreur qui saute aux yeux.

Mais il y en a bien d'autres :

  • Sites bloqués alors qu'ils fonctionnent bien avec IE10.
  • Optimisation contre-productive.
  • Hacks qui n'en sont pas
  • .. etc...

Pitié, en 2013, demandez-vous si le sniffing de UserAgent est pertinent avant de le faire.

Avec l’arrivée de .net 4.5, WF a été renforcé de nombreuses fonctionnalités (voir cet article pour en savoir un peu plus) dont la possibilité d’utiliser C# dans un workflow Xaml.

Maintenant, si on créer un workflow, on peut donc utiliser du C# ou du Vb dans ses expressions.

  • Un nouveau workflow créer dans un projet C# utilisera par défaut des expressions C#.
  • Un nouveau workflow créer dans un projet Vb utilisera par défaut des expressions Vb.

Pour les anciens projets WF4 migrés vers WF4.5 les workflows existants ne sont pas modifiés. Ils restent donc avec des expressions Vb. Les règles pour la création de nouveaux workflows sont identiques. Par défaut, donc un ancien projet C# aura ses anciens workflows qui utiliseront des expressions Vb et les nouveaux, des expressions C#.

 

Il est possible de forcer le langage d’expressions d’un workflow

Ceci ne peut malheureusement se faire qu’en modifiant le fichier Xaml à la main. Pour ce faire, il faut ajouter l’a propriété ExpressionActivityEditor.ExpressionActivityEditor à son workflow (et respecter la section des namespaces utilisés par les expression : TextEpression.Namespaces).

Changer langage expression WF4.5

 

Bien entendu, il faudra aussi convertir vos expressions déjà existantes (c’est la partie pas vraiment drôle). Personnellement, je vous encourage à ne pas toucher à vos workflows existants. Je n’ai donné ces indications qu’à titre d’information pour les utilisateurs qui veulent impérativement avoir des expressions C#.

 

Attention au cas des workflows dynamiques ! (souvent issus d’un fichier Xaml déployé par copier-coller, ou extraits d’une base de données)

On ne peut pas le voir quand on créer et que l’on utilise un workflow via Visual Studio, mais un workflow qui utilise des expressions C#, passe obligatoirement par une étape de près-compilation. Le Xaml utilisé n’est donc plus le fichier Xaml que vous avez créé via Visual Studio, mais une version préparée par Visual Studio.

Le fichier que vous avez créé ne peut donc être repris pour être chargé dynamiquement via l’ActivityXamlService sans (ceci pourra faire l’objet d’un autre article). Je vous encourage vivement de n’utiliser que des expressions Vb dans ce type de workflows.

Si vous voulez impérativement utiliser des expressions C# pour ce type de workflows, il faudra donc modifier le code de votre hôte de workflow. Sachez que cette opération est plutôt lourde et qu’elle doit se faire en conservant la compatibilité avec vos instances de workflows déjà persistées. Autant dire que dans un environnement existant, il vaut mieux ne pas changer le langage d’expression.

 

Pensez à vos utilisateurs finaux.

Par expérience, j’ai constaté que les seules personnes intéressées par le fait d’avoir des expressions en C# étaient les développeurs. Les utilisateurs ayant pris l’habitude de Vb au travers d’Office et de Vba, les expressions Vb dans les workflows, ne les perturbent pas. Avant de les faire passer à C#, il faut donc se demander, si ses utilisateurs finaux ne sont pas impactés négativement par ce changement.

Personnellement, je passerai mes expressions en C# quand mes utilisateurs écriront leur macro Excel en C# (Vb vaincra!). Actuellement, j’ai fait le choix de me forcer à utiliser Vb pour mes projets WF4.5 (qu’ils soient en C# ou Vb).

Pour ce qui ne serait pas encore au courant, Google va fermer Google Reader le 1er juillet 2013. Google a ses raisons, et comme toujours, est il est demandé gentiment à l'utilisateur de les comprendre subir.

Depuis quelques années, j'avais pris l'habitude d'attendre avant d'utiliser un service de Google. Car, comme un certain nombre, j'ai subi divers déboires lors des mises à jour de leurs produits. L'avenir d'un service Google étant toujours plus ou moins obscur (tout comme leurs conditions d'utilisation), il fallait être prudent. Mais là, s'en est trop. Google ferme l'un de ses produits les plus connus et met ses utilisateurs à la porte sans leur fournir une alternative. Je ne vais pas m'étaler plus, mais cela me saoule sérieusement.

Avec Google Doc, j'avais tiré la leçon suivante : "Ne jamais utiliser un service Google dans un cadre professionnel."

Avec Google Reader, je conclus que je dois revoir ma position : "Ne jamais utiliser un service Google."

 

PS : Pour les utilisateurs de MyReader sur Windows 8, pas de panique. Le support de Skydrive et des comptes Microsoft est proche, et je travaille sur le support d'autres API.

Depuis peu, les abonnés MSDN peuvent profiter d’un accès gratuit à Office 365. Ils peuvent donc profiter d’Outlook, Skydrive.. et autres joyeusetés d’Office 365, dont SharePoint! voilà donc une belle occasion d’avoir un SharePoint pour ses tests sans pourtant passer trop de temps sur sont installation et à sa maintenance Clignement d'œil.

 

Voici donc la procédure à suivre pour profiter de ce nouvel avantage :

1. Aller sur la page de gestion de votre abonnement MSDN (https://msdn.microsoft.com/subscriptions/manage/default.aspx) et utiliser le lien “Activer l’abonnement développement à Office 635.

Capture 01

2. On accède alors à la page suivante. Celle-ci comprend de nombreux détails, et indications, dont une note très intéressante pour les personnes qui souhaiteraient utiliser cet abonnement pour publier des applications. Je vous encourage donc vivement à lire cette page si vous ne cantonnez pas votre usage aux tests.

Pour poursuivre l’inscription, il faut cliquer sur le lien “S’inscrire sur le Portail Office 365”.

Capture 02

 

3. On est alors amené à saisir ses informations personnelles (information de bases qui serviront à créer votre compte pour l’accès au portail Office 365).

Capture 03

 

4. Après saisie de ses informations personnelles, on peut commencer à “passer commande à 0€”. Il n’y a rien à faire ici. Il faut juste valider.

Capture 04

 

5. Arrive enfin le formulaire, le plus conséquent. Pour résumer, on vous demande les informations légales liées à la facturation (pas de panique, on est toujours sur une offre gratuite). Après validation, on accèdera au résumé de la commande.

Capture 05

 

6. Voici le résumé de la commande qu’il suffira de valider pour finaliser celle-ci.

Capture 06

 

7. Après validation, le portail d’administration s’ouvre et nous demande de saisir des informations qui pourrons nous permettre de récupérer notre mot de passe en cas de perte ou d’oublie de celui-ci.

Capture 07

 

8. Il nous reste alors à associer nos licences à notre compte. Pour cela, il suffit d’aller sur le panneau “utilisateurs et groupes” et de cliquer sur notre compte.

Capture 08

 

9. On peut sélectionner les licences que l’on souhaite utiliser. Dans mon cas, j’ai tout cocher (la case à cocher “Microsoft Office 365 Developer” permet de cocher/décocher toutes les cases). Il suffit ensuite d’utiliser le bouton “enregistrer”. Il peut alors nous être demandé de compléter des informations relatives à notre comte (ex: Pays).

Capture 09

 

10. Le menu en haut du portail change alors et les choses sérieuses peuvent commencer. Voulant utiliser SahrePoint, j’ai cliqué sur le lien “Site d’équipe”.

Capture 10

 

11. Let’s go! On peut enfin jouer avec l’ami SharePoint!

 

Capture 11

building-windows-8-apps-with-c-and-xaml Les Techdays vont être lancés dans quelques heures. Comme les années précédentes, j'y serai dans le cadre du programme ATE. Si vous avez des questions, c'est donc le moment d'en profiter ;)

Pour les plus chanceux, sachez que j'ai à offrir 8 exemplaires de l'excellent livre "Building Windows 8 Apps with C# and XAML" de jérémy Likness à offrir. Si vous avez un projet de deve Windows 8, venez m'en parler (j'offre les livres pour soutenir les projets les plus intéressants).

Techdays 2013

Pour ceux qui ne seraient pas encore au courant (chacun à le droit de jouer les ermites de temps à temps), la mise à jour WP7.8 est arrivée dans les bacs. Comme toujours, certains grogneront après leur opérateur qui a prévu de pousser cette mise à jour à la Saint-Glinglin. D’autres auront de la chance (comme mon Lumia 710). Ou d’autres encore auront un WP qui n’est pas du tout de chez nous (comme mon Focus Flash qui n’a pas trouvé la mise à jour tout seul).

Dans tout les cas, si vous être précède, sachez qu’il y a une manipulation simple pour forcer la mise à jour de son Windows Phone.

Voici la manipulation miracle :

  1. Lancer Zune sans connecter le Windows Phone
  2. Couper la Data et le wifi sur le Windows Phone
  3. Connecter le Windows Phone au PC
  4. Dans Zune, ouvrir,"paramètre" puis "mise à jour". Attendre 1 à 3 secondes et couper l'accès internet du pc.
  5. Attendre.
  6. Attendre (ça peut être long).
  7. Zune annonce alors qu'il a une mise à jour pour le Windows Phone. (si ça n’est pas le cas, déconnecter le Windows Phone, fermer Zune et retenter la manipulation à l’étape 1… il peut arrivé d’avoir à refaire l’opération 2 ou 3 fois)
  8. Rétablir la connexion internet du PC.
  9. Lancer la MAJ.
  10. Aller prendre un café.
  11. Si le Windows Phone n'est pas une bête de courses, aller prendre un second café.
  12. Enjoy!

J'ai passé une paire d'heures à déboguer une vue comportant un SemanticZoom et une énumération implémentant l'interface ISupportIncrementalLoading. Dans un mode, la liste se chargeait bien, dans l'autre, rien ne se passait.

Mon erreur était toute bête : j’utilisai un VariableSizedWrapGrid. Il me fallait utiliser un WrapGrid.

L'interface ISupportIncrementalLoading ne peut être utilisée que pour afficher des contrôles de tailles identiques. De par sa nature, le VariableSizedWrapGrid est destiné à accueillir des contrôles de tailles variées. Il ne sait donc pas utiliser l'interface ISupportIncrementalLoading.

Si vous avez l'intention d'utiliser une énumération implémentant l'interface ISupportIncrementalLoading, n'utilisez pas de VariableSizedWrapGrid. Cela ne fonctionnera pas.

Ces dernières années ont été pour moi l'occasion de côtoyer des décideurs et des utilisateurs qui ne connaissaient rien (mais alors vraiment rien) au monde des NTIC. L'actualité informatique et les nouveautés associées étaient restreintes aux informations « grand public » (autant dire le journal du 20h sur TF1). Parmi eux, se trouvait souvent le Geek (ou tout du moins, une personne qui revendiquait le titre de Geek comme un honneur). Cette personne est souvent connue sous le nom du «copain qui s'y connait en informatique ».

J'ai souvent côtoyé ce genre de public par le passé, mais ce qui m'a surpris, c'est cette volonté croire qu'il n'existait rien d'autre que ce qu'ils savaient.

Ex : Un jour j'explique qu'il faudra s'intéresse à de nouveaux matériels de type hybrides (tablette + clavier, tel la Surface). On me dit que ce n'est pas vrai et que l'on sait bien mieux que moi, ce dont on a besoin.

6 mois après, la publicité de la Surface passe à la télévision et tout le monde trouve ça génial. « Le clavier qui se retire, c'est top ! On a un portable et une tablette »…

Et moi je ne suis qu'un gros con qui n'a pas vu arrivé ça. Alors quand je dis ce n'est pas un Windows 8, mais un Windows RT, on m'explique que je n'ai rien compris à Windows 8 à la publicité.

En soit, rien de grave (j'ai l'habitude de passer pour un con). En investiguant un peu plus, j'ai découvert que ces croyances étaient alimentâtes par les prestataires de services, hébergeurs, designer et autres « contacts informatiques extérieurs ».<

Tel un anthropologue (pas du tout compétent en la matière), j'ai voulu comprendre ce mode de fonctionnement et de pensées. J'ai alors assisté à de nombreuses réunions et démonstrations de produits tous plus extraordinaires les uns que les autres (mais tellement en retard sur les technologies actuelles. Ex : application écrite en VB6… en 2012).

Lors de ces réunions, j'ai noté les comportements suivants :

  1. « Microsoft, c'est de la merde ». Aucun argumentaire technique n'est utile. Cette petite phrase magique vous faisait passer du rang d'inculte à celui d'initié. À ce moment-là, vous devenez un « vrai informaticien ».
  2. « On a des fonctionnalités que Microsoft n'a pas » en vous montrant des calendriers partagés superposés. On vous dit qu'avec Outlook, ce n'est pas possible. Forcement si on reste à Office 2003, c'est vrai. Depuis on a ça dans 2007, 2010 et 2013.
  3. « Microsoft c'est cher pour rien, on vous prend pour une vache à lait »… Au moment où l'on vous vend un produit en location, ou en vous facturant un serveur 20k€ à l'année. (avec du SharePoint, j'arrivai à être moins cher).
  4. « Microsoft ne sait pas vous faire un produit qui dure dans le temps »… et on vous fait une démo d'une application Vb6.
  5. « On est limité à cause de Microsoft » … forcement, quand on vend un produit codé en Vb6, on n'est pas coupable, c'est Microsoft.
  6. … etc …

Une fois, j'ai voulu répondre et présenté la réalité. Après m'être expliqué, j'ai énoncé qu'en tant que MVP, l'information que je donnais émanait de sources fiables et proches de Microsoft. On m'a alors répondu « on ne croit pas aux certifications ». Je n'ai pas répondu tellement j'étais surpris par la réponse.

De ceci, je n'ai retenu qu'une chose : « l'union fait la force ». Plus vous êtes nombreux à croire une chose, plus elle est vraie pour vous et votre entourage.

Mais quel drame d'en arriver là et de dire autant d'âneries. Pitié, nous sommes à quelques jours de 2013 (ou pas), commencez à réfléchir par vous-même !

  

PS : Une fois, j'ai rencontré un prestataire qui ne voulait pas de mon serveur PHP. Il ne voulait pas me dire tout de suite pourquoi. En fait il avait honte de me dire qu'il avait une solution plus robuste à son sens, et qu'elle utilisait .net et IIS.

Le monde bouge et s’agite toujours dès qu’il y a de nouveaux OS, logiciels… etc… Cette année, nous avons été servis. Les divers sites de référence nous ont abreuvés de news, de commentaires, d’observations et de suppositions de toutes sortes.

Convenant les dernières nouveautés de Microsoft, une chose semble être passé inaperçue. Outre la valse de noms CP, Beta, RP, un changement majeur a eu lieu. Oui, les produits sont géniaux (on aime, on n'aime pas, ce n’ai pas le sujet ici). La localisation a été mise à l’honneur, et les produits en français n’on plus rien à envier aux versions en anglais (oui avant, il arrivait que l’on ait un bug “localisé”… c’est moche).

Voici quelques points qui m’ont agréablement surpris :

  • Les beta étaient localisés.
  • Les traductions on du sens.
  • Certaines expressions courantes sont utilisées.
  • Les formulations sont homogènes (fini les mélanges, d’infinitifs, d'adjectif …)

Personne n’en parle et pourtant ces changements ont bien eu lieu!

Et vous, qu’en pensez-vous?

Si comme moi, vous avez voulu vous lancer dans l'installation d'un beau serveur TFS tout neuf (Windows 2012, SQL 2012 et TFS 2012), vous vouliez peut-être profiter de ReFS...

Oubliez! Il est impossible d'installer SQL server 2012 sur ce format.

Et si vous tentez l'aventure, vous aurez le message d'insulte suivant :

Pas de ReFS avec SQL 2012

 

Pour le moment, SQL server ne supporte pas ReFS. Il faut donc formater sa partition de donnée en NTFS pour profiter d'une installation full 2012.

Envie de tester Windows Server 2012 ? Ceci est possible ici (http://technet.microsoft.com/en-US/evalcenter/hh670538.aspx?wt.mc_id=TEC_108_1_33)

Cette page vous permettra de télécharger l'Iso de Windows Server 2012 RTM en version d'évaluation, ou si vous préférez, une machine virtuelle (fichier VHD).

Que la fête de download commence ;)

 

Bien entendu pour les abonnés MSDN, les Iso sont disponibles sur leur portail. Attention, les iso n'est pas visibles sur l'accueil. Il faut recherche les mots « Windows 2012 », pour les trouver.

Si vous vous êtes intéressé au développement pour le Windows Store et que vous envisagiez d’utiliser le WebView (control XAML) vous n’avez pas pu passer à côté des préconisations suivantes :

· N’utilisez pas le WebView.

· Le contenu affiché dans le WebView ne doit pas rompre avec le design de votre application.

· Le comportement par défaut du WebView doit être inhibé (aucune navigation ne doit être possible).

· … etc …

Malheureusement, la documentation ne dit pas comment se passer du WebView et endors moins comment respecter ces règles L

Pire, le control ne dispose pas de propriétés en rapport avec ces préconisations.

Ayant moi-même eu besoin d’utiliser ce control pour l’une de mes applications, j’ai trouvé le moyen de respecter ces règles en codant une attached property (MVVM oblige). Ma logique pour réaliser celle-ci a été simple : vu que le control ne peut pas être maitrisé finement, je vais maitriser le contenu que je lui donne à afficher.

Mes objectifs ont donc été simples :

· Fournir à mon contenu un style HTML en rapport avec mon application (fond clair avec texte foncé écrit en Segoe)

· Inhiber les liens HTML (je remplace les références aux url par une chaine vide)

Afin d’obtenir ce résultat, j’ai réalisé le code suivant :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace MyLib.Common
{
    public sealed class WebViewUtility
    {
        #region Déclarations

        // Pattern utilisé pour trouver les url à subsituer
        private const String _pattern = @"(href=""[^""]+"")|(href='[^']+')|(href=[^ >]+)";
        private const String BindableSourcePropertyName = "BindableSource";
        
        // code HTML pour respecter le style de mon applcication
        private const String HtmlBeforeContent = @"<html><body style='background-color:#FFFFFF;color:#1D1D1D;height:100%;font-family:Segoe UI Symbol;margin:0;padding:0;'>";
        private const String HtmlAfterContent = @"</body></html>";

        private static readonly Regex _regex;
        public static readonly DependencyProperty BindableSourceProperty;

        #endregion

        #region Constructeur

        static WebViewUtility()
        {
            // DependencyProperty
            BindableSourceProperty = DependencyProperty.RegisterAttached(
                BindableSourcePropertyName, 
                typeof(String), 
                typeof(WebViewUtility),
                new PropertyMetadata(null, BindableSourcePropertyChanged));

            // Regex pour le replamcement des liens
            _regex = new Regex(_pattern,RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
        }

        #endregion

        #region DependencyProperty

        public static string GetBindableSource(DependencyObject obj)
        {
            return (string)obj.GetValue(BindableSourceProperty);
        }

        public static void SetBindableSource(DependencyObject obj, string value)
        {
            obj.SetValue(BindableSourceProperty, value);
        }

        public static void BindableSourcePropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
        {
            WebView browser = o as WebView;
            if (browser != null)
            {
                // Remplacer les liens
                String content = e.NewValue as string;
                if (content == null) return;
                content = _regex.Replace(content, String.Empty);

                // Construction de code à afficher
                StringBuilder sb = new StringBuilder();
                sb.Append(HtmlBeforeContent);
                sb.Append(content);
                sb.Append(HtmlAfterContent);

                browser.NavigateToString(sb.ToString());
            }
        }
        #endregion
    }
}

Côté XAML, pour utiliser ce code, j’ai simplement

<Page
    x:Class="MyReader.WinRt.Common.CustomWebView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:MyReader.WinRt.Common"
    xmlns:mylib="using:MyLib.Common">    
    <Grid>
        <WebView
            x:Name="WebView"
            mylib:WebViewUtility.BindableSource="{Binding}"/>
        <Rectangle x:Name="Rect" Fill="Transparent"/>
    </Grid>
</Page>

Voilà, il ne vous reste plus qu’à modifier le Binding ne fonction de vos besoins ;)

Je confirme que ce code permet la validation de vos applications pour le Store, l’une de mes applications utile ce code et est aujourd’hui certifiée et publiée sur le Store

- MyReader ( http://apps.microsoft.com/webpdp/app/myreader/2b93204a-f8c6-4211-9f3b-664456c34656 )

Bonjour tout le monde ! Après quelques mois de silence, je sors enfin de ma tanière.

Ces derniers mois ont été pour moi l'occasion d'écouter, d'entendre et de subir trop de bêtises (pour ne pas dire autre chose). J'ai bien trop longtemps rongé mon frein sans rien dire, mais les choses vont changer.

Pourquoi faire une « annonce » telle que celle-ci ?

Comme souvent avec moi, la réponse risque d'être longue, mais l'idée se voudra simple. Quand une personne expose un avis qui n'est pas en accord avec les autres, on dit facilement :

  • Qu'elle est énervée.
  • Qu'elle n'a pas réfléchi.
  • Qu'elle exprime une quelconque frustration ou de la jalousie.
  • Qu'elle est partie prie.
  • … etc …

J'ai donc pris du recul. J'ai réfléchi (oui, cela m'arrive). Tant à ce qui pouvait provoquer mes réflexions, qu'à ce qui pouvait orienter mon avis.

Je me suis rendu compte que l'élément qui n'était pas compris pouvait être mon indépendance vis-à-vis de Microsoft. Je tiens donc à rappeler que:

  • Je ne suis pas salarié de Microsoft.
  • Je ne suis pas  payé par Microsoft.
  • Je ne suis pas  encouragé par Microsoft pour cracher sur sa concurrence.

Côté Microsoft, par l'intermédiaire de Martine (que nous citons très peu, mais qui est derrière chaque MVP… merci Martine !) :

  • Il peut m'arriver d'avoir des informations venant de Microsoft.
  • Il peut m'arriver d'être mis en relation avec des personnes de Microsoft qui peuvent répondre à mes interrogations.
  • Il peut m'arriver de fournir des informations à Microsoft sur l'usage que j'ai de leurs outils.
  • Il peut m'arriver de fournir des retours favorables ou défavorables à Microsoft sur leurs outils.
  • Il m'arrive aussi de signer des accords de confidentialités, mais cela n'a rien de diabolique. Il est normal qu'une société se protège (concurrence, espionnage … etc…)

En gros, il peut m'arriver pas mal de choses. Je peux faire de nombreuses choses. Mais ceci est toujours sur la base du volontarisme et cela se fait dans les deux sens. Je reste indépendant. Avec Microsoft, c'est une relation de confiance.

Mais les réactions autour de moi me font bien rire, car il n'est pas utile d'être MVP pour échanger avec Microsoft. Vous pouvez très bien les contacter et commencer à bâtir de nouvelles relations avec eux. Vous seriez surpris de voir l'ouverture d'esprit de certains de leurs salariés (je ne sais pas, il doit y avoir un truc là-bas… ou alors, on leur fait manger du sourire en barre, le matin avec le café).

Oui, j'aime ce que fais Microsoft avec et pour les développeurs, et je ne vois pas ce qu'il peut y avoir de mal à cela !

Si un autre éditeur veut me proposer la même relation, je suis ouvert ! Surtout s'il est assez intelligent pour comprendre que l'on ne m'achète pas. Échanger avec moi sur un produit, ne m'oblige pas à parler favorablement de celui-ci sur mon blog.

Note : Je suis aussi un peu geek sur les bords. Je n'ai donc rien contre les constructeurs de matériels ;)

   

Alors, maintenant que les choses sont claires, voici quelques articles qui devraient voir le jour dans les prochaines semaines :

  • Il fait bon taper sur Microsoft (faut-il encore savoir de quoi on parle)
  • 2012, la nouvelle révolution française (vous l'avez tous raté)
  • SSII mon amour !
  • Recruter n'est pas jouer.
  • Tu comprends, c'est « La crise » … de rire
  • … etc …

Pour ceux qui estiment, que cela fait un certain temps qu'ils n'ont pas eu de nouvelles de Workflow Foundation :

WF4 est une technologie qui va bien. Elle va prochainement avoir une petite sœur qui se prénommera WF 4.5 (pour les intimes). Je vous encourage vivement a aller faire sa connaissance via mon dernier article pour MSDN :

Les nouveautés de Windows Workflow Foundation 4.5

 

PS : WF4 n'étant pas jalouse, la migration vers WF4.5 se fera en toute tranquillité (j'ai testé).

Plus de Messages Page suivante »


Les 10 derniers blogs postés

- Simuler facilement l’envoi de mail par Blog de Jérémy Jeanson le il y a 20 minutes

- ProcDump 6.0 : support du filtrage sur messages d'exceptions .NET, des filtres multiples et du ciblage par nom de service par CoqBlog le 05-20-2013, 14:50

- Votez pour le TOP 10 des influenceurs SharePoint francophones ! par Le blog de Patrick [MVP SharePoint] le 05-20-2013, 12:59

- [Conf’SharePoint] Dernier rappel ! :-) par Le blog de Patrick [MVP SharePoint] le 05-20-2013, 09:09

- [ #SharePoint 2013 ] les modèles de sites standards… par Le blog de Patrick [MVP SharePoint] le 05-20-2013, 09:03

- 10 erreurs de compréhension concernant SharePoint… par Le blog de Patrick [MVP SharePoint] le 05-20-2013, 08:27

- Conf’SharePoint : 10 bonnes raisons pour ne pas la rater par Le petit blog de Pierre / Pierre's little blog le 05-14-2013, 02:24

- [Event] Soirée de lancement Agile .NET France à Lyon par Blog Agile/ALM de Vincent THAVONEKHAM le 05-13-2013, 01:29

- .NET / Debug : inspection de la mémoire d'applications .NET (dump ou processus live) : première livraison d'une librairie .NET par Microsoft par CoqBlog le 05-11-2013, 22:21

- SharePoint : Incompatibilité avec Internet Explorer 10 (IE10) par Blog Technique de Romelard Fabrice le 05-08-2013, 16:29