13/12/2011

[TryAndLikeIt] Un jour, une appli

Grâce à l'opportunité qui m'est offert par le programme Try and like it de Microsoft, je vais vous faire découvrir les applications Nokia qui sont disponible avec le Nokia 800 :

Nokia Musique

09/12/2011

[TryAndLikeIt] Quelques semaines à la découverte du Nokia Lumia 800



La nouvelle est tombée juste avant de partir en week-end : Je viens d'être sélectionné par Microsoft pour promouvoir le Windows Phone 7.5 sur la ville de Toulouse durant les prochaines semaines !

Si tout ce passe comme convenu je devrais aller chercher mon Nokia Lumia 800 la semaine prochaine ! Ca fait vraiment plaisir ! Donc je pense poster très prochainement poster une critique de ce téléphone et faire certainement une comparaison avec le Samsung Omnia 7 que je possède déjà ! :)

Si vous êtes sur le ville de Toulouse et que vous souhaitez une démonstration du Téléphone, n'hésitez pas à me le faire savoir. (Par contre il faut m'en commander 10 pour que je me déplace !!) ^^

Voilà normalement des news très prochainement !

12/10/2011

[XAML] Notifications dans la barre de tâches

En dépannage (qui devient souvent permanent), on a parfois besoin de créer de petits outils avec un accès rapide à 2-3 fonctionnalitées sans forcément nécessiter une (grosse) interface graphique. Moi j'obte dans ce cas pour une application silencieuse avec des accès direct depuis la zone de notification.

Et bien voilà, en WPF rien de natif pour créer des icônes dans la zone de notification et pour celles et ceux qui me lise déjà, vous savez que je ne suis pas fan de réutiliser des Winforms pour pallier à ce problème. J'utilise donc une API qui a été développée par Philipp Sumi. Son API est très efficace pour avoir rapidemment un résultat et en même temps permets d'affiner très précisément si besoin.

On démarre par télécharger le projet ici

On ouvre, on compile, et on va chercher la merveilleuse : Hardcodet.Wpf.TaskbarNotification.dll

Donc notre projet, on rajoute la dll en référence ("Project", "Add Reference...")

Puis on l'instancie dans le XAML :

xmlns:systray="clr-namespace:Hardcodet.Wpf.TaskbarNotification;assembly=Hardcodet.Wpf.TaskbarNotification"

Ensuite on rajoute notre composant :
<systray:TaskbarIcon x:Name="mySystrayIcon" IconSource="/Images/test.ico" ToolTipText="Test">
</systray:TaskbarIcon>

Pour rajouter un menu contextuel, rien de plus simple, celui ci est disponible :
<systray:TaskbarIcon x:Name="mySystrayIcon" IconSource="/Images/test.ico" ToolTipText="Test">
   <systray:TaskbarIcon.ContextMenu>
      <ContextMenu>
         <MenuItem Header="Test"/>
      </ContextMenu>
   </systray:TaskbarIcon.ContextMenu>
</systray:TaskbarIcon>

Ce qui m'a de suite séduit dans cette API c'est le fait de pouvoir utiliser des UserControl pour effectuer ses notifications.

Vous créez donc votre notification dans un Userontrol :


Ensute on rajoute bien évidemment la référence vers le local :
xmlns:local="clr-namespace:MonApplication"

Et on l'intègre de cette façon :
<systray:TaskbarIcon x:Name="mySystrayIcon" IconSource="/Images/test.ico" ToolTipText="Test">
   <systray:TaskbarIcon.TrayPopup>
      <local:MyUserControl/>
   </systray:TaskbarIcon.TrayPopup>
   <systray:TaskbarIcon.ContextMenu>
      <ContextMenu>
         <MenuItem Header="Test"/>
      </ContextMenu>
   </systray:TaskbarIcon.ContextMenu>
</systray:TaskbarIcon>
Ensuite si vous souhaitez utiliser votre User Control à partir du code behind, vous allez procéder comme ceci :

private void ShowMyUserControl()
{
   mySystrayIcon.ShowCustomBalloon(new MyUserControl(), System.Windows.Controls.Primitives.PopupAnimation.Slide, 2500);
}
Personnellement j'aime utiliser mes petites applications de cette manière là c'est à dire avec juste un menu contextuel personnalisé qui s'efface lorsqu'il perd le focus. Ce qui donne :
<systray:TaskbarIcon x:Name="mySystrayIcon" IconSource="/Images/test.ico" ToolTipText="Test" PopupActivation="RightClick" TrayLeftMouseUp="mySystrayIcon_TrayLeftMouseUp" >
   <systray:TaskbarIcon.TrayPopup>
      <local:UC LostFocus="UC_LostFocus"/>
   </systray:TaskbarIcon.TrayPopup>
</systray:TaskbarIcon>
Et dans mon code behind:

public MainWindow()
{
   this.Visibility = System.Windows.Visibility.Hidden;
}

private void UC_LostFocus()
{
   this.Close();
}

private void mySystrayIcon_TrayLeftMouseUp()
{
   //Traitement sur le clic gauche.
}
Vous avez également remarqué que je me suis abonné à TrayLeftMouseUp qui me permet de gérer mon clic gauche.

Vous pouvez retrouver le tutoriel intégral de Philipp Sumi en anglais sur The Code Project, il couvre vraiment la plupart des cas (Du moins les miens ont trouvés toutes les réponses) et notamment approfondie la partie command, routed event, databindig.

02/09/2011

[SL5] Nouveautés de Silverlight 5 - SL5 RC

Voilà la nouvelle version de Silverlight est sortie depuis quelques heures en version RC.
Pour rappel la version Release Candidate n'est pas la version définitive. Je vous conseille d'autant plus de prendre vos précautions, (genre d'installer cette version dans une VM), car certains développeurs de la communauté ont d'ores et déjà remonté des problèmes pour faire fonctionner ensuite correctement leur précédentes applications (Framework antérieur). Le runtime est pourtant sensé supporter toutes les versions... :( A suivre avec la version finale...
Allez c'est parti, on commence par ici, et on mets à jour son Visual Studio (SP1) si cela n'a pas déjà été fait avec le SDK Windows Phone.

Bref donc Prérequis VS2010 SP1.
Puis SL5 Tools for VS2010 SP1, etc... etc...,

Bon alors quelles sont les nouveautés de cette version :

 - Prise en charge des versions X64.
 - Amélioration des performances réseaux.
 - Amélioration du temps de latence du flux audio.
 - Prise en charge du format H264
 - Prise en charge de l'impression vectorielle
 - Amélioration des rendus 3D et de la prise en charge du GPU. Pour plus d'infos sur ce sujet je ne serais trop vous recommander le blog de David Catuhe ici.
 - Full Trusted Application : Accès complet aux fichiers systèmes de la machine depuis notre application Silverlight. (BDR modifié, certificat de l'éditeur accepté dans le navigateur.)

La liste n'est pas complète. Je ne note ici que les innovations qui me sont apparues les plus significatives

Pour plus d'informations : http://go.microsoft.com/fwlink/?LinkId=214343

Maintenant au boulot, y'a plus qu'à s'amuser!

EDIT : Vous pouvez récupérer la documentation complète de cette nouvelle version ICI !

02/07/2011

[XAML] Bouton sexy

Voilà une de mes créations réalisez avec Expression Blend, je vous laisse soin de me mettre un petit mot pour me dire ce que vous en pensez !

<UserControl
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 mc:Ignorable="d"
 x:Class="Blog.MainControl"
 x:Name="UserControl"
 d:DesignWidth="640" d:DesignHeight="480">
<UserControl.Resources>
   <ControlTemplate x:Key="BtSexy" TargetType="{x:Type Button}">
      <ControlTemplate.Resources>
         <Storyboard x:Key="OnClick1">
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)" Storyboard.TargetName="Anneau_de_couleur">
               <EasingDoubleKeyFrame KeyTime="0" Value="1"/>
               <EasingDoubleKeyFrame KeyTime="0:0:0.4" Value="1.45">
                  <EasingDoubleKeyFrame.EasingFunction>
                     <PowerEase EasingMode="EaseIn"/>
                  </EasingDoubleKeyFrame.EasingFunction>
               </EasingDoubleKeyFrame>
               <EasingDoubleKeyFrame KeyTime="0:0:1" Value="1.75">
                  <EasingDoubleKeyFrame.EasingFunction>
                     <PowerEase EasingMode="EaseOut"/>
                  </EasingDoubleKeyFrame.EasingFunction>
               </EasingDoubleKeyFrame>
            </DoubleAnimationUsingKeyFrames>
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)" Storyboard.TargetName="Anneau_de_couleur">
               <EasingDoubleKeyFrame KeyTime="0" Value="1"/>
               <EasingDoubleKeyFrame KeyTime="0:0:0.4" Value="1.45">
                  <EasingDoubleKeyFrame.EasingFunction>
                     <PowerEase EasingMode="EaseIn"/>
                  </EasingDoubleKeyFrame.EasingFunction>
               </EasingDoubleKeyFrame>
               <EasingDoubleKeyFrame KeyTime="0:0:1" Value="1.75">
                  <EasingDoubleKeyFrame.EasingFunction>
                     <PowerEase EasingMode="EaseOut"/>
                  </EasingDoubleKeyFrame.EasingFunction>
               </EasingDoubleKeyFrame>
            </DoubleAnimationUsingKeyFrames>
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="Anneau_de_couleur">
               <EasingDoubleKeyFrame KeyTime="0" Value="1"/>
               <EasingDoubleKeyFrame KeyTime="0:0:0.4" Value="1">
                  <EasingDoubleKeyFrame.EasingFunction>
                     <PowerEase EasingMode="EaseIn"/>
                  </EasingDoubleKeyFrame.EasingFunction>
               </EasingDoubleKeyFrame>
               <EasingDoubleKeyFrame KeyTime="0:0:1" Value="0">
                  <EasingDoubleKeyFrame.EasingFunction>
                     <PowerEase EasingMode="EaseOut"/>
                  </EasingDoubleKeyFrame.EasingFunction>
               </EasingDoubleKeyFrame>
            </DoubleAnimationUsingKeyFrames>
         </Storyboard>
      </ControlTemplate.Resources>
      <Grid>
         <Border x:Name="Anneau_de_couleur" BorderBrush="{TemplateBinding Background}" BorderThickness="10" CornerRadius="180" RenderTransformOrigin="0.5,0.5">
            <Border.RenderTransform>
               <TransformGroup>
                  <ScaleTransform/>
                  <SkewTransform/>
<RotateTransform/>
                  <TranslateTransform/>
               </TransformGroup>
            </Border.RenderTransform>
         </Border>
         <Border x:Name="Cerclage" BorderThickness="6" CornerRadius="180">
            <Border.BorderBrush>
               <LinearGradientBrush EndPoint="0.181,0.885" StartPoint="0.819,0.115">
                  <GradientStop Color="White" Offset="0.47"/>
                  <GradientStop Color="#FF434343" Offset="0.965"/>
                  <GradientStop Color="#FF434343" Offset="0.07"/>
               </LinearGradientBrush>
            </Border.BorderBrush>
         </Border>
         <Border x:Name="Background" BorderBrush="Black" BorderThickness="0" CornerRadius="180" Background="{TemplateBinding Background}" Margin="6"/>
      </Grid>
      <ControlTemplate.Triggers>
         <EventTrigger RoutedEvent="ButtonBase.Click">
            <BeginStoryboard Storyboard="{StaticResource OnClick1}"/>
</EventTrigger>
      </ControlTemplate.Triggers>
   </ControlTemplate>
</UserControl.Resources>


 <Grid x:Name="LayoutRoot">
  <Button Content="Button" Margin="194,152,262,173" Template="{DynamicResource BtSexy}">
   <Button.Background>
    <RadialGradientBrush>
     <GradientStop Color="#FFF3F3F3" Offset="0"/>
     <GradientStop Color="#FFEBEBEB" Offset="0.5"/>
     <GradientStop Color="#FFDDDDDD" Offset="0.657"/>
     <GradientStop Color="#FF5AA90F" Offset="1"/>
    </RadialGradientBrush>
   </Button.Background>
   <Button.BorderBrush>
    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
     <GradientStop Color="Black" Offset="0"/>
     <GradientStop Color="White" Offset="1"/>
    </LinearGradientBrush>
   </Button.BorderBrush>
  </Button>
 </Grid>
</UserControl>

[XAML] Afficher des images animées .gif dans une IHM WPF

Nativement, WPF ne permet pas d'afficher des images animées au format .gif avec le contrôle Image. Il faut donc trouver une autre solution. Voici les solutions que j'ai pu expérimenter :

1 - Utiliser le Contrôle PictureBox (WinForm).

On commence tout d'abord par ajouter les références nécessaires au projet :

- WindowsFormsIntegration
- System.Windows.Forms

Puis on définit System.Windows.Forms dans le namespace en XAML :

xmlns:wfc="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"

Puis le code XAML nous donne :
<Grid>
   <WindowsFormHost Height="100" Width="100">
      <wfe:PictureBox x:Name="pictureBox1" Height="100" Width="100" ImageLocation="C:\Users\UserID\MesImages\Blog.gif"/>
   </WindowsFormHost>
</Grid>

Pour rappel la PictureBox ne gère pas les URI donc pour alimenter votre PictureBox avec une image stockée sur le Web, on l'alimente dans le code behind comme ceci:

    Public MainWindow()
{
   InitializeComponent();
   Uri url = new Uri("http://t0.gstatic.com/images?q=tbn:ANd9GcSAheOd0oNGdBUtJhTMSDz08_9lpW8rgg2_TBFi3DMAVfsgYYRU4g"); 
   pictureBox1.Image = System.Drawing.Image.FromStream(System.Net.HttpWebRequest.Create("url").GetResponse().GetResponseStream());
}


Ce n'est pas une solution que j'affectionne dans la mesure où l'on utilise une technologie "ancienne génération" dans une IHM WPF et que l'on place un contrôle non vectoriel dans un container, lui-même dans une IHM vectorielle.

2 - Utiliser une Classe dédiée aux Gifs

Cette classe, je ne l'ai pas écrite moi même, je l'ai trouvée ici.
Elle permet :
 - d'afficher des gifs animés tout en ayant les images en "Embedded Resource".
 - Les gifs s'affichent et s'animent directement dans l'IDE (c'est le cas dans VS2010) et à l'exécution bien évidemment. :)
 - Lors de l’exécution un clic de souris permet d'arrêter le gif :

    public class GIFImageControl : Image

    {

        public static readonly DependencyProperty AllowClickToPauseProperty =
        DependencyProperty.Register("AllowClickToPause", typeof (bool), typeof (GIFImageControl),
        new UIPropertyMetadata(true));


        public static readonly DependencyProperty GIFSourceProperty =
        DependencyProperty.Register("GIFSource", typeof (string), typeof (GIFImageControl),
        new UIPropertyMetadata("", GIFSource_Changed));

        public static readonly DependencyProperty PlayAnimationProperty =
        DependencyProperty.Register("PlayAnimation", typeof (bool), typeof (GIFImageControl),
        new UIPropertyMetadata(true, PlayAnimation_Changed));

        private Bitmap _Bitmap;

        private bool _mouseClickStarted;

        public GIFImageControl()

        {
            MouseLeftButtonDown += GIFImageControl_MouseLeftButtonDown;
            MouseLeftButtonUp += GIFImageControl_MouseLeftButtonUp;
            MouseLeave += GIFImageControl_MouseLeave;
            Click += GIFImageControl_Click;
            //TODO:Future feature: Add a Play/Pause graphic on mouse over, and possibly a context menu
        }

        public bool AllowClickToPause

        {
            get { return (bool) GetValue(AllowClickToPauseProperty); }
            set { SetValue(AllowClickToPauseProperty, value); }
        }

        public bool PlayAnimation

        {
            get { return (bool) GetValue(PlayAnimationProperty); }
            set { SetValue(PlayAnimationProperty, value); }
        }

        public string GIFSource

        {
            get { return (string) GetValue(GIFSourceProperty); }
            set { SetValue(GIFSourceProperty, value); }
        }

        private void GIFImageControl_Click(object sender, RoutedEventArgs e)

        {
            if (AllowClickToPause)
            PlayAnimation = !PlayAnimation;
        }

        private void GIFImageControl_MouseLeave(object sender, MouseEventArgs e)

        {
            _mouseClickStarted = false;
        }

        private void GIFImageControl_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)

        {
            if (_mouseClickStarted)
            FireClickEvent(sender, e);
            _mouseClickStarted = false;
        }

        private void GIFImageControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        
        {
            _mouseClickStarted = true;
        }

        private void FireClickEvent(object sender, RoutedEventArgs e)

        {
            if (null != Click)
                Click(sender, e);
        }

        public event RoutedEventHandler Click;

        private static void PlayAnimation_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)

        {
            var gic = (GIFImageControl) d;
            if ((bool) e.NewValue)

            {

                //StartAnimation if GIFSource is properly set
                if (null != gic._Bitmap)
                    ImageAnimator.Animate(gic._Bitmap, gic.OnFrameChanged);
                
            }

            else
            
                //Pause Animation
                ImageAnimator.StopAnimate(gic._Bitmap, gic.OnFrameChanged);
            
        }

        private void SetImageGIFSource()

        {
                if (null != _Bitmap)
                
                {
                    ImageAnimator.StopAnimate(_Bitmap, OnFrameChanged);
                    _Bitmap = null;
                }

                if (String.IsNullOrEmpty(GIFSource))
                {
                    //Turn off if GIF set to null or empty
                    Source = null;
                    InvalidateVisual();
                    return;
                }

                if (File.Exists(GIFSource))
                _Bitmap = (Bitmap) System.Drawing.Image.FromFile(GIFSource);
                else
                {
                    //Support looking for embedded resources
                    Assembly assemblyToSearch = Assembly.GetAssembly(GetType());
                    _Bitmap = GetBitmapResourceFromAssembly(assemblyToSearch);
                    
                    if (null == _Bitmap)
                    {
                        assemblyToSearch = Assembly.GetCallingAssembly();
                        _Bitmap = GetBitmapResourceFromAssembly(assemblyToSearch);
                        
                        if (null == _Bitmap)
                        {
                            assemblyToSearch = Assembly.GetEntryAssembly();
                            _Bitmap = GetBitmapResourceFromAssembly(assemblyToSearch);
                            
                            if (null == _Bitmap)
                                throw new FileNotFoundException("GIF Source was not found.", GIFSource);
                            
                        }
                        
                    }
                    
                }
                if (PlayAnimation)
                    ImageAnimator.Animate(_Bitmap, OnFrameChanged);
                    
        }
     
        private Bitmap GetBitmapResourceFromAssembly(Assembly assemblyToSearch)
   
        {
            string[] resourselist = assemblyToSearch.GetManifestResourceNames();
            if (null != assemblyToSearch.FullName)
                        
            {        
                string searchName = String.Format("{0}.{1}", assemblyToSearch.FullName.Split(',')[0], GIFSource);     
                if (resourselist.Contains(searchName))        
                {
                                
                    Stream bitmapStream = assemblyToSearch.GetManifestResourceStream(searchName);        
                    if (null != bitmapStream)       
                        return (Bitmap)System.Drawing.Image.FromStream(bitmapStream);     
                }       
            }    
            return null;    
        }
            
        private static void GIFSource_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)

        {
            ((GIFImageControl) d).SetImageGIFSource();
        }

        private void OnFrameChanged(object sender, EventArgs e)

        {
            Dispatcher.BeginInvoke(DispatcherPriority.Normal,
                new OnFrameChangedDelegate(OnFrameChangedInMainThread));

        }

        private void OnFrameChangedInMainThread()

        {
            if (PlayAnimation)
            {
                ImageAnimator.UpdateFrames(_Bitmap);
                Source = GetBitmapSource(_Bitmap);
                InvalidateVisual();

            }
        }

        [DllImport("gdi32.dll", EntryPoint = "DeleteObject")]

        public static extern IntPtr DeleteObject(IntPtr hDc);
        private static BitmapSource GetBitmapSource(Bitmap gdiBitmap)
        {

            IntPtr hBitmap = gdiBitmap.GetHbitmap();
            BitmapSource bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(hBitmap,
                IntPtr.Zero,
                Int32Rect.Empty,
                BitmapSizeOptions.FromEmptyOptions());
            DeleteObject(hBitmap);

            return bitmapSource;
        }

        private delegate void OnFrameChangedDelegate();
    }

Cette classe a été pour moi sur plusieurs petits projets une bonne solution.

3- Créer son gif en WPF

Au bout d'un moment, on utilise quoi ? WPF ! On sait faire des animations avec WPF ? Oui, évidemment ! Alors, la solution consiste à créer d'un côté toute les images qui composent votre gif et de l'autre à créer un storyboard :

<Image Name="Image1">
   <Image.Triggers>
      <EventTrigger RoutedEvent="Image.Loaded"
         <EventTrigger.Actions>
            <BeginStoryboard>
               <Storyboard>
                   <ObjectAnimationUsingKeyFrames Duration="0:0:1" Storyboard.TargetProperty="Source" RepeatBehavior="Forever">
                      <DiscreteObjectKeyFrames KeyTime="0:0:0">
                         <DiscreteObjectKeyFrame.Value>
                            <BitmapImage UriSource="Images/Image1.gif"/>
                         </DiscreteObjectKeyFrame.Value>
                      </DiscreteObjectKeyFrames>
                     <DiscreteObjectKeyFrames KeyTime="0:0:0.2">
                        <DiscreteObjectKeyFrame.Value>
                           <BitmapImage UriSource="Images/Image2.gif"/>
                        </DiscreteObjectKeyFrame.Value>
                     </DiscreteObjectKeyFrames>
                     <DiscreteObjectKeyFrames KeyTime="0:0:0.4">
                        <DiscreteObjectKeyFrame.Value>
                           <BitmapImage UriSource="Images/Image3.gif"/>
                        </DiscreteObjectKeyFrame.Value>
                     </DiscreteObjectKeyFrames>
                     <DiscreteObjectKeyFrames KeyTime="0:0:0.6">
                        <DiscreteObjectKeyFrame.Value>
                           <BitmapImage UriSource="Images/Image4.gif"/>
                        </DiscreteObjectKeyFrame.Value>
                     </DiscreteObjectKeyFrames>
                     <DiscreteObjectKeyFrames KeyTime="0:0:0.8">
                        <DiscreteObjectKeyFrame.Value>
                           <BitmapImage UriSource="Images/Image5.gif"/>
                        </DiscreteObjectKeyFrame.Value>
                     </DiscreteObjectKeyFrames>
                     <DiscreteObjectKeyFrames KeyTime="0:0:1">
                        <DiscreteObjectKeyFrame.Value>
                           <BitmapImage UriSource="Images/Image6.gif"/>
                        </DiscreteObjectKeyFrame.Value>
                     </DiscreteObjectKeyFrames>
                  </ObjectAnimationUsingKeyFrames>
               </Storyboard>
            </BeginStoryboard>
         </EventTrigger.Actions>
      </EventTrigger>
   </Image.Triggers>
</Image>


Evidemment ici on est clairement dans le cas figure où soit vous, soit votre équipe maîtrise en intégralité la phase design.

Voilà, maintenant vous avez toutes les cartes en main.

Bonne Journée.

20/06/2011

[Certification] Cursus de Certification Microsoft sur le Framework 4.0

EDIT : Nouveau cursus de certification ici

Parce qu'il n'est pas toujours évident de s'y retrouver lorsqu'un nouveau cursus de certification entre en activation !

Les examens du Framework 4.0 :

MCTS


70-511 : Windows Applications
             Cette certification englobe en fait deux technologies Microsoft : Les Winforms (ancienne techno) et WPF (Windows Présentation Foundation). WPF permet de donner une expérience enrichie à vos IHM.

70-515 : Web Applications
             Cette certification teste les compétences sur la technologie ASP.NET (Technologie Web)

70-513 : Service Communication Applications
             Cette certification reprends la technologie WCF.

70-516 : Data Access
             Cette certification teste les compétences sur la technologie ADO.NET

70-506 : Silverlight 4
             Ici le nom de la certification est assez explicite.


MCPD


70-518 : Windows Developper 4
             Les certifications MCTS pour accéder à cette certification : Windows Applications (70-511), Service Communication Applications (70-513), Data Access (70-516)


70-519 : Web Developper 4
             Les certifications MCTS pour accéder à cette certification : Web Applications (70-516), Service Communication Applications (70-513), Data Access (70-516)

70-583 : Windows Azure Developper
             Les certifications MCTS pour accéder à cette certification : Service Communication Applications (70-513), Data Access (70-516)




Le cursus Framework 4.0 ne nécessite plus le passage d’entrée avec l’examen 70-536 comme c’était le cas précédemment du Framework 2.0 au 3.5.

Pourquoi se certifier ?

Pour, après quelques années d’expérience, attester d’un niveau de connaissance sur les technologies Microsoft. La certification s’avère quelques fois être dans les prérequis pour accéder à certains postes.

Pour, quelques fois, permettre aux développeurs amateur de basculer cette activité de manière professionnelle. (Beaucoup y arrive sans certifications mais ça peut aider).

Comment se certifier ?

Après avoir étudié, assimilé et beaucoup pratiqué la techno, il faut s’inscrire sur le site de Prometric ou PearsonVue et choisir le site de passage de l’examen.


Combien coûte une certification ?

Pour le passage des examens en série 70 (ex : 70-511) (sans aucune aide) :

Alors le passage strict de l’examen coûte 140 € chez Prometric et je pense quelques euros de plus chez PearsonVue si je me rappelle bien.
Personnellement je compte 200 € (le livre MS (env. 60€) et le passage (140€)).

Pour le passage des examens en série 72 (ex : 72-511) (réservé aux étudiants) :

Le prix du passage est divisé env par 2 soit 65€ - 70€.

Quelle différence entre 70-511 et 72-511 ?

La différence majeure réside dans le prix du passage de la certification et dans le fait que la 72 est réservé aux étudiants (Un numéro d’étudiant est demandé lors de l’inscription). L’examen est rigoureusement identique.

Comment se passe l’examen ?

Il vous faut vous présenter sur le site de passage une heure à l’avance, avec une pièce d’identité et laissé vous effets personnels.
L’examen se présente sous la forme d’un QCM.

Quelle note doit être obtenue pour avoir sa certification ?

Un minimum de 700/1000 est exigé.

Où se procurer les livres liés à la certification ?

A l’heure où cet article est rédigé, seuls les livres associés aux examens 70-511 et 70-515 ont été publiés. Je les rajouterais au fur et à mesure des sorties.



Voilà je pense en avoir fait le tour de la question, s'il manque des infos ou que vous ayez des questions n'hésitez pas.

Source de l'article ici

06/06/2011

[.NET] Mettre à jour un TextBlock à partir d'un TreeView

Voici comment mettre à jour dynamiquement la propriété Text d'un TextBlock en fonction du Header d'un TreeViewItem qui vient d'être sélectionné :



private void TreeView1_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs <object> e) 
{ 
   TreeView tv = (TreeView)sender;
   TreeViewItem item = (TreeViewItem)tv.SelectedItem; 
   textblock.Text = item.Header.ToString(); 
}  
Rien de bien compliqué, on s'abonne à l'événement du SelectedItemChanged. On fait un cast du sender en TreeView qui lui-même sera casté en TreeViewItem. Puis on affiche le Header.

03/02/2011

[WindowsPhone] Première mise à jour

Ca y est la première mise à jour pour windows phone 7 devrait sortir dans les jours à venir et l'on connait maintenant le détails officiel de cette mise à jour :

- Fonction Copier-Coller (maintenant y a plus de raisons de se moquer) !
- Amélioration de la réactivité des jeux et des applications lors du démarrage et à la sortie du mode veille.
- Enfin un changement des catégories de recherche sous le marketplace.

Source de l'information ici

On le sait depuis déjà plusieurs mois, cette mise à jour est une mise à jour "mineure" (bien que la fonction copier-coller soit vraiment indispensable). Premier avant goût qui donnera le "LA" du support. Il ne nous restera plus qu'à attendre des mises à jour majeures telles que MANGO ou APPOLO prévues pour cette année 2011.