Archive for November, 2010

Design time Custom Attributes

Aucun commentaire

    Il arrive souvent lorsque vous concevez des composants d'avoir besoin d'une représentation au design time, dans Blend, très spécifique. Sans aller jusqu'à développer des design time dlls, les attributs existants peuvent être d'une grande aide (vous pourrez trouver des explications concernant les designs dll par Justin Angel ici). Du coup, je liste ci-dessous une suite d'attributs que j'utilise couramment lors de mes projets, ceux-ci sont accessibles via les espaces de nom System.ComponentModel et System.Windows.Interactivity :

    1. Définir une description au survol d'une propriété ou d'un contrôle dans le panneau Properties
      [Description("ma description")]
    2. Définir une valeur par défaut au Design Time
      [DefaultValue()]
    3. Définir dans quel sous catégorie du panneau propriété la propriété se trouve
      [Category("Common Properties")]
    4. Définir la propriété dans les options avancées d'une sous catégorie ou ne pas l'afficher. C'est cette sous-partie que vous pouvez déplier.
      [EditorBrowsable(EditorBrowsableState.Advanced)]
    5. Définir si une propriété supporte la liaison de donnée et si oui dans quelles directions.
      [Bindable(BindableSupport.Yes,BindingDirection.TwoWay)]
    6. Définir un type de présentation spécifique. Très utile lorsque la propriété est affectée de certain type d'objets, par exemple cibler un état visuel.
      [CustomPropertyValueEditorAttribute(CustomPropertyValueEditor.StateName)]
    7. Lorsqu'une classe définit des objets customizables, faciliter l'accès aux templates via les menus d'accès aux styles additionnels.
      [StyleTypedProperty(Property = "ToolTipStyle", StyleTargetType = typeof(ToolTip))]
    8. Définir une partie de contrôle
      [TemplatePart(Name="maPartieLogique", Type=typeof(FrameworkElement))]
    9. Définir un état visuel
      [TemplateVisualState(GroupName = "CommonStates", Name = "Normal")]
    10. Définir une propriété comme propriété de type Content alternative, celui-ci est réellement très pratique, C'est ce qu'utilise en interne les controles de type TabItem ou les charts de Silverlight ToolKit.
      [AlternateContentProperty()]

    Fxg Import versus DrawingBrush in Expression Blend SP1

    Aucun commentaire

      Depuis le service pack1 de Blend, ce dernier propose le nouveau type d'importation FXG qui jusque là était purement réservé aux produits de la gamme Adobe. Clairement Microsoft n'a jamais réellement eu pour vocation de créer des logiciels de conception graphique pour le print ou le web tels qu'Expression Design. C'est un coup de génie que l'on voit venir depuis des mois, la notion de DrawingBrush n'a pas été portée sur Silverlight 4 et aucune annonce ne va dans ce sens pour la version 5. Ce n'est plus rédhibitoire aujourd'hui avec l'import direct de librairies FXG, de cette manière Microsoft clarifie son positionnement aussi bien d'un point de vue métier (dans le flux de production) que d'un point de vue outil. Cette fonctionnalité n'est pas forcément connue des développeurs car beaucoup de projets WPF se sont passés des DrawingBrush exportés sous forme de dictionnaires de ressources depuis Expression Design. Cela est certainement dommageable mais on peut contourner cette manière de gérer les différents acteurs d'une production avec plus ou moins de réussite.

      Concrètement grâce aux DrawingBrush sous WPF, nous avons la capacité d'avoir des remplissages de formes vectorielles pour n'importe quel contrôle. Les DrawingBrush sont en général stockés dans des dictionnaires de ressource en bon XAML. L'avantage est qu'un graphiste peut à tout moment ré-exporter ces dictionnaires depuis Expression Design et écraser le précédent. Le développeur n'a de son côté qu'à re-compiler l'application et celle-ci est mise à jour en prenant en compte le nouveau dictionnaire. Chacun est bien a sa place dans ce type de flux de production.

      L'import de fichiers FXG, sans être aussi élégante propose le même type de flux de production, voici l'écran d'importation d'un fichier FXG.

      Pour ma part, Flasher depuis pas mal de temps, j'ai conçu chaque élément et exporté le FXG via Flash. Une fois le fichier importé, le premier réflexe consiste à essayer de récupérer les éléments graphiques du FXG au sein de l'interface Blend. Ceux-ci ne sont pas traités comme ressources graphiques mais bien comme contrôles, du coup vous les trouverez dans le panneau assets comme montré ci-dessous.

      La mise à jour fonctionne exactement de la même manière que les DrawingBrush puisque qu'il suffit de modifier le fichier exporté pour que Blend le détecte et vous alerte d'une mise à jour. Attention toutefois si vous ajoutez ou supprimez des éléments, j'ai remarqué qu'il fallait souvent supprimer le FXG du projet puis le ré-importer dans ce cas. Cette importation est moins élégante à ce jour qu'un export sous forme de dictionnaires de ressource mais sait-on jamais peut-être pouvons nous imaginer une amélioration sous forme d'option d'importation dans l'avenir...