Centre de développement Sharepoint 2010
Sharepoint 2010 - MSDN
Tutoriels Sharepoint 2010 sur areaprog
Developper Top 10 Resource Center | Sharepoint
English speaker ? jump to English version of this post
[21/01/2011 : Le TimeSpanPicker fait à présent partie du Toolkit Coding4Fun http://coding4fun.codeplex.com/]
J’avais besoin d’un joli picker pour représenter une durée dans une application Silverlight pour Windows Phone 7.
Les pickers du toolkit pour WP7 sont parfaits mais n’existent que pour les types DateTime sous la forme DatePicker et TimePicker. J’ai modifié les sources du toolkit et rendu le code du DateTimePicker générique, pour qu’il prenne en charge un type TimeSpan aussi bien qu’un type DateTime. Voici donc le toolkit complété d’un nouveau contrôle : le TimeSpanPicker qui possède les propriétés additionnelles suivantes :
Elles sont toutes les trois de type TimeSpan.
Il y a 3 sélecteurs pour sélectionner respectivement le nombre d’heures, de minutes, de secondes de la durée à saisir.
Voici comment vous pourrez l’utiliser :
Le contrôle bénéficie de certains comportements dynamiques comme par-exemple n’afficher que les sélecteurs nécessaires, en fonction de la durée max et du step. Les valeurs par défaut sont:
Et vous obtiendrez ce résultat :
Et après validation:
Evidemment, vous pouvez personnaliser ces valeurs à votre convenance, comme dans les exemples suivants.
Si vous souhaitez proposer une durée avec une précision à la minute vous obtiendrez uniquement l’affichage des sélecteurs de heures et minutes
public TimeSpan StepDuration { get { return TimeSpan.FromMinutes(1); } }
Si vous précisez en plus une valeur Max inférieure à 1 heure, le sélecteur des heures disparaitra:
public TimeSpan MaxDuration { get { return TimeSpan.FromMinutes(40); } } public TimeSpan StepDuration { get { return TimeSpan.FromMinutes(1); } }
Précisez un step de 5 minutes, et vous obtiendrez :
public TimeSpan MaxDuration { get { return TimeSpan.FromMinutes(40); } } public TimeSpan StepDuration { get { return TimeSpan.FromMinutes(5); } }
Voici les sources et les binaires:
Signalez-moi si vous rencontrez des soucis avec le TimeSpanPicker.
A bientôt !
[01/21/2011 : The TimeSpanPicker is now part of the Coding4Fun toolkit http://coding4fun.codeplex.com/]
I needed a nice picker to handle a duration in a WP7 Silverlight Application.
WP7 toolkit pickers are the ideal choice, but they only support DateTime types through DatePicker and TimePicker controls. I updated the toolkit source code and made the DateTimePicker base generic so that it supports TimeSpan as well as DateTime types.
The updated toolkit (v1.1) contains a new control : the TimeSpanPicker which has some specific behaviours:
All 3 properties are TimeSpan types.
The 3 pickers represent respectively the hours, minutes, and seconds parts of the duration value.
How to use it in your own project:
The control look is dynamic and will depend on the max and step property values. You will see only pickers that make sense according to the maximum value and the step.
Default values are:
In this case you would get this result :
And after validation:
Of course, it’s up to you to customize Max and Step properties to fit your needs, just like examples below.
If you need a duration with a minute-based precision, you would not see the picker for seconds.
If additionnaly the Max value is less than a hour, then the hour picker will also disappear:
Add a 5 minutes step and you will get the minutes picker going from 5 to 5:
You can download the source code and binaries here:
Feel free to contact me if you’re in trouble with the TimeSpanPicker.
Hope it helps !
Le centre de développement Sharepoint va être réorganisé et actualisé bientôt pour mieux répondre à vos attentes.
A cette occasion, de nouveaux articles fleurissent grâce à notre communauté très active de Sharepointeurs de choc
Voici les deux premiers articles :
Pour soumettre un article à publication, voici la procédure :
Envoyez-moi un document Word avec:
Contactez-moi si vous souhaitez un template/exemple.
NB : Les tutoriaux où l’on vous prend par la main sont toujours très appréciés…
A bientôt
J’aborde OData dans différents articles, aussi pour éviter de me répéter dans chacune des introductions, voici un petit rappel.
OData est un protocole de manipulation de données basé sur http en REST. On peut filtrer, paginer, trier mais aussi modifier et supprimer ces données grâce à une simple URI (c’est à dire un “chemin web” comme ceux que vous saisissez dans la barre d’adresse de votre navigateur).
En simplifié:
Avantages et caractéristiques:
Microsoft WCF Data Services (anciennement Astoria) est le composant de .Net qui permet d’implémenter OData.
Un petit exemple sur un service OData http://odata.microsoftpdc.com/ODataSchedule.svc/ qui nous renseigne sur les évènements de la PDC 2010 :
La requête: http://odata.microsoftpdc.com/ODataSchedule.svc/ (vous pouvez la tester dans votre navigateur préféré)
Nous renvoie les éléments accessibles à la racine : collections de sessions, speakers, … :
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<service xml:base="http://odata.microsoftpdc.com/ODataSchedule.svc/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app" xmlns="http://www.w3.org/2007/app">
<workspace>
<atom:title>Default</atom:title>
<collection href="ScheduleOfEvents">
<atom:title>ScheduleOfEvents</atom:title>
</collection>
<collection href="Sessions">
<atom:title>Sessions</atom:title>
<collection href="Tracks">
<atom:title>Tracks</atom:title>
<collection href="TimeSlots">
<atom:title>TimeSlots</atom:title>
<collection href="Speakers">
<atom:title>Speakers</atom:title>
<collection href="Manifests">
<atom:title>Manifests</atom:title>
<collection href="Presenters">
<atom:title>Presenters</atom:title>
<collection href="Contents">
<atom:title>Contents</atom:title>
<collection href="RelatedSessions">
<atom:title>RelatedSessions</atom:title>
</workspace>
</service>
Pour filtrer à la source, il suffit de suffixer le nom du service par l’arborescence nous amenant à un élément ou une collection d’éléments et d’y ajouter (ou pas) une requête (OrderBy, Take, Skip, …) et son prédicat.
Dans notre exemple, nous souhaitons consulter les 2 premiers speakers triés par ordre alphabétique.
La requête devient: http://odata.microsoftpdc.com/ODataSchedule.svc/Speakers/?$orderby=FullName&$top=2 (plus d’info sur les requêtes ici http://www.odata.org/developers/protocols/uri-conventions#QueryStringOptions)
Et renvoie: Adam Wilson et Amit Chopra
<feed xml:base="http://odata.microsoftpdc.com/ODataSchedule.svc/" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">
<title type="text">Speakers</title>
<id>http://odata.microsoftpdc.com/ODataSchedule.svc/Speakers/</id>
<updated>2010-11-05T13:27:16Z</updated>
<link rel="self" title="Speakers" href="Speakers" />
<entry>
<id>http://odata.microsoftpdc.com/ODataSchedule.svc/Speakers(guid'7553a0ea-159f-452e-bb5e-a94edfb0cd9d')</id>
<title type="text" />
<author>
<name />
</author>
<link rel="edit" title="Speaker" href="Speakers(guid'7553a0ea-159f-452e-bb5e-a94edfb0cd9d')" />
<category term="Shared.Model.Speaker" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
<content type="application/xml">
<m:properties>
<d:Id m:type="Edm.Guid">7553a0ea-159f-452e-bb5e-a94edfb0cd9d</d:Id>
<d:FullName>Adam Wilson</d:FullName>
<d:PhotoUrl m:null="true" />
<d:Bio m:null="true" />
</m:properties>
</content>
</entry>
<id>http://odata.microsoftpdc.com/ODataSchedule.svc/Speakers(guid'758b9c4f-5b12-4ef2-8cf9-5e3652f5dd3e')</id>
<link rel="edit" title="Speaker" href="Speakers(guid'758b9c4f-5b12-4ef2-8cf9-5e3652f5dd3e')" />
<d:Id m:type="Edm.Guid">758b9c4f-5b12-4ef2-8cf9-5e3652f5dd3e</d:Id>
<d:FullName>Amit Chopra</d:FullName>
<d:PhotoUrl>http://pdccms.istreamplanet.com/content/AmitChopra.jpg</d:PhotoUrl>
<d:Bio>Amit Chopra is a Senior Program Manager with the Visual Studio Test and Lab Team which is responsible for creating the Visual Studio 2010 Test Professional Product and the Lab Management Features. Amit has spent over 10 year in the Developer Division working on variety of IDE Features targeted towards Office Developers, Windows Phone Developers and most recently on features aimed to enhance Developer / Test collaboration in teams that are using Visual Studio Team Foundation Server as the core ALM Platform. Prior to working for Microsoft, Amit has worked for companies such as PricewaterhouseCoopers, Sun Microsystem, CANON and DEC in various capacities in the engineering and developer evangelism groups.</d:Bio>
</feed>
L’introduction à OData s’arrête ici.
Pour aller plus loin :
Une doc toute fraiche et agréable à lire sur le cycle de vie d’un projet Sharepoint :
Application Lifecycle Management in Microsoft SharePoint 2010
On y trouve des conseils et des best practices sur beaucoup de sujets :
Ce projet étend les fonctionnalités de SharePoint 2010 et des Office Web Apps en permettant d’afficher des miniatures de documents sur l’ensemble du portail SharePoint. Voici quelques impressions d’écran qui montrent le Thumbnail Extender for SharePoint en action.
Les formats suivants sont supportés :
http://thumbextsp.codeplex.com/
Merci Xavier
Comment développer une application déployable sur plusieurs plateformes en capitalisant le maximum de code ? On pense souvent à l’intérêt de la factorisation durant la phase de développement, pour ne pas coder 2 fois le même fonctionnel. Mais il est peut-être encore plus grand pendant la phase de maintenance de votre application, où chaque modification doit être appliquée et testée sur le code correspondant à chaque plateforme. C’est évidemment une source d’erreur importante sans parler du côté rébarbatif de la chose et de la perte de temps qu’elle entraine.
La session de Shawn Burke à la PDC donne l’occasion de reparler de ce sujet qui tient à cœur beaucoup de développeurs, moi y compris .
De nombreuses applications client-serveur du domaine pro sont aujourd’hui disponibles en version « lourde », avec des fonctionnalités complètes, mais également en version web (ou pour le téléphone), avec parfois des fonctionnalités allégées. Par-exemple, une application WPF permet d’éditer, d’ajouter du contenu, d’accéder facilement aux ressources de sa machine, et la version Silverlight permet la consultation du contenu et quelques réglages simples.
Dans cette configuration, l’application est souvent d’abord développée en WPF et le client web - qui n’est finalement qu’un sous-ensemble fonctionnel de l’existant - est ajouté par la suite. Ou une application est développée en Silverlight, et son homologue sur Windows Phone 7 ensuite, etc...
Le but est donc de réutiliser un maximum de code, principalement pour les couches métier qui resteront inchangées que l’écran soit un 3” ou un 27” .
Quelques points clés pour aider à gérer au mieux ce contexte d’application multi-plateforme :
La première étape pour tendre vers une factorisation massive et propre du code est l’utilisation d’une architecture N-tiers. Le choix se porte assez naturellement sur MVVM qui permet le découplage du modèle, de ses cas d’utilisation ainsi que de la vue. L’approche MVVM permet une interaction facilitée aux technos fournissant un mécanisme de Binding comme WPF et Silverlight.
Même si les couches “Vue “diffèrent selon les plateformes, on pourra espérer partager les couches Model et ViewModel autant que possible.
WPF Apps With The Model-View-ViewModel Design Pattern
Quid du partage de la couche « Vue » ? Silverlight et WPF utilisent tous deux le XAML avec une syntaxe de plus en plus proche.
Pour gagner du temps de développement mais aussi de maintenance, autant tenter d’utiliser une syntaxe qui soit la plus compatible possible entre les deux technos. Cette approche peut avoir des détracteurs et le but n’est pas forcément de partager tous les fichiers xaml (d’ailleurs ce sera certainement impossible J ). Mais à partir du moment où une vue existe et fonctionne, pouvoir réutiliser le maximum de xaml apporte un gain de productivité non négligeable, que ce soit lors de la conception, mais aussi et surtout pour la maintenance de l’application.
C’est moins vrai avec Silverlight pour WP7 où la couche vue sera spécifiquement adaptée à un écran de l’ordre de 3 pouces avec une ergonomie à la Metro et donc très différente des autres plateformes.
A ce compte-là, je vous propose quelques pointeurs bien pratiques qui aident à définir les syntaxe XAML qui fonctionnent aussi bien en WPF qu’en Silverlight ou qui vous permettront de connaitre les spécificités de chaque plateforme en terme de XAML.
Le partage de code peut s’envisager sous différents angles :
Partage de projet
Qui dit partage de projets dit partage d’assemblies. Une application Silverlight ne peut référencer que des assemblies de type Silverlight. Par-contre, il est possible de référencer une assemblie Silverlight (utilisez Silverlight 3) depuis un projet WPF. Pour cela, l’assemblie Silverlight ne doit pas contenir de code spécifique à l’UI Silverlight, mais uniquement des classes métier, et le référencement doit sur faire sur les binaires et non sur les projets.
Partage de fichiers source
Dans Visual Studio, il est possible d’ajouter des fichiers sous forme de liens. Ainsi, plusieurs projets peuvent référencer le même fichier facilement mais évidemment c’est une pratique assez risquée puisque pas de versionnement du code comme c’est le cas pour les assemblies.
Le gros inconvénient de ces deux approches est que vous ne maitrisez pas du tout avec quelles plateforme le code que vous écrivez sera compatible. Vous développez une assemblie Silverlight, donc vous aurez accès aux espaces de noms et assemblies Silverlight-compliant. C’est votre responsabilité de développeur, de vous documenter, de tester et de n’utiliser que des objets compatibles dans les différents mondes. Or c’est très contraignant de savoir ce qui est réellement compatible entre les différentes plateformes (accès au système de fichier, sérialisation, …).
C’est là qu’intervient le nouveau type de projet “Portable library” pour Visual Studio qui est prévu pour le début d’année prochaine.
Le but est de “typer” un projet librairie de classe comme une librairie “portable”. Dans cette librairie, vous n’aurez accès qu’aux espaces de noms qui sont communs aux 3 plateformes .Net/Silverlight/Phone. De plus, la Portable Core Lib se veut être le minimum fonctionnel sur toute plateforme et c’est pourquoi elle ne contient pas directement l’intersection des plateformes existantes : elle doit également être valable pour les plateformes à venir. Vous serez évidemment guidés par l’Intellisense et contrôlés par la compilation.Cela force le développeur à ne pas écrire de code spécifique à une plateforme donnée dans ce projet.
Cette librairie peut ensuite être utilisée par des application .Net, Silverlight, Windows Phone. Dans la première version de la Portable Library, les espaces de nom disponibles seront assez réduits.
Mais au fil des versions, ils seront complétés pour arriver à un vrai sous-ensemble fonctionnel commun et minimal à toutes les plateformes.
Dans la roadmap, la portable library est prévue pour début 2011.
Cela nous aidera côté développement à être explicite en terme de plateforme ciblées dans la création de nos librairies. Mais pratique également pour la maintenance en nous empêchant d’employer un fonctionnel donné dans une librairie dite portable qui ne serait pas supporté sur toutes les plateformes ciblées par le projet.
La Portable Library règle la question du référencement statique des librairies. Néanmoins, il serait intéressant que l’on puisse déterminer dynamiquement le comportement (ou l’activation) de telle ou telle fonctionnalité suivant la plateforme sur laquelle elle s’exécute. C’est là qu’interviennent les mécanismes d’injection de dépendances.
Grâce à MEF (Managed Extensibility Framework) ou Unity, vous pouvez charger des assemblies dynamiquement, sur la base d’un comportement défini par une interface. Votre application chargera les assemblies que vous avez déployées sur votre plateforme, plutôt que celles que vous auriez référencé dans votre projet.
Dans ce cas, vous capitalisez non pas du code, mais un comportement générique (signature) grâce aux interfaces.
Modélisez, développez en OO
La modélisation et la conception orientée objet de votre application conditionne très fortement la réussite de votre multi-targeting. Pensez à découpler, pensez fonctionnel…
La compilation conditionnelle
La compilation conditionnelle (#if SILVERLIGHT���#endif, …) peut également permettre de sauver la mise, dans des situations désespérées, mais elle n’est pas à recommander en règle générale.
En effet, c’est à votre architecture en couche et à votre modèle de conception objet de spécialiser les différentes approches et d’apporter la souplesse nécessaire pour garantir une bonne lisibilité et maintenabilité du code.
Les classes partielles, les méthodes d’extension
Permettent de rajouter du comportement à une classe sans modifier le code existant.
Le multitargeting est un sujet passionnant qui touche une majorité de développeurs. Je reviendrai très bientôt sur ce sujet, pour la sortie de la Portable Library !
Si vous êtes développeur Silverlight et que vous rencontrez (comme moi en pleine session MsDays de Nantes !) l’erreur suivante lorsque vous tentez d’exécuter votre application à partir de Visual Studio:
C’est que le runtime end-user de Silverlight et le runtime développeur sont installés avec des versions différentes et incompatibles. Vous avez certainement installé la dernière release de Silverlight sans y avoir prêté attention, durant une balade sur la toile.
Mettez à jour votre runtime développeur grâce à ce lien: http://go.microsoft.com/fwlink/?LinkID=188039
Le cahier sur le développment Windows Phone 7 du magazine Programmez est disponible en téléchargement
Il vous reste à télécharger gratuitement Visual Studio Express 2010 pour Windows Phone, et vous voilà parti !
Vous vous sentez l’âme d’un speaker ?
Proposez-nous votre session, ou venez co-animer une session sur un sujet que vous connaissez comme votre poche.
Cette année, vous pourrez faire vos propositions par l’intermédiaire d’un outil en ligne.
Toutes les infos ici
Une nouvelle documentation dédiée aux développeurs Sharepoint Online est disponible sur le MSDN :
Sharepoint Online : An Overview For Developers
Les sujets abordés sont:
Introduction to Sharepoint Online Customizing Sharepoint Online Using Sharepoint Designer 2010 Developing Sharepoint Online Solutions Accessing Sharepoint Data Through the Client Object Model Sharepoint Web Services Available in Sharepoint Online Comparison of Sharepoint Online Features and Sharepoint Server Features
Vous y trouverez une comparaison intéressante des fonctionnalités de dev disponibles entre la version OnPremises et Online.
[AddOn : La vidéo est ici !]
Fin des MsDays sur les chapeaux de roues !
C’est toujours intéressant de vous rencontrer et d’avoir un retour live (ou différé via ce blog ) de votre part. Cela nous permet d’évaluer les sujets qui vous ont le plus intéressés pour écrire plus d’articles dans ce sens.
En retour à ma session “Développement Sharepoint”, je constate que OData vous intéresse particulièrement ainsi que le développement d’applications Silverlight exploitant Sharepoint. Les sandbox qui sont très intéressantes ont suscité moins de retour, mais c’est peut-être simplement parce que c’est un peu moins…sexy, à première vue en tout cas.
Si vous n’avez pas pu assister à la session (ou que vous êtes Nantais !), vous pourrez la voir en webcast. D’habitude, les sessions sont webcastées en live durant l’événement mais cette fois elles ont été enregistrées en studio et devraient donc être plus agréables à suivre. Je vous posterai le lien sur ce blog dès qu’il sera disponible.
En attendant, voici les slides en pfd :