WPF France

  • Augmenter la taille
  • Taille par défaut
  • Diminuer la taille

Charger et convertir en image un contrôle XAML

Envoyer Imprimer PDF
Note des utilisateurs: / 2
MauvaisTrès bien 

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é.

XAMToPNGExporter_m

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

Commentaires (0)
Mise à jour le Mardi, 23 Mars 2010 10:16  

Partagez


Article au hasard

  • Il existe beaucoup de contrôles qui exposent des propriétés qui ne sont pas des DependencyProperty et qui rendent impossible de placer un binding dessus.
    Dans d’autres cas, nous avons juste un getter d’exposé et il est impossible d’accéder à la propriété directement pour y placer notre liaison. Pour ceux, téméraires qui souhaiterait essayer, vous obtiendrez le message suivant de Visual Studio : A 'Binding' cannot be set on the Lire la suite...