[PowerShell] PowerShell et WPF…… Hyper Cool….

Cela fait plusieurs fois que je publie des scripts basé sur PowerShell, même si je m’attache souvent à en faire un Windows Forms, l’aspect graphique reste un peu… comment dire… plat! Et comme me dit Christopher, il y a un effort à faire au niveau du GUI. Tout à fait d’accord! Alors pourquoi ne pas essayer de rendre ces scripts dans une interface plus sympa en WPF????

Le but dans cet article n’est pas de décrire WPF, il y en a assez aujourd’hui sur Internet, mais de décrire comment je vais utiliser  WPF et récupérer les contôles dans Powershell.

Pour commencer, mettons en place un simple Canvas dans Visual Studio avec une ComboBox et une TextBox. Voila ce que cela donne dans Visual:

wpf

Du côté du code XAML:

<Window 
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
  Title="WPF Powershell Get-Command" Height="300" Width="500">
<Canvas>
<ComboBox Name="MyDrop" Height="25" Width="200" Canvas.Top="10" Canvas.Left="10" >
</ComboBox>
<TextBox Name="Mytexte" Height="100" Width="480" Canvas.Top="40" Canvas.Left="10" IsReadOnly="True">
 Mon Texte
</TextBox>
</Canvas>
</Window> 

Du côté de PowerShell comment intégrer cette interface plus sympa? En fait c’est assez simple, mais il y a des contraintes, qui sont les suivantes:

Pour faire fonctionner le processus PowerShell en mode STA, il suffit de lancer la commande ‘Powershell.exe –STA’ dans une invite de commande.

Récupérez le code XAML généré dans Visual Studio et l’utiliser comme valeur de variable de type XML dans PowerShell. Voici un script, totalement commenté, PowerShell qui utilise le code XAML généré dans Visual Studio:

Le résultat en image…

wpf_PowerShell

#################################################################
# Chargement des Librairies
#################################################################
[Reflection.Assembly]::LoadWithPartialName("PresentationFramework")
[Reflection.Assembly]::LoadWithPartialName("PresentationCore")
[Reflection.Assembly]::LoadWithPartialName("WindowsBase")
#################################################################

#----------------------------------------------------------------
# Simple Get-Command utilisé pour peupler la DropDownBox dans WPF
#---------------------------------------------------------------- 
$My=get-command get-*
#----------------------------------------------------------------

#----------------------------------------------------------------
#Le code XAML envoyé dans une variable PowerShell
#----------------------------------------------------------------
[xml]$xaml = '
<Window 
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
  Title="WPF Powershell Get-Command" Height="300" Width="500">
<Canvas>
<ComboBox Name="MyDrop" Height="25" Width="200" Canvas.Top="10" Canvas.Left="10" >
</ComboBox>
<TextBox Name="Mytexte" Height="100" Width="480" Canvas.Top="40" Canvas.Left="10" 

IsReadOnly="True" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" Foreground="Red">
 Mon Texte
</TextBox>
</Canvas>
</Window>
' 
#--------------------------------------------------------------

#--------------------------------------------------------------
#Déclaration du code XML et de la Forms
#--------------------------------------------------------------
$wpf=(New-Object System.Xml.XmlNodeReader $xaml)
$Form=[Windows.Markup.XamlReader]::Load( $wpf )
#--------------------------------------------------------------

#-------------------------------------------------------------
#Récupération des contrôles WPF dans PowerShell
#-------------------------------------------------------------
$btndrop = $Form.FindName('MyDrop')
$Output = $Form.FindName('Mytexte')
#-------------------------------------------------------------

#-------------------------------------------------------------
#Boucle sur le Get-Command pour chacune des commandes existantes
#Envoi de chacune des commandes dans le DropDownBox
#------------------------------------------------------------- 
foreach ($une in $My)
{
$btnDrop.Items.Add($une)| out-null
} 
#-------------------------------------------------------------

#-------------------------------------------------------------
#Ajustons une propriété du contrôle TextBox
#-------------------------------------------------------------
$btnDrop.ToolTip = "Sélectionnez le DropDownBox"
#-------------------------------------------------------------

#-------------------------------------------------------------
# Recupération de l'événement SelectionChanged du contrôle
#-------------------------------------------------------------
$btnDrop.add_SelectionChanged({$Output.AppendText("Alors! Elles seront plus jolies les interfaces de mes scripts PowerShell maintenant!")})
#-------------------------------------------------------------

$Form.ShowDialog() | out-null

Dans le controle DropDownBox, se trouve le résultat du ‘Get-Command’ que nous avons envoyé:

WPF_PowerShell DropDownBox

Après plusieurs événements sur le contrôle….

WPF_PowerShell TextBox

Dans PowerShell, le type des contrôles est récupérable, ainsi que les méthodes, les événements est les propriétés:

GetType WPF

 WPF_PowerShell Events

Je vais pouvoir refaire tous mes scripts PowerShell en WPF sous Visual Studio… Euh! Non en fait, je n’aurais jamais le temps de les refaire tous… Vivement les prochaines vacances!

Technorati Tags: ,,,

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s