[RIA Services] Include et DomainDataSource

Dans un de mes articles précédents, j'avais parlé des DomainDataSource avec RIA Services dans le cas d'une interface Maître - Détail. Dans le même principe, je vais parler d'une autre manière de mettre en forme ce cas d'interface avec RIA Services. Et pour cela je vais utiliser une méthode qui me parait plus simple mais moins paramétrable, je vais utiliser la méthode Include mise à disposition par Entity Framework pour récupérer explicitement les informations des autres entités ayant une relation avec l'entité requêtée à l'origine.

Dans notre exemple, nous allons de nouveau prendre les tables Customers et Orders de la base de données Northwind, ces deux tables sont reliées par une liaison grâce à la clé étrangère CustomerID se trouvant dans la table Orders.

FK

Il faut créer un ADO.NET Entity Data Model via Entity Framework avec les tables Customers et Orders, et ensuite un DomainService, où il ne faut pas oublier de cocher la case suivante :

Metada

Cela permet de générer la création d'un fichier metadata contenant les classes et les propriétés associées aux membres de nos entités.

Dans notre DomainService, il faut modifier la méthode GetCustomers générée et lui ajouter la méthode Include pour qu'elle puisse récupérer les informations concernant les commandes effectuées par le client :

public IQueryable<Customers> GetCustomers()
{
return this.ObjectContext.Customers.Include("Orders");
}


Ensuite dans le fichier metadata, généré il faut ajouter le tag [Include] au dessus de la propriété Orders de la class CustomersMetadata sur laquelle on souhaite effectuer l'include :

[Include]
public EntityCollection<Orders> Orders { get; set; }


Et enfin, il ne reste plus qu'à faire le DomainDataSource et le Binding côté XAML :

<RIAControl:DomainDataSource x:Name="source" QueryName="GetCustomers" AutoLoad="True">
  <RIAControl:DomainDataSource.DomainContext>
     <domain:NorthwindContext />
  </RIAControl:DomainDataSource.DomainContext>
</RIAControl:DomainDataSource>

<ComboBox ItemsSource="{Binding Data,ElementName=source}" Name="cbCustomers" />
<StackPanel DataContext="{Binding ElementName=cbCustomers, Path=SelectedItem}" >
     <RIAData:DataGrid ItemsSource="{Binding Orders}" AutoGenerateColumns="True" Name="dgOrders" />
</StackPanel>

Et l'on obtient le résultat suivant :

Resultat

[RIA Services] Maitre - Détail et DomainDataSource


A l'occasion d'un projet client, j'ai utilisé RIA Services avec Silverlight 3 (mais cela fonctionne aussi avec la version 4), et je l'ai utilisé pour une interface façon Maitre / Détail. Voici comment j'ai procédé pour arriver à mes fins.

Mise à jour avec Silverlight 4 RTW et RIA Services RC2

Nous allons prendre pour notre exemple la base de données Northwind avec ses tables Customers et Orders, et générer un ADO.NET Entity Data Model via Entity Framework :

Northwind

Voici l'interface que l'on souhaite réaliser, une ComboBox et une DataGrid. Suivant le client (Customers) sélectionné dans la ComboBox, les commandes correspondantes (Orders) s'afficheront dans la DataGrid :

Maitre Detail Ria Services SL

Pour réaliser cela, je me suis servie des DomainDataSource fournis par WCF RIA Services. Ils permettent de relier facilement avec du code XAML les interfaces utilisateurs et les données exposées via un DomainService.

Dans notre projet Silverlight, il ne faut pas oublier d'ajouter les espaces de noms dont on a besoin :

xmlns:riaControls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Ria"
xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
xmlns:domain="clr-namespace:RIADomainSourceParam.Web"


xmlns:riaControls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.DomainServices"
xmlns:data="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
xmlns:domain="clr-namespace:RIADomainSourceParam.Web"


  • System.Windows.Controls.Ria : pour utiliser les DomainDataSource
  • System.Windows.Controls.Data : pour pouvoir utiliser la DataGrid
  • RIADomainSourceParam.Web : le projet Web qui contient le DomainService déclarer auparavant qui va nous permettre d'interroger notre Entity Data Model.
  • System.Windows.Controls.DomainServices : pour utiliser les DomainDataSource
  • RIADomainSourceParam.Web : le projet Web qui contient le DomainService déclarer auparavant qui va nous permettre d'interroger notre Entity Data Model.


Ensuite il faut déclarer un premier DomainDataSource pour la ComboBox :

< riaControls:DomainDataSource x:Name="sourceCustomers" QueryName="GetCustomers" AutoLoad="True">
   <riaControls:DomainDataSource.DomainContext>
      <domain:NorthwindContext />
   </riaControls:DomainDataSource.DomainContext>
</riaControls:DomainDataSource>

<ComboBox x:Name="CbCustomers" ItemsSource="{Binding Data,ElementName=sourceCustomers}"
          ItemTemplate="{StaticResource DataTemplateComboBoxItelCustomers}"
          HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Row="0"
         
SelectionChanged ="C bCustomers_SelectionChanged" />

Dans les propriétés de notre DomainDataSource, on renseigne QueryName avec le nom de la requête générée et exposée par et dans notre DomainService, ici "GetCustomers", afin de lister tous les clients présents dans la table Customers.

public IQueryable<Customers> GetCustomers()
{
    return this.ObjectContext.Customers;
}


La propriété AutoLoad par défaut à "true" permet de charger les données automatiquement au chargement de l'interface. Ensuite, on renseigne le DomainContext, ici à "NorthwindContext".

Pour la ComboBox, on effectue le binding suivant pour la propriété ItemsSource, en faisant un lien vers le nom de notre DomainDataSource "sourceCustomers". Puis on abonne notre contrôle à l'évènement SelectionChanged afin de pouvoir savoir lorsque l'utilisateur sélectionne un client.

Et voilà notre ComboBox est maintenant reliée à nos données et elle peut afficher tous les noms des clients de la base de données !

Ensuite nous souhaitons mettre à jour notre DataGrid suivant le client sélectionné. Pour cela, il va falloir d'abord écrire une requête Linq permettant de sélectionner toutes les commandes de ce client. Pour cela, nous allons ajouter une méthode dans notre DomainService :

public IQueryable<Orders> GetOrdersWithParams(string myCustomerID)
{
   var query = from cust in this.ObjectContext.Orders
               where cust.CustomerID == myCustomerID
               select cust;
   return query;
}


Notre méthode prend en paramètre une chaine de caractère correspondant à l'identifiant du client sélectionné. Nous allons pouvoir déclarer un nouveau DomainDataSource pour notre DataGrid.

<riaControls:DomainDataSource x:Name="sourceOrders" QueryName="GetOrdersWithParams" AutoLoad="False">
   <riaControls:DomainDataSource.QueryParameters>
       <riaControls:ControlParameter ParameterName="myCustomerID"
                                     ControlName="CbCustomers"
                                     PropertyName="SelectedItem.CustomerID"
                                     RefreshEventName="SelectionChanged"/>
       </riaControls:DomainDataSource.QueryParameters>
   <riaControls:DomainDataSource.DomainContext>
       <domain:NorthwindContext />
   </riaControls:DomainDataSource.DomainContext>
</riaControls:DomainDataSource
>


<riaControls:DomainDataSource x:Name="sourceOrders" QueryName="GetOrdersWithParams" AutoLoad="False">
     <riaControls:DomainDataSource.QueryParameters>
        <riaControls:Parameter ParameterName="myCustomerID"
                               Value
="{Binding ElementName=
CbCustomers , Path=SelectedItem.CustomerID}" />
     </riaControls:DomainDataSource.QueryParameters>
     <riaControls:DomainDataSource.DomainContext>
        <domain:NorthwindContext />
     </riaControls:DomainDataSource.DomainContext>
</riaControls:DomainDataSource>



<data:DataGrid x:Name="DgOrders" ItemsSource="{Binding Data, ElementName=sourceOrders}"
               AutoGenerateColumns="true" Grid.Row="1" HorizontalAlignment="Stretch"
               VerticalAlignment="Stretch" />


On renseigne la propriété QueryName avec le nom de la méthode que l'on a déclaré auparavant "GetOrdersWithParams". La propriété AutoLoad est mise à "false", afin de ne charger les informations des commandes seulement lorsque l'utilisateur aura lui même sélectionné un client. Au déclenchement de l'évènement SelectionChanged de notre ComboBox, nous pourrons alors effectuer le Load du DomainDataSource :

private void CbCustomers_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
   sourceOrders.Load();
}


On ajoute ensuite le bloc DomainDataSource.QueryParameters dans notre DomainDataSource afin de pouvoir renseigner le paramètre qui va être utilisé dans notre requête Linq. Pour cela on renseigne les propriétés suivantes :
  • ParameterName : le nom du paramètre dans notre méthode myCustomerID
  • ControlName : le contrôle d'où vient la valeur du paramètre, ici notre ComboBox CbCustomers
  • PropertyName : la propriété de notre contrôle contenant la valeur, ici SelectedItem.CustomerID
  • RefreshEventName : l'évènement permettant la mise à jour de la valeur du paramètre, ici SelectionChanged
  • ParameterName : le nom du paramètre dans notre méthode myCustomerID
  • Value :  permet de donner la valeur du paramètre soit en passant une valeur soit en bindant avec la propriété d'un contrôle ici notre ComboBox

Puis on renseigne de la même manière que le précédent DomainContext à la valeur "NorthwindContext". Puis nous pouvons effectuer le binding de notre DataGrid, avec sa propriété ItemsSource en renseignant l'ElementName avec le nom de notre DomainDataSource "sourceOrders".

Et voilà ! Du XAML et une seule ligne de code-behind pour une interface Maitre-Détail !

[Techdays 2010] Webcasts et Slides

Les webcasts des sessions des Techdays 2010 sont maintenant disponibles en ligne !

Me concernant, voici les slides et le webcast de la session Blend 3 / Skechtflow : Dessinez c'est gagné ! (animée avec Michel Perfetti)

Les slides et le webcast :

Pour la session Les femmes dans l'IT : Quel modèle de développement de carrière pour les femmes travaillant dans l’IT ?

Les slides et le webcast :

Et enfin les slides du Workshop RIA Services (animé avec Michel Perfetti) :

Les sources du workshop sont toujours disponnibles ici !

[WPF] Contrôler son application depuis la taskbar de Windows 7 avec de simples boutons

Avec WPF 4, il est désormais possible de personnaliser le comportement de la taskbar ou barre des tâches lorsque votre application est en cours d'exécution.

Dans la MSDN, on trouve cette image décrivant très bien les différents éléments de l'aperçu d'une application dans la taskbar :

taskbar

Pour personnaliser la plupart de ces éléments, il faut rajouter tout d'abord dans le code XAML de votre interface le code suivant :

1
2
3
4
5
<Window.TaskbarItemInfo>
<TaskbarItemInfo>

</TaskbarItemInfo>
</Window.TaskbarItemInfo>

TaskbarItemInfo est l'élément qui va nous permettre d'accéder à toutes les propriétés concernant notre application dans la taskbar. Voici les propriétés proposées :

TaskbarItemInfo

Et ce que l'on peut obtenir avec ces propriétés :
  • Description : pour changer la description de l'application.
  • Overlay : pour ajouter une image dans l'icône présente dans la barre des tâches.
  • ProgressState : pour changer l'état de la barre de progression.
  • ProgressValue : pour donner une valeur à l'avancé de la barre de progression.
  • ThumbButtonInfos : pour ajouter des boutons.
  • ThumbnailClipMargin : pour modifier les marges de la miniature dans l'aperçu de l'application.

Aujourd'hui nous allons nous concentrer sur les boutons. On souhaite pouvoir contrôler l'application depuis trois boutons présents dans l'aperçu de l'application de la barre des tâches. Voici l'exemple que l'on cherche à avoir (pour ceux qui étaient présents à la session Coding for Fun des Techdays 2010, Mitsu pouvait jouer avec son Tetris grâce à des boutons dans l'aperçu Smile) :

ButtonTaskbar

L'application est composée de deux boutons, permettant chacun d'afficher un message via un MessageBox. On souhaite pouvoir afficher ces messages depuis la taskbar, et aussi pouvoir quitter l'application avec le troisième bouton.

Voici le code pour ajouter les boutons dans l'aperçu de la taskbar :

1
2
3
4
5
6
7
8
9
    <Window.TaskbarItemInfo>
<TaskbarItemInfo>
<TaskbarItemInfo.ThumbButtonInfos>
<ThumbButtonInfo Description="Hello" ImageSource="office1.ico" />
<ThumbButtonInfo Description="Goodbye" ImageSource="office2.ico" />
<ThumbButtonInfo Description="Close" ImageSource="office3.ico" />
</TaskbarItemInfo.ThumbButtonInfos>
</TaskbarItemInfo>
</Window.TaskbarItemInfo>

La balise TaskbarItemInfo.ThumbButtonInfos contient une collection de ThumbButtonInfo qui sont les boutons présents dans notre aperçu. Les propriétés pour chaque bouton sont les suivantes :

ThumbButtonInfo Properties   ThumbButtonInfo Events

Les événements pour ces boutons sont des plus classiques : Changed et Click.

Les propriétés des boutons permettent les actions suivantes :
  • Command, CommandParameter, CommandTarget : permet d'associer un comportement au bouton avec ou sans paramètres, dans le cas de l'utilisation du pattern MVVM avec l'interface ICommand, ces propriétés peuvent être utile pour binder le behaviour correspondant. Sinon l'événement Click suffira simplement.
  • Description : permet de modifier la description qui apparait au dessus du bouton lors du passage de la souris.
  • DismissWhenClicked : permet de fermer l'aperçu lorsque l'on clique sur ce bouton.
  • ImageSource : permet de mettre une image dans  le bouton.
  • IsBackgroundVisible : permet de rendre l'arrière-plan visible.
IsBackgroundVisible = true et IsBackroundVisible = false

BackgroundVisible   BackgroundNotVisible

  • IsEnabled : active ou désactive le bouton en le grisant.
IsEnabled = true et IsEnabled = false (troisième bouton grisé)

IsEnabledTrue  IsEnabledFalse


  • IsInteractive : permet de rendre le bouton cliquable ou non. A la différence du IsEnabled, le bouton reste visible mais sans le griser.
IsInteractive = true et IsInteractive = false (deuxième bouton non cliquable mais non grisé)

BackgroundVisible  IsInteractiveFalse

  • Visibility : permet de rendre visible ou invisible le bouton de plusieurs façons différentes.
Visibility = Visible et Visibility = Hidden et Visibility = Collapsed

IsEnabledTrue  VisibilityHidden  VisibilityCollapsed

Pour notre application, il suffit de relier les événements Click de nos boutons de la taskbar aux événements Click des boutons présents dans l'application :

1
2
3
4
5
6
7
8
9
    <Window.TaskbarItemInfo>
<TaskbarItemInfo>
<TaskbarItemInfo.ThumbButtonInfos>
<ThumbButtonInfo Description="Hello" Click="btnHello_Click" ImageSource="office1.ico" />
<ThumbButtonInfo Description="Goodbye" Click="btnGoodbye_Click" ImageSource="office2.ico" />
<ThumbButtonInfo Description="Close" Click="ThumbButtonInfo_Click" ImageSource="office3.ico" />
</TaskbarItemInfo.ThumbButtonInfos>
</TaskbarItemInfo>
</Window.TaskbarItemInfo>

Et l'on obtient une application que l'on peut piloter à partir des boutons présents dans l'aperçu de la taskbar :

Final

[Techdays 2010] Sources du Workshop RIA Services

A la fin du workshop RIA Services, j'avais promis que les sources seraient disponibles, et les voici.
Une archive contenant 2 projets :
  • RIALabStart : le projet de départ pour réaliser le workshop
  • RIALabFinal : le projet à la fin du workshop
Pour télécharger l'archive c'est ici !

[Techdays 2010] 2 Sessions, 1 Workshop et ATE


Cette année vous pourrez me retrouver aux Techdays 2010 comme speaker et ATE (Ask The Expert) sur le stand MSDN.

Techdays 2010

Les 2 sessions que j'anime sont :
  • Lundi 8 février 2010 de 16:00- 17:00 : Blend 3/Sketchflow, dessinez c'est gagné (avec Michel Perfetti) : Sketchflow permet de développer des prototypes dynamiques tendant à un comportement fonctionnel proche de la réalité. Cette session aborde les principes de base du design de prototype avec Sketchflow, comme l'interactivité avec l'utilisateur et les données, ainsi que la façon dont Sketchflow s'inscrit dans le cycle de prototypage.

  • Mardi 9 février 2010 de 11:00- 12:00 : Quel modèle de développement de carrière pour les femmes travaillant dans l'IT ? : L'informaticienne, est une espèce rare. En école d'ingénieurs ou en entreprise, les femmes se comptent sur les doigts d'une main. Cela est encore plus vrai à mesure que l'on se rapproche des postes à responsabilité : en 2012, 40% des femmes qui travaillent dans l'IT s'en éloigneront au cours de leur carrière n'y voyant pas d'évolution possible. Pendant une heure nous démontrerons au travers de témoignages et de conseils que les femmes dans l'IT sont des Hommes comme les autres, et qu'il est possible d'être une femme active dans un « monde d'hommes ».
Le workshop :
  • Lundi 8 février 2010 de 13:00- 14:00 : Workshop : RIA Service (avec Michel Perfetti) : Venez découvrir comment, en partant de 0, vous pouvez créer une couche d'accès aux données via Entity Framework puis, pour projeter l'ensemble via RIA svc.

Classé sous

[Silverlight] Drag & Drop avec Silverlight 4

Une autre nouveauté de Silverlight 4 Beta est la possibilité de faire du Drag & Drop de fichiers (ou Glisser-Déposer si vous préférez Smile) directement dans votre navigateur préféré. Voici un bout de code pour illustrer cette fonctionnalité !

Tout d'abord voici notre interface de départ :

Le XAML correspondant :

1
2
3
4
5
6
7
8
    <Grid x:Name="LayoutRoot" Height="486" Width="684">
<Grid.Background>
<ImageBrush ImageSource="/SL4DragDop;component/Images/cadre_triple_fini.png" />
</Grid.Background>
<Canvas Height="324" Margin="87,82,83,0" Name="canvas1" VerticalAlignment="Top" Width="514"
                     AllowDrop="True" Drop="canvas1_Drop" Background="White">
<dataInput:Label Canvas.Left="96" Canvas.Top="117" Height="76" Name="label1" Width="330" Content="Déposer ici !" FontSize="48" />
</Canvas>
</Grid>

Deux informations importantes sont à retenir dans ce XAML :

  • La nouvelle propriété AllowDrop qui permet de dire que le canvas peut être utiliser pour du Drag & Drop.
  • Le nouvel évènement Drop qui est déclenché lorsqu'un élément est déposé en Drag & Drop sur l'UIElement auquel il est attaché.

Ensuite du côté du code-behind :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
private void canvas1_Drop(object sender, DragEventArgs e)
{
FileInfo[] files = e.Data.GetData(DataFormats.FileDrop) as FileInfo[];


foreach (FileInfo file in files)
{
if (file.Extension == ".jpg")
{
Point dropPosition = e.GetPosition(canvas1);

if ((dropPosition.X+150) < canvas1.Width && (dropPosition.Y+150) < canvas1.Height)
{
Stream stream = file.OpenRead();
Image myImg = new Image()
{
Width = 150,
Height = 150
};


BitmapImage myBitmapImg = new BitmapImage();
myBitmapImg.SetSource(stream);
myImg.Source = myBitmapImg;


canvas1.Children.Add(myImg);
myImg.SetValue(Canvas.TopProperty, dropPosition.Y);
myImg.SetValue(Canvas.LeftProperty, dropPosition.X);
}
else
{
MessageBox.Show("Attention l'image dépasse du cadre !");
}
}
}
}

Tout d'abord, on récupére les FileInfo qui ont été déposés en Drag & Drop sur le canvas et on les stock dans un tableau. Un foreach va nous permettre de les afficher sur notre interface (avec une petite condition qui vérifie si les images ne vont pas dépasser du cadre) et de les positionner à l'endroit où on les a déposé précédemment.

Drag & Drop :

Drag & Drop Error Wink :


Classé sous , ,

[Silverlight] L'impression avec Silverlight 4

Suite aux annonces de la PDC09, Silverlight 4 permet maintenant d'imprimer. Cette fonctionnalité est très importante pour les applications métiers et souvent cette fonctionnalité est incontournable pour un client : pouvoir imprimer un rapport, un graphique, etc...

Cette fonctionnalité est toute simple mais tellement importante !

Voici 3 cas d'utilisation :

  • Impression de l'écran :

Pour notre exemple, voici l'interface de l'application :




Le code XAML :

1
2
3
4
5
6
7
8
9
10
<Grid x:Name="LayoutRoot" Height="447" Width="637" >
<Grid.Background>
<ImageBrush ImageSource="/SL4Print;component/Images/blue_tiles.jpg" />
</Grid.Background>
<StackPanel Height="173" HorizontalAlignment="Center" Margin="108,140,104,0" Name="stackPanel1" VerticalAlignment="Top" Width="425" Orientation="Horizontal">
<Image Height="150" Name="image1" Stretch="Fill" Width="200" Margin="5" Source="/SL4Print;component/Images/Desert.jpg" />
<Image Height="150" Name="image2" Stretch="Fill" Width="200" Margin="5" Source="/SL4Print;component/Images/Chrysanthemum.jpg" />
</StackPanel>
<Button Content="Imprimer" Height="39" HorizontalAlignment="Center" Margin="200,345,335,0" Name="button1" VerticalAlignment="Top" Width="102" Click="button1_Click" />
</Grid>


Le code-behind pour l'impression :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public MainPage()
{
InitializeComponent();
myPrintDoc.PrintPage += new EventHandler<PrintPageEventArgs>(myPrintDoc_PrintPage);
}


void myPrintDoc_PrintPage(object sender, PrintPageEventArgs e)
{
e.PageVisual = stackPanel1;
e.HasMorePages = false;
}


PrintDocument myPrintDoc = new PrintDocument();

private void button1_Click(object sender, RoutedEventArgs e)
{
myPrintDoc.DocumentName = "monDoc";
myPrintDoc.Print();
}


Dans le MainPage, il est important de s'abonner à l'évènement PrintPage afin de pouvoir définir ce que l'on souhaite imprimer.

L'élément essentiel est le PrintDocument qui est la nouvelle classe d'impression pour Silverlight 4, grâce à elle, on peut désormais déclarer un document qui va nous permettre de gérer l'impression, ici "myPrintDoc".

Dans la méthode "button1_click" (liée à l'évènement click du bouton "Imprimer"), on donne un nom à "myPrintDoc" qui sera le nom proposé par défaut lors de l'impression via une imprimante virtuelle (type PDF, XPS, etc...). Et ensuite, la méthode "Print" est appelée pour lancer l'impression.

L'événement PrintPage est alors levé, et la méthode "myPrintDoc_PrintPage" est appelée. C'est ici qu'il est important de bien préciser ce que l'on souhaite imprimer dans la propriété PageVisual, qui prend un UIElement comme valeur. Dans notre exemple, nous allons lui donner "LayoutRoot" qui est la Grid qui contient toute notre interface. De plus, la propriété HasMorePage, permet d'indiquer si d'autres pages doivent être imprimer ou non. Dans notre cas, nous n'avons qu'une seule page à imprimer, par conséquent HasMorePage est à false.

Et voici le résultat :

 

  • Impression d'une partie de l'écran

Il est possible de n'imprimer qu'une partie de l'interface en précisant le nom de l'UIElement à imprimer, ici nous allons mettre "stackPanel1" qui contient les 2 images dans la propriété PageVisual, afin de ne pas avoir l'image de fond et le bouton Imprimer sur notre impression.

Voici le résultat :

 

  • Modèle d'impression

Il est possible de définir un modèle d'impression afin d'organiser les éléments que l'on souhaite imprimer d'une manière différente de celle qui est présentée à l'écran et de rajouter des éléments non présents sur l'interface. Pour cela il faut créer une arborescence d'UIElement dans l'événement PrintPage et de renseigner le nom de l'UIElement racine à la propriété PageVisual pour l'impression.

Le code-behind de notre exemple :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
void myPrintDoc_PrintPage(object sender, PrintPageEventArgs e)
{
StackPanel stackPrint = new StackPanel()
{
Width = e.PrintableArea.Width,
Height = e.PrintableArea.Height,
Orientation = Orientation.Vertical,
Background = new SolidColorBrush(Colors.LightGray)
};


stackPrint.Measure(e.PrintableArea);

printImage(stackPrint, image1);
printImage(stackPrint, image2);


TextBlock txtBlock = new TextBlock();
txtBlock.Text = "Test Imprim Custom";
txtBlock.HorizontalAlignment = HorizontalAlignment.Center;

stackPrint.Children.Add(txtBlock);


e.PageVisual = stackPrint;
e.HasMorePages = false;
}


private void printImage(StackPanel stackPrint, Image myImage)
{
Rectangle rect = new Rectangle()
{
Width = myImage.Width,
Height = myImage.Height,
Margin = new Thickness(10),
Fill = new ImageBrush()
{
ImageSource = myImage.Source
}
};


stackPrint.Children.Add(rect);
}

L'élément StackPanel "stackPrint" est l'UIElement parent qui va contenir les 2 images et un TextBlock en plus.

Le résultat :

Bonne impression à tous ! Smile


Classé sous , ,

[Silverlight] Installer Silverlight 4 dans Visual Studio 2010

Voici un petit récapitulatif de ce qu'il faut installer pour pouvoir développer en Silverlight 4 Beta :
Voici ce que l'on peut aussi installer en plus :
Pour les personnes ne souhaitant installer que le runtime :

Une fois que l'on a installé ce que l'on souhaitait voici ce que l'on obtient dans Visual Studio 2010 en créant une nouvelle application Silverlight :



Dans les options, il est désormais possible de choisir avec quelle version de Silverlight on souhaite développer, et donc pas de soucis pour continuer à développer des applications pour ses clients en Silverlight 3.0 et s'amuser avec Silverlight 4 Smile

Classé sous

[LiveMeeting] Marine, 18 ans, aujourd'hui le bac et demain pourquoi pas l'informatique ?

Jeudi prochain se déroulera un Live Meeting des Women In IT dans les locaux de Microsoft France, à Issy-les-Moulineaux. Le thème de cet événement sera composé d'échanges entre : une lycéenne en terminale S, une professionnelle de l’informatique (moi Smile), une Directrice des Systèmes d’Information, une directrice d’école d’informatique et une RH, pour comprendre les motivations, choix ou freins d’une jeune fille à s’orienter vers une carrière informatique.

Vous pourrez suivre ce Live Meeting en direct, Jeudi 26 Novembre 2009 à partir de 18h30 ! Et pour celles qui ne pourront pas être devant leur écran, il sera ensuite disponible en ligne !

Ci-dessous le lien d’inscription  : http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032428379&Culture=fr-FR

Classé sous

[Toolkit] Sortie du Facebook Developer Toolkit v3.0

Depuis quelques jours, le Facebook Developer Toolkit v3.0 est sorti sur Codeplex ! Ce toolkit permet de faciliter les développements utilisant la plateforme Facebook. Ce toolkit est composé de 5 dll :

  • Facebook.dll : cette assembly est la principal, elle peut être utilisée pour des développements Silverlight et WPF.
  • Facebook.Silverlight.dll : cette assembly est spécifique pour Silverlight.
  • Facebook.Web.dll : cette assembly est fait pour le développement web (ASP.NET).
  • Facebook.Web.Mvc.dll : cette assembly est plus spécifiquement dédiée au développement ASP.NET MVC.
  • Facebook.Winforms.dll : cette assembly concerne le développement des Windows Forms.

Facebook logo

Pour plus d'informations une page sur le site MSDN est consacrée à ce toolkit, et une aide en ligne est disponible !
Je vais aller tester tout ça !


Classé sous , , , ,

[VS2010 - WPF 4] Récapitulatif des nouveautés par Scott Guthrie


Dans sa dernière série d'articles, Scott Guthrie présente les nouveautés de Visual Studio 2010 et du Framework 4.0.
Et son dernier article parle des nouveautés de WPF 4 !

Voici un petit sommaire des principales nouveautés de WPF 4 évoquées dans l'article de Scott Guthrie :
  • Les nouveaux Controls :
    • Interfaces riches : Datagrid, DatePicker, Calendar
    • AnimatingTilePanel, ColorPicker, InfoTextBox, ListPager, NumericUpDown, Reveal, TransitionsPresenter, TreeMapPanel
    • style Windows 7 et Office (Ribbon)
  • Les Graphiques
    • Cached Composition
    • Pixel Shader 3
    • LayoutRounding
    • Fonction Animation Easing
    • CleartypeHint
  • Les Textes
    • Nouveau rendu du texte
    • BindableRun
    • Custom Dictionaries
    • Selection and Caret Brush
  • Windows 7
    • Support du Multitouch pour Windows 7
    • Intégration du Shell de Windows 7
    • Icones dans la barre des tâches
    • Barre de progression dans la barre des tâches
    • Miniatures de la barre des tâches
  • Les bases de WPF
    • Nouveau moteur de parsing XAML/BAML
    • Data Binding Support pour la DLR
    • Visual State Manager (VSM)
    • Interop HTML-XBAP Script
    • UIAutomation Virtualization
    • Pattern SynchronizedInput
  • Le déployement client
    • .NET Framework 4 Client Profile
    • Enhancements in NET4 Client Profile vs. NET 3.5 SP1 Client Profile
    • Full Trust XBAP Deployment

Pour plus de détails et d'informations voici le lien vers son article :
http://weblogs.asp.net/scottgu/archive/2009/10/26/wpf-4-vs-2010-and-net-4-0-series.aspx

Bonne lecture Smile

Classé sous ,

[VS2010] Nouvelle fenêtre des propriétés

Comme cela a été annoncé un peu partout, la beta 2 de Visual Studio 2010 est maintenant disponible en téléchargement sur la MSDN pour les abonnés (Michel a été le plus rapide Wink).

Logo Visual Studio 2010

Lorsque l'on ouvre un projet WPF avec cette nouvelle version de Visual Studio, la structure de l'interface et l'agencement des fenêtres restent globalement les mêmes. Les fenêtres sont aux mêmes endroits, les développeurs ne seront pas perdus en prenant en main cette nouvelle version.

Mais si on se penche un plus sur cette interface de travail, on s'aperçoit de quelques changements qui vont nous faciliter notre vie de développeur WPF. Nous allons regarder de plus près la fenêtre de propriétés où on peut trouver plusieurs de ces nouveautés.

Tout d'abord pour chaque propriété on peut observer un petit carré entre le nom de la propriété et sa valeur. En cliquant dessus, un menu apparait :

Grâce à ce menu, il est maintenant possible de :

  • remettre à son état initial la valeur de la propriété
  • associer à un Binding
  • associer à une Resource
  • extraire la valeur de la propriété en tant que Resource

Il sera possible d'extraire la ressource soit en Window.Resources (dans le fichier xaml courant) soit en Application.Resources (dans le app.xaml).

Ce carré change d'état suivant la valeur et le type de la valeur de la propriété :

  •  : lorsque la propriété n'a pas été modifiée ou n'a pas de valeur
  •  : lorsqu'une valeur a été attribuée à la propriété
  • : lorsqu'une ressource est attaché à la propriété
  • : lorsqu'un binding est attaché à la propriété

 

Autres nouveautés de cette fenêtre de propriétés, une nouvelle possibilité de trier les propriétés et un champ de recherche.

Il est toujours possible de trier les propriétés par catégories et par ordre alphabétique, et désormais, il est possible d'afficher d'un côté les propriétés ayant une valeur et de l'autre celles qui ne sont pas renseignées :

Et maintenant il est possible de rechercher une propriété grâce à la barre de recherche, l'affichage des résultats se met à jour automatique à chaque caractère entré dans le champ de recherche :


Classé sous

[Silverlight] Webcasts du FireStarter - Silverlight 3

Suite à l'article concernant les slides de la keynote de Scott Guthrie du FireStarter - Silverlight 3, les webcasts de toutes les sessions de cet évènement sont disponibles !

FireStarter - Silverlight 3

En voici la liste :

  • Event Kick Off par Mithun Dhar
  • Keynote par Scott Guthrie
  • Key Silverlight Scenarios par Tim Heuer
  • Expression 3 Overview (Includes Behaviors) par Adam Kinney
  • Sketch Flow par Janete Perez
  • Toolkit & Controls par Justin Angel et Shawn Oster
  • RIA Services par Brad Abrams
  • Building Silverlight UIs with XAML Power toys par Karl Shifflett
  • Q&A Panel par tous les speakers

Les webcasts sont disponbiles ici ! (bas de page)

 


Classé sous ,

[Surface] Des vidéos pour tout savoir sur Surface !

Voici quelques vidéos pour tout savoir et tout comprendre sur Surface ! (anglophobes passez votre chemin Wink)


Tout d'abord une vidéo de 30 secondes pour présenter très rapidement ce qu'est Surface :

Microsoft Surface in :30 from Phenomblue on Vimeo.


Ensuite, une playlist de 14 vidéos du Dr Neil en discussion avec l'équipe de nsquared sur son retour d'expérience en tant que formateur de développeurs Surface :


Voici la liste des sujets abordés dans les différentes vidéos :

  • Developpement Skills
  • Surface Vision
  • Unpacking Surface
  • Surface Capabilities
  • Surface Simulator
  • Surface Shell
  • Controls
  • Design Principles
  • Less is more
  • Vision system
  • Validating Design Decisions
  • Surface vs TouchPack

Enfin, à noter qu'actuellement un concours d'application sur Surface est organisé pour gagner sa propore Table Surface ! Pour plus d'infos : http://blogs.msdn.com/surface/archive/2009/09/29/reminder-your-chance-to-win-a-microsoft-surface.aspx


Classé sous

[Silverlight] Slides de la Keynote FireStarter - Silverlight 3 par Scott Guthrie

Hier se déroulait à Redmond une journée de sessions consacrées à Silverlight 3 : le FireStarter - Silverlight 3. Cet événement se concentrait essentiellement sur 3 axes :

  • Les nouveautés de Silverlight 3
  • Les nouveautés de la gamme Expression 3
  • .NET RIA Services, Toolkits, Controls, etc...

FireStarter - Silverlight 3

Il était possible de suivre ces sessions à là fois en personne mais aussi en direct sur Internet via un live meeting créé pour l'occasion tout en Silverlight 3.

Les sessions étaient les suviantes :

  • Keynote (Scott Guthrie)
  • Key Silverlight Scenarios (Tim Heuer)
  • Expression 3 Overview (Adam Kinney)
  • Sketch Flow (Janete Perez)
  • Toolkit & Controls (Justin Angel et Shawn Oster)
  • RIA Services (Brad Abrams)
  • Building Silverlight UIs with XAML Power toys (Karl Shifflett)

Les slides ont été rapidement publiées, et les webcast devraient sortir d'ici une semaine. Voici les slides de la keynote qui a été présentée par Scott Guthrie : 

Les slides des autres sessions sont disponibles en suivant ce lien : 

http://blogs.msdn.com/mithund/archive/2009/09/17/silverlight-3-firestarter-slides.aspx


Classé sous

[Silverlight] Un nouveau Coach pour Silverlight 3

Coach SilverlightSur le site MSDN, le Coach Silverlight a été mis jour avec des nouveaux chapitres consacrés à Silverlight 3. Les premiers chapitres viennent d'être publiés :

  • Présentation générale de Silverlight 3
  • Quels outils utiliser ?
  • Les bases d’une application Silverlight
  • Atelier 1 : Concepts principaux : XAML, formes de base, gestion évènements

Dans les ateliers à venir certain vont être très intéressant :

  • Atelier 2 : Gestion de la vidéo avec Silverlight et Web Client
  • Atelier 3 : Les styles, le templating et le DataBinding
  • Atelier 4 : Binding entre éléments, transformations et projection 3D
  • Atelier 5 : Animations classiques, Easy Animations et moteur physique
  • Atelier 6 : WCF et Silverlight 3
  • Atelier 7 : SandBoxing, Open/SaveFileDialog, Quota
  • Atelier 8 : Pixel Shaders
  • Atelier 9 : L’accélération matérielle avec le GPU
  • Atelier 10 : Out of Browser et les autres nouveautés de Silverlight 3
  • Atelier 11 : Introduction à .NET RIA Services

Les Coachs Silverlight 1 et 2 sont toujours disponibles !

Bonne lecture Smile


Classé sous ,

[VPC 2007] Comment accéder à un répertoire de sa machine physique

Voici le problème que j'ai rencontré ce soir en voulant installer VS2010 sur une VPC Windows 7.

Ayant une ISO pour installer VS2010 j'ai voulu rapatrier ce fichier via un répertoire partagé sur ma VPC. Comme d'habitude je vais dans le menu "Edit -> Settings" et je clique sur "Shared Folders", et là l'écran permettant de partager un répertoire est grisé avec ce message :

Interface Settings

La question est, mais où est ce que je vais trouver et installer "Virtual Machine Additions" ? Après quelques recherches sur Internet, voici la solution.

Il faut tout d'abord démarrer sa VPC, et ensuite cliquer sur le menu "File" puis sur "Install or Update Virtual Machine Additions" :

Menu Install

Ensuite l'installation de "Virtual Machine Additions" se lance et installe ce qu'il faut :

Installeur Virtual Machine Additions

La machine virtuelle doit être redémarrée après cette installation. 

Et maintenant il est possible pour cette machine virtuelle de pouvoir accéder à un répertoire partagé de la machine physique Smile :

Shared Folders


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