2013-07-06 1 views
3

Je voudrais imprimer le contenu visuel d'un contrôle WPF (un MapControl) que j'ai ajouté à mon application Winform.Accéder à PrintPageEventArgs.PageVisual dans Winform ou son équivalent

(En gros, compilez un contrôle utilisateur WPF avec ce contrôle, puis ajouter le contrôle qui en résulte comme tout autre contrôle à votre projet Winform.)

Un autre utilisateur a essentiellement un code pour accomplir la partie d'impression. Voir: http://www.devexpress.com/Support/Center/Question/Details/Q386207

Le code que je pouvais rassembler dans le côté Winform devrait être:

private PrintDocument m_oPrintDoc; 
public frmWhatever() 
    : base() 
{ 
    // This call is required by the Windows Form Designer. 
    InitializeComponent(); 

    // Set up the printing 
    m_oPrintDoc = new PrintDocument(); 
    m_oPrintDoc.PrintPage += PrintDoc_PrintPage; 
} 

void PrintDoc_PrintPage(object sender, PrintPageEventArgs e) 
{ 
    e.PageVisual = MapContainer; 
} 

Le problème est que PageVisual n'existe pas sur le côté Winform. C'est évidemment le cas dans WPF.

Quel serait le code équivalent? Je n'ai aucun problème avec la partie "MapContainer". Le seul ingrédient manquant est la méthode "e.what"?

Est-il possible que PageVisual existe si j'ajoute une paire de référence/en utilisant? Avant que quelqu'un ne me demande de contacter DevExpress, j'ai déjà essayé. Leur réponse a été que la question n'a rien à voir avec eux et est une pure question Microsoft.Net, d'où la question ici.

Oh oui, j'utilise Visual Studio 2012 avec .Net 4.5.

Répondre

1

Voici le code. La première fonction a été placée dans le contrôle WPF. Je devais construire une fois. J'ai ensuite obtenu l'image dans le rappel d'impression, que j'ai utilisé pour définir l'image.

public System.Drawing.Image GetMapImage() 
{ 
    RenderTargetBitmap rtb = new RenderTargetBitmap((int)this.mapControl1.ActualWidth, (int)this.mapControl1.ActualHeight, 96, 96, PixelFormats.Pbgra32); 
    rtb.Render(this.mapControl1); 
    PngBitmapEncoder png = new PngBitmapEncoder(); 
    png.Frames.Add(BitmapFrame.Create(rtb)); 
    MemoryStream stream = new System.IO.MemoryStream(); 
    png.Save(stream); 
    System.Drawing.Image image = System.Drawing.Image.FromStream(stream); 

    return image; 
} 

void PrintDoc_PrintPage(object sender, PrintPageEventArgs e) 
{ 
    // Get the current map image. do not continue, if no image. 
    Image oMapResized = ((bvMaps.MapDevex)this.mapMain.Child).GetMapImage(); 
    if (null == oMapResized) 
     return; 

    // Draw the image on the paper starting at the upper left corner. 
    e.Graphics.DrawImage((Image)oMapResized, new Point(0, 0)); 
} 

J'ai trouvé un autre article ici sur StackOverflow, ce qui m'a amené à la réponse. Le code fonctionne pour tout contrôle WPF.

Get a bitmap image from a Control view

Je ne dois ajouter quelques références sur les deux côtés (Winforms et WPF), mais à la fin de la journée, le succès!

1

Vous imprimez dans WinForms en utilisant GDI.

Votre code devrait ressembler (non testé):

void PrintDoc_PrintPage(object sender, PrintPageEventArgs e) 
{ 
    var bmp = new Bitmap(e.MarginBounds); 
    MapContainer.DrawToBitmap(bmp, e.MarginBounds); 
    e.Graphics.DrawImage(bmp, new Point(0, 0)); 
} 

Lorsque cela montre quelque chose que vous devrez régler la mise à l'échelle. Peut être très amusant (pas), utilisez PrintPreviewDialog pour économiser du papier.

+0

La réponse ci-dessus n'a pas fonctionné. Il n'y a pas de DrawToBitmap(). J'ai réussi à mettre en œuvre une sorte de solution de contournement pour obtenir le code ci-dessus, mais cela a juste donné la corbeille en tant que sortie. La réponse m'a cependant mis sur la bonne voie. Je vais créer une autre réponse avec le code réel qui résout le problème et publier sur DevExpress. –

+0

DrawBitmap est une fonction GDI, l'ElementHost devrait l'avoir. Mais votre propre réponse donne probablement un meilleur bitmap. –

Questions connexes