IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

imprimer chart control wpf


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2011
    Messages : 13
    Par défaut imprimer chart control wpf
    Salut à tous
    pourriez vous m'aider svp??
    je souhaite imprimer un graphique en c# 3.5 wpf.
    je réussi à afficher le graphique mais j'ai du mal à l'exporter par exemple sous pdf.

    Dans mon xaml je déclare le graphique comme suit:
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <charting:Chart x:Name="chart" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Stretch">
       <charting:Chart.Series>
          <charting: PieSeries ItemsSource="{Binding}"
             DependentValuePath="Value"
             IndependentValuePath="Key"
             Title="Pet Preference" IsSelectionEnabled="True"/>
       </charting:Chart.Series>
    </charting:Chart>
    ensuite dans le code behind, je lui fournit les données:
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    chart.DataContext = listdedonnees;

    et enfin pour imprimer le graphique généré, je fait:
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PrintDialog printDlg = new PrintDialog();
    printDlg.PrintVisual(chart, "NewGraphics");

    qui me permet de créer un nouveau document pdf dans lequel se trouve le graphique.
    mais il se trouve que le graphique apparait à moitié dans le document pdf???

    quelqu'un pourrait-il m'aider svp?

    Merci

  2. #2
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut
    Salut,

    PrintVisual, comm son nom l'indique, imprime ce qui est visible dans les mêmes dimensions. Donc si une partie de ton chart n'est pas visible à l'écran (scroll par exemple) ou si ça taille est supérieure aux dimensions de ton format de sortie (format A4 je pense), il est normal qu'il te manque un bout....

    Une solution pourrait être de récupérer ton chart sous forme d'image et ainsi de pouvoir le réduire aux bonnes dimensions.

    Voici un exemple de code que j'avais utilisé pour transformer un chart en image exploitable (avec la possibilité de rédéfinir la taille)

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     /// <summary>
            /// Méthode pour imprimer un composant dans un fichier .png
            /// </summary>
            /// <param name="fe">FrameworkElement à sauvegarder</param>
            /// <param name="ApplyCurrentSize">Indique si on définit une taille spécifique
            /// ou si l'on prend la taille d'origine</param>
            /// <param name="width">Nouvelle largueur</param>
            /// <param name="height">Nouvelle hauteur</param>
            /// <remarks>Extensions tolérées : .bmp .jpeg .png</remarks>
            public static RenderTargetBitmap GetBitmapFromElement(FrameworkElement fe, bool ApplyCurrentSize = true,
                int width = 0, int height = 0)
            {
                if (fe == null)
                    throw new NullReferenceException("FrameworkElement is null!");
     
                //on définit la taille 
                RenderTargetBitmap targetBitmap = ApplyCurrentSize
                    ? new RenderTargetBitmap((int)fe.ActualWidth, (int)fe.ActualHeight, //taille courante
                    96d, 96d,
                    PixelFormats.Default)
                    : new RenderTargetBitmap(width, height, //taille spécifique
                    96d, 96d,
                    PixelFormats.Default);
     
                //on crée un fond sinon c'est le noir par défaut
                DrawingVisual dv = new DrawingVisual();
                DrawingContext dc = dv.RenderOpen();
                Rect r = new Rect(0, 0, targetBitmap.Width, targetBitmap.Height);
                dc.DrawRectangle(Brushes.White, (Pen)null, r);
                dc.Close();
     
                //on ajoute le fond et le contrôle
                targetBitmap.Render(dv);
                targetBitmap.Render(fe);
     
                return targetBitmap;
            }

    Et ensuite une autre méthode pour imprimer

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    /// <summary>
     /// Enregistre un bitmap
            /// </summary>
            /// <param name="rtb">Bitmap à enregistrer</param>
            public static void SaveBitmap(RenderTargetBitmap rtb)
            {
                string filename = "";
                Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
                dlg.DefaultExt = ".png";
                dlg.Filter = "Images Files |*.png;*.bmp;*.jpeg";
                if (dlg.ShowDialog() == true)
                {
                    filename = dlg.FileName;          
                    //on encode
                    BmpBitmapEncoder encoder = new BmpBitmapEncoder();
                    encoder.Frames.Add(BitmapFrame.Create(rtb));
     
                    try
                    {
                        //on écrit
                        using (FileStream fs = File.Open(filename, FileMode.OpenOrCreate))
                        {
                            encoder.Save(fs);
                        }
                    }
                    catch (IOException)
                    {
                        throw new IOException("Unable to save element, check path !");
                    }
     
                }            
     
            }

    En espérant que cela puisse t'aider..

    @+

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2011
    Messages : 13
    Par défaut
    Bonjour,
    merci pour ce code, c'est nikel!!
    mais dans mes recherches, j'ai trouvé plus simple!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    Rect bounds = VisualTreeHelper.GetDescendantBounds(chart);
                    double dpiX = 300, dpiY = 300;
                    RenderTargetBitmap rtb = new RenderTargetBitmap(
                                   (int)(bounds.Width * dpiX / 96.0), (int)(bounds.Height * dpiY / 96.0), dpiX, dpiY, PixelFormats.Pbgra32);
     
                    DrawingVisual dv = new DrawingVisual();
     
                    using (DrawingContext ctx = dv.RenderOpen())
                    {
                        VisualBrush vb = new VisualBrush(chart);
                        ctx.DrawRectangle(vb, null, new Rect(new System.Windows.Point(), bounds.Size));
                    }
                    rtb.Render(dv);
                    PrintDialog dialog = new PrintDialog();
     
                    if (dialog.ShowDialog() == true)
                    {
                        dialog.PrintVisual(dv, "New Chart");
                    }
    je conserve ton code qui me sera très utile.
    Merci et bonne journée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. integrer un composant .net Charting en wpf
    Par sanaaafkir dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 14/03/2008, 11h39
  2. "Transformer" des controls windows.foms en controls WPF
    Par olsimare dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 06/03/2008, 19h21
  3. Microsoft Chart Control
    Par sunwind dans le forum IHM
    Réponses: 0
    Dernier message: 14/09/2007, 17h05
  4. [VB.Net] Imprimer un control
    Par DonF dans le forum Windows Forms
    Réponses: 4
    Dernier message: 05/01/2006, 17h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo