Dans cet article nous allons voir comment créer facilement une petite application de conversion d'un fichier XAML représentant un contrôle en un fichier image. Cela est aussi une bonne introduction pour ceux voulant découvrir la création d'un screenshot d'un contrôle en WPF.
Les points abordés sont donc :
- Comment créer un screenshot d'un contrôle dans une taille bien précise (vous spécifiez la taille voulue),
- Comment charger un fichier XAML externe dans une application WPF.
Charger un fichier XAML externe dans une application WPF.
Le code a utiliser est très simple et utilise principalement XAMLReader pour créer un Visual et l'afficher dans votre application :
Microsoft.Win32|>.OpenFileDialog dialog =
new Microsoft.Win32|>.OpenFileDialog();
dialog.Title = "Select the XAML file.";
dialog.AddExtension = true;
dialog.CheckFileExists = true;
dialog.DefaultExt = ".xaml";
dialog.Filter = "Xaml files |*.xaml";
if (dialog.ShowDialog() == true)
{
String path = dialog.FileName;
UIElement visual = XamlReader.Load(System.Xml.XmlReader.Create(path)) as UIElement;
if (visual != null)
{
_docker.Children.Add(visual);
}
else
{
MessageBox.Show("Cannot load the UiElement from the XAML.", "Error", MessageBoxButton.OK);
this.Close();
}
}
Créer un screenshot d'un contrôle en spécifiant la taille voulue
Afin de créer le screenshot d'un contrôle, ou de n'importe quel composant héritant de Visual, nous allons utiliser une syntaxe un peu différente de celle utilisé classiquement. L'astuce consiste à instancier un Brush à partir du Visual et d'appliquer ce Brush sur un Rectangle dans un DrawingContext.
Voici le code :
Visual theVisual = _docker; //Ici on place le Visual chargé
//La taille du screenshot voulu
double width = Convert.ToDouble(_widthTextB.Text);
double height = Convert.ToDouble(_heightTextB.Text);
if (double.IsNaN(width) || double.IsNaN(height))
{
throw new FormatException("Vous devez indiquer la taille du UIElement voulue.");
}
Size size = new Size(width, height);
DrawingVisual drawingVisual = new DrawingVisual();
//Création du VisualBrush
VisualBrush vBrush = new VisualBrush(theVisual);
using (DrawingContext dc = drawingVisual.RenderOpen())
{
dc.DrawRectangle(vBrush, null, new Rect(new Point(), size));
}
RenderTargetBitmap render = new RenderTargetBitmap(
Convert.ToInt32(1900),
Convert.ToInt32(1200),
96,
96,
PixelFormats.Pbgra32);
//De quel controle veut-on faire le screenshot ?
render.Render(drawingVisual);
Stream oStream = new FileStream("out.png", FileMode.Create);
PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(render));
encoder.Save(oStream);
oStream.Flush();
oStream.Close();
Et voici le résultat
Ci-dessous un screenshot de l'application finale. Tout fonctionne parfaitement si le contrôle chargé est bien configuré pour d'étendre (Stretch) dans le contrôle ou il est placé.

(Article traduit de l'anglais depuis : http://blog.lexique-du-net.com )