Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

[TechDays 2010] Windows Azure AppFabric (CLO305)

Les webcasts sont désormais en ligne, je me décide donc à écrire ce post.

J’ai encore eu la chance d’animer une session aux TechDays cette année. Le sujet : le même que l’année dernière, ou plutôt son évolution. En effet, l’année dernière la couche de communication et de sécurisation du cloud de Microsoft se nommait .NET Services ; il faut maintenant l’appeler Azure AppFabric (A ne pas confondre avec Server AppFabric [velocity pour les intimes]).

 

Le sujet de la session

Annoncée en novembre 2009, Windows Azure AppFabric (anciennement .NET Services) est le pendant dans le cloud de Windows Server AppFabric (anciennement Dublin). Cette session fait le point sur les grandes fonctionnalités d'AppFabric et les nouveautés attendues.

Le but était donc de montrer le maximum de choses mais en se démarquant des autres événements MS. Tout le monde sait que l’on peut héberger un service sur le cloud. Par contre, rares étaient les personnes qui avaient compris qu’on pouvait garder le service chez soi et juste exposer un Endpoint (un point de connexion) sur cloud… De même pour la sécurité, peu de gens savaient que l’on peut sécuriser n’importe quoi grâce à l’ACS sans pour autant que ce soit hébergé sur le cloud… Notre intention était donc de montrer ce que personne ne montre lors des autres événements.

 

Les slides

Le webcast

Voir le Webcast

 

La démo

On a essayé de montrer le plus de chose possible dans la démo de cette session. Evidement on n’allait pas montrer 15 démos différentes donc on a cherché un scénario qui nous permettait de montrer tout ce qu’on souhaitait montrer. Nous sommes donc arriver à ça :

Mise en place d’un site web permettant à des abonnés de réserver des places de concert. Cependant, l'exploitant du site ne possède pas directement ces places de concerts. Il travaille donc avec un réseau de partenaires (fnac, virgin…) qui vont se faire une joie d’honorer les commandes passées sur le site. Nous obtenons donc le schéma de composants suivant (Attention ! Accrochez vous !) :

Le schéma qui aide pas mal :
Côté société qui met en place le site web:
  • un site web de réservation de places de concerts [ hébergé sur le cloud ]. Il a plusieurs but :
  • L’authentification via le service de validation d’authentifications.
  • Le passage d’une commande sur le site web génère une levée d’événement sur un canal de diffusion (une sorte de broadcast) que le service de passage de commande écoute. Ce service n’est potentiellement pas le seul à écouter ce canal ; des applications d’audit des partenaires peuvent aussi écouter ce canal.
  • Le site web ajoute aussi la commande sur un MessageBuffer (une sorte de Queue sur le servicebus) [ via une classe de l’API : MessageBufferClient ].
  • une base de données contenant les concerts + affiches [ hébergée sur SQL Azure ]
  • une base de données CRM [ On-Premise* ]
  • un service WCF de validation d’authentifications faites sur le site web [ On-Premise* + EndPoint exposé sur le servicebus d’AppFabric – Type de communication : NetTcpRelayBinding ]
  • un service WCF de passage de commandes via le site web [ On-Premise* + EndPoint exposé sur le servicebus d’AppFabric – Type de communication : NetEventRelayBinding ].
  • un service WCF de mise à jour des commandes via les partenaires [ On-Premise* + EndPoint exposé sur le servicebus d’AppFabric – Type de communication : WebHttpRelayBinding / REST HTTPS ]
  • un service WCF d’exposition de samples pour les différents événements [ On-Premise + EndPoint exposé sur le servicebus d’AppFabric – Type de communication : WebHttpRelayBinding / REST HTTPS ]
Côté partenaire maintenant:
  • Une application d’audit en mode Console
  • Une application de récupération de commandes à partir du MessageBuffer en mode Console
  • LocalSTS : une petite application développée par Justin Smith qui permet de simuler un Active Directory + Active Directory Foundation Services. Le but est de se servir de cet “AD” pour gérer la sécurisation des services WCF On-Premises via ACS…
  • Une application d’audit en WPF [ Ecoute le service de broadcast – Type de comunication : NetEventRelayBinding ]
  • Une application de gestion des commandes en WPF. Elle va chercher une commande sur le MessageBuffer pour ensuite procéder au traitement et donc mettre à jour le statut de la commande en communiquant avec le service de mise à jour via le EndPoint sur le ServiceBus [ WebHttpRelayBinding / REST]. Evidemment le but ultime de la démo est de sécuriser cette mise à jour grâce aux credentials de l’AD du partenaire en passant via l’ACS (qui va au passage faire de la transformation de jetons de sécurité en plus de faire de la validation…)

On-Premise: Réseau de l’entreprise… Que ce soit en local ou chez un hébergeur tiers.

Voila, j’espère avoir été le plus claire possible. Avec un scénario pareil ce n’est vraiment pas évident. Si vous avez du mal à suivre mais que le sujet vous intéresse, regardez le webcast car les choses sont amenées logiquement et petit à petit au fur et a mesure que la session avance.

 

Les sources de la démo

   

Je fourni ici le code de la démo. Cependant je vais écrire un article spécifique pour permettre aux gens qui découvrent Azure AppFabric de la lancer car il y a tout un tas de paramètres à renseigner (credentials / connection strings…) ainsi que la mise en place des droits sur ACS et du LocalSTS avant de pouvoir la lancer. Ne sachant pas quand j’aurais le temps d’écrire cet article je fourni dors et déjà les sources pour les aficionados.

 

Les feedbacks

Les feedbacks, bons ou mauvais, sont toujours à prendre… Donc n’hésitez pas !

[Cloud] Antivirus sur le cloud

Panda vient de présenter un nouvel antivirus gratuit en version beta. La particularité de cet antivirus est qu'il utilise des ressources sur le cloud de Panda Security. Les operation de detections s'effectuent en ligne. Un des principaux avantages mis en avant par Panda est que lorsqu'un fichier est considéré comme sensible, il est alors automatiquement connu par le cloud et les utilisateurs en profitent donc tous. Un deuxième point mis en avant est que, vu que le traitement s'effectue sur le cloud, les performances de la machine cliente sont alors beaucoup moins altérées.

Pour jouer avec, c'est par là : http://www.cloudantivirus.com/

Posté le par NeuroCypher | 9 commentaire(s)
Classé sous : ,

[Cloud Computing] Rapport McKinsey : Qu'est-ce que le Cloud Computing

McKinsey vient de publier un rapport, en anglais évidemment, expliquant ce qu'est le Cloud Computing. Ce rapport est axe, selon moi, pour des décisionnaires ce qui le rend compréhensibles à tous et surtout cadre son développement autour du secteur économique actuel.

Ce rapport ne concerne pas seulement la plateforme Azure mais bien le Cloud Computing en général.

Dernière petite précision, ce rapport fait pas mal parler de lui de l'autre côté de l'océan car tout le monde n'est pas spécialement en accord avec les restrictions qu'il rapporte. Cependant je le trouve particulièrement clair et les "restrictions" qu'il met en avant sont des questions que peuvent se poser des décisionnaires.

Pour voir le rapport, c'est ici.

Posté le par NeuroCypher | 0 commentaire(s)
Classé sous :

[Channel9] Nouvelle rubrique : The Id Element (Identity)

Cette nouvelle rubrique, dont les protagonistes ne sont autres que Vittorio Bertocci et donovanf, regroupe les différentes vidéos liées a l’Identité. Les nomines seront donc : Geneva, Services Connector, Access Control Service (Azure .NET Services) et Live ID.

Leur désir est de fournir les ressources nécessaires aux développeurs ET aux IT-Pros, en allant de la présentation sommaire jusqu’à l’explication technique avancée. Des “how-tos”, guides “steb-by-step” et interviews régulières des équipes de développement sont aussi prévues.

Une dizaine de vidéos sont déjà disponibles => http://channel9.msdn.com/identity

Posté le par NeuroCypher | 0 commentaire(s)

[Azure] Nouveautés de .NET Services

Une nouvelle CTP du SDK .Net Services a vu le jour au mois de Mars 2009. Elle intervient suite à des changements importants au niveau de .Net Services, dont une évolution considérable du ServiceBus.

Petit rappel de ce que permettait le ServiceBus avant cette évolution

Le ServiceBus servait juste de relais entre deux entités. Une entité envoyait des données à l’autre via le ServiceBus. L’entité réceptrice devait être en cours d’exécution, au moment du transfert des données, pour que l’acheminement soit réalisé.

Nouvelles capacités du ServiceBus

Tout d’abords, le ServiceBus permet toujours de servir de relais mais il permet maintenant de « gérer » et d’« aiguiller » les données. Les données peuvent donc maintenant avoir une durée de vie au sein du ServiceBus. En effet, le système permet maintenant de stocker et transférer ces données, selon un schéma précis, complètement indépendamment du « mode relais ».

Cette avancée majeure a été rendue possible grâce à deux nouvelles fonctionnalités, les Routeurs (Routers) et les Queues.

Commençons par détailler ces deux nouveaux éléments.

Routeur

Un routeur (router) est un système de distribution sous la forme de publication / souscription. Il reçoit donc des données qu’il peut alors transmettre aux abonnés. Le routeur peut se comporter de différentes façons en fonction de la « Policy » appliquée. Il peut dispatcher les données a tous les abonnés ou alors à un seul des abonnes de manière aléatoire ; ce qui simule donc une action de « load balancing ».

Queue

Une queue reçoit et stocke des données jusqu’a ce qu’une entité tierce vienne retirer le message de la queue (« pull ») afin de les consommer.

Association

Les routeurs et les queues peuvent s’abonner à un routeur. Les associations d’éléments permettent donc une gestion du transit des messages assez intéressante et évoluée.

Voici un exemple d’association intéressante :

Ce que ça apporte concrètement

Ca nous ouvre deux autres modes de distribution (qui peuvent donc être associés) :

- Push/Pull (Queue) : On dépose des données qui seront récupérées plus tard.

- Pub/Sub (Router) : Les données arrivent et sont directement dispatchées.

En plus de ces nouveaux modes de distribution, on peut simuler l’action de « load balancing » et donc contrôler la charge grâce au ServiceBus.

[Azure] Mises à jour de Azure Services Training Kit & Azure Services Management Tools

Mars a amené son lot de nouveautés sur Azure avec de nouvelles fonctionnalités sur le ServiceBus de .Net Services, une nouvelle CTP du SDK .NET Services et les annonces liées a Windows Azure & SQL Data Services.

Nouveau mois, nouvelles nouveautés !

En effet, depuis aujourd'hui, la nouvelle version du Training Kit Azure Services (la dernière version datait de février) ainsi qu'une nouvelle version de l'Azure Services Management Tools sont disponible en téléchargement.

Training Kit Azure Services contient des labs, présentations PPT, et démos. Une nouvelle présentation pour SQL Data Services ainsi que deux labs sur Windows Azure PHP & le support du code natifs sont maintenant présents dans le Training Kit.

Azure Services management Tools est un outil qui permet de configurer et administrer certaines fonctionnalités de .NET Services [ Access Control Services | Workflow Services ].

[Azure] Changements majeurs pour .NET Services et la nouvelle CTP du SDK

Tout d'abord, commençons par le commencement. Une nouvelle CTP du SDK.NET Services est disponible depuis le 31 mars.
Pour la télécharger, c'est par la : http://www.microsoft.com/downloads/details.aspx?FamilyID=8d1d1d5e-1332-4186-b33f-26d053759e49&displaylang=en

 

Une CTP importante

Depuis quelques jours, si ce que vous aviez développé pour Azure ne fonctionne plus, NE VOUS ARRACHEZ PAS LES CHEVEUX (pour ceux qui le peuvent encore), c'est "normal". Des changements majeurs ont été effectués depuis le début de la semaine voire même le début du week-end dernier.

Il n'est pas obligatoire de passer sur cette CTP, mais beaucoup de fonctionnalitées y apparaissent.

 

Quoi de neuf dans cette CTP

Voila ce que j'en retiens :

  • Pour commencer, plus besoin d'invitation code. Vous pouvez donc tous aller utiliser .NET Services sans avoir a demander/attendre un token.
  • Access Control Services gère l'AtomPub. La dll "Microsoft.AccessControl.Management.dll" n'est plus présente dans le SDK. On peut maintenant passer par REST pour administrer l'ACS.
  • ServiceBus fournit maintenant la possibilité de "discoverable and reliable queues and routers" (je ne voyais pas trop comment le traduire pour que ce soit sexy alors je ne le traduis pas). Cela permet aux applications utilisant SOAP ou HTTP de pouvoir utiliser le Service a des fins de stockage ou d'acheminement.
  • Création des "routers". Cela permet de forwarder les messages d'un (ou plusieurs) fournisseur(s) vers un (ou plusieurs) abonné(s). Les protocoles qui peuvent être utilisés sont HTTP, HTTPS et netOneWay et peuvent être enveloppés dans du SOAP ou envoyés directement en plain text.
  • WorkflowService se voit doter de plusieurs "Activités" ou améliorations d'"Activités" :
    • CloudServiceBusReceive : Réception de messages venant du ServiceBus
    • CloudHttpSend : Gère maintenant la customisation d'headers HTTP, les paramètres "query strings", et les HTTP methods.
    • CloudXPathUpdate / CloudXPathRead : Support des namespaces XML
  • Les noms de solutions ne peuvent plus contenir de '_' (underscore). Ils doivent commencer par une lettre et finir par une lettre ou un chiffre. Les '_' (underscores) des solutions existantes ont été remplacés par un '-' (tiret). [Ça peut expliquer pourquoi votre application ne fonctionne plus - eh oui il me reste encore des cheveux]
  • La nomenclature des ressources a changé. Les noms définis par l'utilisateur doivent commencer par une lettre ou un '_' (underscore) et peuvent ensuite contenir des chiffres. La longueur est limitée a 50 caractères. Les credentials, issuers et claims non conformes ont été automatiquement renommés. Les scopes qui contenaient des caractères non autorisés ont quant a eux été supprimés. [Ça aussi ça peut expliquer pourquoi votre application ne fonctionne plus]
  • Les certificats X509 ou Windows CardSpace ne peuvent maintenant être associés qu'à une seule solution. Les associations qui ne matchait pas cette norme ont été supprimées. Il est donc conseillé de rapidement aller vérifier ses credentials avant d'oublier le password de la solution. [Ça aussi ça peut expliquer pourquoi votre application ne fonctionne plus]
  • Changement de l'URI du STS intégré. La nouvelle URI est sous ce format : http://<solution-name>.accesscontrol.windows.net/sts [Ça aussi ça peut expliquer pourquoi votre application ne fonctionne plus]
  • Changement de l'URI du ServiceBus. La nouvelle URI est sous ce format : sb://<solution-name>.servicebus.windows.net/… [Ça aussi ça peut expliquer pourquoi votre application ne fonctionne plus]
  • Changement de l'URI du WorkflowService. La nouvelle URI est sous ce format : https://<solution-name>.workflow.windows.net/workflowHttp/workflows/<TypeName>/instances/<InstanceId>/<QueueName> [Ça aussi ça peut expliquer pourquoi votre application ne fonctionne plus]

Courage à ceux qui vont devoir patcher tout ça.

PS: Les changements en plein pendant les TechDays Suisse. No démo sur Azure. Dur. Félicitations a ceux qui ont animé leurs sessions sans démo et qui ont su maintenir le public en éveil.

[Azure] Nouvelles CTPs du SDK et des Tools pour VisualStudio

Voila, deux nouvelles CTPs pour le développement Azure sont disponibles depuis hier :
Lien pour télécharger le SDK + les Tools pour VisualStudio
Lien pour télécharger uniquement le SDK

 

Nouveautés du SDK

  • Gère le développement des applications managées en Full Trust, la gestion du code natif via PInvokes.
  • Gère le développement des FastCGI et de l'URL rewriting.
  • Amélioration du système d'intégration et des performances liées a SQL Server.
Nouveautés des Tools
  • Debug du code natif
  • Templates FastCGI
  • et quelques nouveautés qui ne servent a rien au niveau du développement
Posté le par NeuroCypher | 0 commentaire(s)
Classé sous : ,

[Azure] SQL Data Services - Une interface SQL

Suite aux retours de la Preview, MS a décidé de s'écarter de l'idée de fournir des API REST et SOAP exposant un ACE (Autorité, Conteneur, entité) afin de fournir une interface over HTTP (TDS / T-SQL).

Cela permettra donc de stocker ses données sur le Cloud tout en conservant les APIs actuelles (il y aura donc très peu de changements a faire pour migrer...).

 

A terme le modèle ACE est amené a disparaître, mais il est toujours possible d'utiliser ses données via REST en utilisant l'ADO.NET Services Framework.

Source

Posté le par NeuroCypher | 3 commentaire(s)
Classé sous : , ,

[Azure] Passage a l'UTC

Azure utilise actuellement une date/heure synchronisée sur le PST TimeZone (Pacific Standard Time). Ceci est sûrement du au fait que pour le moment les DataCenters se trouvent sur la cote ouest des USA. A terme il y aura des DataCenters dans le monde entier.

De ce fait, d'ici quelques semaines (selon la source), Azure devrait être synchronisé sur UTC (communément appelé GMT), qui ne change d'ailleurs pas d'heure en hiver, ce qui devrait éviter quelques surprises.

Posté le par NeuroCypher | 0 commentaire(s)
Classé sous : ,

[Azure] Training Kit

Une nouvelle release du training kit bien plus complète est disponible en téléchargement depuis hier.
Et on clique pour télécharger.

Je pense faire quelques articles sur des choses non présentés dans le training kit après les TechDays.
Have fun.

Posté le par NeuroCypher | 0 commentaire(s)
Classé sous : ,

[TechDays] Azure - .NET Services

Bon ben voila, je viens faire ma propagande.

Si Azure vous intéresse et que vous n'avez encore rien de prévu mardi 10 de 13h a 14h.
Sachez que je co-animerais une session "avancée" sur .NET Services avec Pierre Couzy et Rochdi Chakroun.
La session : Services avancés .NET Services dans la plateforme Azure (AZU308)

Vous êtes tous les bienvenus. Sachant que ça va être mon premier "Speak", si vous avez des critiques constructives sur ma modeste prestation, n'hésitez pas a me le dire ou m'envoyer un mail.

[LinqToSQL] Requêtes asynchrones simultanées

Je viens d'obtenir une jolie exception lorsque je fais des requêtes asynchrones simultanément. J'ai tout d'abords été un peu surpris vu la simplicité du code...

Jolie exception : There is already an open DataReader associated with this Command which must be closed first.

Il s'avère en fait que cette exception est apparemment très courante et pas seulement lors de l'utilisation de LinqToSQL. Elle est due à un paramètre de la ConnectionString qui est paramètré a False par défaut.

La solution est donc toute simple, il suffit de changer la valeur de la propriété MultipleActiveResultSets à True.

 

Posté le par NeuroCypher | 4 commentaire(s)
Classé sous : , ,

[WPF/Silverlight] Ternary Converters

Pour rester dans l'optique du post de Thomas, voici deux Converters (ou convertisseurs) dont j'ai eu besoin il y a quelque temps et qui maintenant me servent "régulièrement".

La particularité de ces Converters est qu'ils reprennent le "système ternaire". En somme, on teste une condition, si elle renvoie true alors on renvoie tel résultat sinon on en renvoie un autre. Les opérations ternaires sont souvent symbolisées (CONDITION ? TRUE : FALSE) en programmation.

Pour créer un Converter, il faut implémenter une interface de conversion. Il existe deux interfaces de Converters :
- IValueConverter: On passe un seul paramètre au Converter.
- IMultiValueConverter: On passe X paramètres au Converter.
Cliquez sur les liens pour voir comment les utiliser dans un XAML.

En ce qui nous concerne, les Ternary Converters nécessitent l'interface IMultiValueConverter car nous avons au moins 1 paramètre a passer pour la condition et ensuite 2 paramètres représentants respectivement la valeur de retour en cas de condition positive et négative.

BooleanTernaryConverter

class BooleanTernaryConverter : IMultiValueConverter
{
   public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
   {
       if (values.Length != 3)
           throw new Exception("[BooleanTernaryConverter]: 3 parameters are required.");

       return (System.Convert.ToBoolean(values[0]) == true ?
               values[1] : values[2]);
   }

   public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
   {
       throw new NotImplementedException();
   }
}

EqualityTernaryConverter

class EqualityTernaryConverter : IMultiValueConverter
{
   public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
   {
       if (values.Length != 4)
           throw new Exception("[EqualityTernaryConverter]: 4 parameters are required.");

       return (values[0] == values[1] ?
               values[2] : values[3]);
   }

   public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
   {
       throw new NotImplementedException();
   }
}

Voila, si ça peut aider une ou deux personnes, c'est déjà ça.

Posté le par NeuroCypher | 0 commentaire(s)
Classé sous : , , , , ,

[Silverlight] TextBox scrollable / Auto scroll to caret

Je viens d’avoir la nécessité d’une chose inexistante (temporairement j’espère) dans Silverlight.

J’ai eu besoin d’un TextBox scrollable capable de scroller automatiquement lors de l’ajout de texte au TextBox.
Evidement il faut que cette fonctionnalité s’auto-désactive lorsque l’utilisateur change la position de la ScrollBar et se réactive lorsqu’il replace la ScrollBar à sa position maximale.

Exemple d’utilisation

On peut avoir l’utilité de ce type de control pour des logs, sur un client ou un serveur…

L’existant

Le TextBox de Silverlight permet l’utilisation des scroll bars en utilisant les propriétés suivantes dans le XAML :
- ScrollViewer.VerticalScrollBarVisibility
- ScrollViewer.HorizontalScrollBarVisibility

Cependant, on n’a strictement aucun moyen de gérer les événements sur ces mêmes scroll bars, ni même de connaitre leur valeur.
Le seul control qui donne accès a la gestion concrète des événements est le ScrollBar, mais la c’est le drame. Pour l’utiliser il faut tout recréer de zéro pour l’associer a un control.

L’alternative

J’ai donc crée un UserControl qui contient un ScrollViewer (scrollViewer) qui contient lui même un TextBox (txtRaw).

XAML:

<UserControl x:Class="Project.Controls.CustomTextBox"
    xmlns=
"http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Width="Auto" Height="Auto" >
    <Grid x:Name="LayoutRoot" Background="White">
        <ScrollViewer x:Name="scrollViewer" Padding="0"
                      HorizontalScrollBarVisibility="Disabled">
            <TextBox Height="Auto" Width="Auto" x:Name="txtRaw" />
        </ScrollViewer>
    </Grid>
</UserControl>

Le fonctionnement est assez simple.

La propriété AutoScrollToCaret permet à l’utilisateur de spécifier s’il veut que la fonctionnalité d’auto scroll soit active ou non. Si c’est le cas, on va “écouter” les événements de mouvement de la souris sur le ScrollViewer mais aussi celui de changement de texte du TextBox.

Lorsqu’un de ces événements nous parvient, on vérifie différentes informations concernant la ScrollBar :
- Sa position par rapport à la dernière position connue. Si elle a changée et que l’OriginalSource est de type Rectangle, alors cela signifie que c’est l’utilisateur qui a déplacé la position de la ScrollBar. On appelle donc une méthode qui va déterminer si le Control doit continuer d’auto scroller ou non en fonction de la position de la ScrollBar (si la position est au max alors on scrollera sinon non)
- La position maximum. Si elle a changée (suite a une augmentation ou une diminution du contenu du TextBox) ET que l’auto scroll est actif alors on envoie la ScrollBar a sa position maximale.

La variable _hasToCaret est à true lorsque la propriété AutoScrollToCaret est à true et que l’utilisateur n’a pas déplacé la position de la ScrollBar. On se base sur l’état de ce booléen afin de savoir si on doit auto scroller ou non.

Code:

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Shapes;

using Project.Common.Delegates; // Namespace comprenant une simple definition pour StringDelegate

namespace Project.Controls
{
   public partial class CustomTextBox : UserControl
   {
      #region Variables
      private double _lastVerticalOffset = 0;
      private double _lastScrollableHeight = 0;

      private bool _hasToCaret = false;
      private bool _autoScrollToCaret = false;
      #endregion

      #region Properties
      public bool AutoScrollToCaret
      {
         get { return _autoScrollToCaret; }
         set
         {
            _autoScrollToCaret = value;
            if (value == true) // On active nos listeners
            {
               _hasToCaret = true;
               scrollViewer.MouseMove += new MouseEventHandler(scrollViewer_MouseMove);
               txtRaw.TextChanged += new TextChangedEventHandler(txtRaw_TextChanged);
               ScrollToCaret();
            }
            else // On désactive nos listeners
            {
               _hasToCaret = false;
               scrollViewer.MouseMove -= new MouseEventHandler(scrollViewer_MouseMove);
               txtRaw.TextChanged -= new TextChangedEventHandler(txtRaw_TextChanged);
            }
         }
      }
      #endregion

      #region Constructor
      public CustomTextBox()
      {
         InitializeComponent();
      }
      #endregion

      #region UI Events
      private void scrollViewer_MouseMove(object sender, MouseEventArgs e)
      { 
         CheckScrollBar((e == null ? null : e.OriginalSource));
      }

      private void txtRaw_TextChanged(object sender, TextChangedEventArgs e)
      {
         scrollViewer.UpdateLayout();//Obligatoire sinon la taille de la scroll bar n’est pas rafraichie avant de passer dans la méthode [j’y ai passé un petit moment avant de comprendre ca !!!]
         CheckScrollBar(null);
      }
      #endregion

      #region Scroll Management
      private void CheckScrollBar(object origin)
      {
         double scrollableHeight = scrollViewer.ScrollableHeight;
         double verticalOffset = scrollViewer.VerticalOffset;

         if (verticalOffset != _lastVerticalOffset ||   // Si la position a changée ou 
             scrollableHeight != _lastScrollableHeight) // si la position max a changée 
         {
            if (origin != null && origin is Rectangle) // Si l’origine est un Rectangle, alors l’utilisateur a déplacé la ScrollBar
               ScrollChangedByMouseMove();
            else if (_hasToCaret == true// Si ce n’est pas le cas et que l’on doit auto-scroller… YES WE CAN
               ScrollToCaret();

            _lastVerticalOffset = verticalOffset;
            _lastScrollableHeight = scrollableHeight;
         }
      }

      private void ScrollChangedByMouseMove()
      {
         if (AutoScrollToCaret == true)
         {
            if (scrollViewer.VerticalOffset != scrollViewer.ScrollableHeight) // Si la position de la ScrollBar n’est pas au max
            {
               _hasToCaret = false; // on désactive l’auto-scroll
            }
            else // sinon
            {
               _hasToCaret = true; // on l’active 
            }
         }
      }

      private void ScrollToCaret()
      {
         scrollViewer.ScrollToVerticalOffset(scrollViewer.ScrollableHeight);
      }
      #endregion

      #region Add Text
      private void addText(string str)
      {
         txtRaw.Text += str;
      }

      internal void AddText(string str)
      {
         txtRaw.Dispatcher.BeginInvoke(new StringDelegate(addText), str);
      }
      #endregion
   }
}

Cette source parait toute conne maintenant qu’elle fonctionne, mais j’ai bien tourné en rond avant de m’en sortir !

Voila, si ca peut dépanner une ou deux personnes, ce sera déjà pas mal.

Posté le par NeuroCypher | 0 commentaire(s)

[WPF] TextBlock éditable et Binding

Il y a quelque temps, Thomas a publié un post sur un TextBlock éditable. Quelques jours plus tard, je l'ai utilisé mais un problème est apparu.

Description du problème

J'ai attribué une ObservableCollection au DataContext de ma Window, ensuite je "bindais" une propriété du Type contenu par mon ObservableCollection au TextBlock. Le binding fonctionnait tant que je ne tentais pas de modifier la donnée.

Une fois qu'une donnée avait été modifié dans le Control, ce changement n'était pas répercuté dans l'objet "bindé" et le binding ne fonctionnait plus du tout (lors du changement de sélection sur l'ObservableCollection, l'affichage n'était pas rafraîchit sur le Control).

Solution

En fait la solution a ce problème est très simple, il suffit de modifié le Mode des propriétés Binding, du côté du TextBlock éditable et aussi du côté de l'utilisation du Control, afin de leur attribuer la valeur TwoWay.

Côté TextBlock éditable:

        <Style TargetType="{x:Type uc:EditableTextBlock}">

            <Setter Property="Template">

                <Setter.Value>

                    <ControlTemplate TargetType="{x:Type uc:EditableTextBlock}">

                        <Grid x:Name="PART_GridContainer" Background="{TemplateBinding Background}"

                              Width="{TemplateBinding Width}" Height="{TemplateBinding Height}">

                            <TextBlock x:Name="PART_TbDisplayText" Visibility="Visible" TextWrapping="WrapWithOverflow"

                               Background="{Binding TextBlockBackgroundColor,

                               RelativeSource={RelativeSource AncestorType={x:Type uc:EditableTextBlock}}}"

                               Foreground="{Binding TextBlockForegroundColor,

                               RelativeSource={RelativeSource AncestorType={x:Type uc:EditableTextBlock}}}"

                               Text="{Binding Text, Mode=TwoWay,

                               RelativeSource={RelativeSource AncestorType={x:Type uc:EditableTextBlock}}}" />

                            <TextBox x:Name="PART_TbEditText" Visibility="Hidden" TextWrapping="WrapWithOverflow"

                               Background="{Binding TextBoxBackgroundColor,

                               RelativeSource={RelativeSource AncestorType={x:Type uc:EditableTextBlock}}}"

                               Foreground="{Binding TextBoxForegroundColor,

                               RelativeSource={RelativeSource AncestorType={x:Type uc:EditableTextBlock}}}"

                               Text="{Binding Text, Mode=TwoWay,

                               RelativeSource={RelativeSource AncestorType={x:Type uc:EditableTextBlock}}}"

                               MaxLength="{Binding MaxLength,

                               RelativeSource={RelativeSource AncestorType={x:Type uc:EditableTextBlock}}}" />

                        </Grid>

                    </ControlTemplate>

                </Setter.Value>

            </Setter>

        </Style>

Côté utilisation:

            <uc:EditableTextBlock Text="{Binding Path=Code, Mode=TwoWay}" Margin="5,0" Grid.Row="3"

                                  TextBlockForegroundColor="Black" TextBoxForegroundColor="Black" MaxLength="50" />

Posté le par NeuroCypher | 4 commentaire(s)
Classé sous : , , ,

[Techdays] Inscriptions

Apparemment l'ouverture des inscriptions, il y a maintenant quelques jours, est passée inaperçue.
Donc voici le lien pour s'inscrire si vous ne l'avez pas déjà fait.

http://www.microsoft.com/france/mstechdays/

Posté le par NeuroCypher | 0 commentaire(s)
Classé sous :
Plus de Messages Page suivante »


Les 10 derniers blogs postés

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01