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 :

[WPF]Aperçu avant impression


Sujet :

Windows Presentation Foundation

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 205
    Points : 66
    Points
    66
    Par défaut [WPF]Aperçu avant impression
    Bonjour,

    Je souhaiterai imprimer le contenu d'un canvas, et question de convivialité je souhaiterai utiliser un objet tel que PrintPreview utilisé en WinForms. Néanmoins, le problème est que l'objet a indiqué en paramètre doit être de type PrintDocument, un canvas est un type Visual, donc soit je peux convertir un Visual en PrintDocument soit il existe une méthode plus directe. Pour le moment je n'ai que ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                PrintDialog dialog = new PrintDialog( );
     
                if ( dialog.ShowDialog( ) == true )
                {
                    dialog.PrintVisual( drawingArea, "drawing Area" );
                }
    Mais là, je n'ai aucun aperçu...

  2. #2
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 442
    Points
    4 442
    Par défaut apercu avant impression wpf
    bonjour,
    Il n'existe pas en wpf un controle ou une fonction apercu avant iimpression,helas.il n'existe que le printdialog boite qui affiche les printers et le bouton imprimer.
    L'apercu existe pour les flowdocuments et les xpsdocuments.
    bon code....

  3. #3
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Points : 8 538
    Points
    8 538
    Par défaut
    Il est dit ici qu'il faut appeler soit même les méthodes Measure et Arrange:
    http://www.switchonthecode.com/tutor...rinting-in-wpf

  4. #4
    Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 205
    Points : 66
    Points
    66
    Par défaut
    Ah tu fais bien de parler du FlowDocument, déjà c'est quoi la différence entre un Flow et un Fixedocument? J'ai vu que l'on pouvait personnaliser son document dans un FixedDocument, mais l'exemple ne marchait pas...

    Je voudrai avoir un document de tel manière que:
    - Un TextBlock pour afficher le titre,
    - Un Canvas, qui sera l'élément visual, l'image principal
    - Puis un paragraph pour ajouter un peu de baratin

    Pourriez-vous me rediriger vers un exemple qui peut faire ça?

  5. #5
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 442
    Points
    4 442
    Par défaut apercu avant impression en wpf
    bonjour,
    voici un detour pour imprimer un apercu ,un peu long,pour pallier à printpreview qui utilise un FixedDocument.
    FixedDocument=utilise la classe "viewer" en xaml et un xpsdocument est un document à la norme xps(comme dans word lorsque tu fais saveas :file.xps).

    -une forme,un bouton Imprime et un bouton apercuImpression,toujours la gestion des unites (dpi wpf /inch->mm,margins et autres englisheries...)
    voici le code
    1/xaml de la fenetre avec un canvas
    Code xml : 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
    38
     
    <Window  x:Class="Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfAppPrintDoc"
    Title="Imprime avec Apercu Document Canvas" Height="575" Width="720">
        <Grid Name="monGrid">
            <Grid.RowDefinitions>
                <RowDefinition Height="498.433*" />
                <RowDefinition Height="48.567*" />
            </Grid.RowDefinitions>
     
            <Canvas   x:Name="monCanvas" Background="WhiteSmoke">
                <Ellipse
                    Fill="Blue"
                    Height="286.724"
                    Width="261.719"
                    HorizontalAlignment="Center"
                    VerticalAlignment="Center" Canvas.Left="38.341" Canvas.Top="13.336" />
                <Rectangle
                    Fill="Yellow"
                    Height="171.701"
                    Width="205.041"
                    HorizontalAlignment="Center"
                    VerticalAlignment="Center" Canvas.Left="393.412" Canvas.Top="128.359" />
                <TextBlock
                    FontSize="24"
                    Foreground="White"
                    Text="Visual à Imprimer"
                    HorizontalAlignment="Center"
                    VerticalAlignment="Center" Height="28.339" Canvas.Left="95.019" Canvas.Top="128.359" Width="166.7" />
            </Canvas>
            <Button Click="btnImprimeCanvas_Click" Content="Print Visual..." VerticalContentAlignment="Center" Width="128" HorizontalAlignment="Left" Grid.Row="1" Margin="0,22,0,0" />
     
            <Button Click="btnApercuCanvas" Content="printPreview Visual...." Margin="146,24,0,0" Grid.Row="1" HorizontalAlignment="Left" Width="115.719"></Button>
     
        </Grid>
    </Window>

    2/code behind .vb(peut etre retranscris facilement en c#
    Code vb.net : 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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
    'A l'affichage de PrintDialog faire:
    '-Preferences ->selectionner un format de page->ok
    '-Appliquer
    '-Annuler
    Imports System.Windows.Markup
    Public Class Window1
        ' cree un "fixed" document
        Dim monDocument As FixedDocument
        ' cree une imprimante 
        Dim pd As PrintDialog
        Private Sub btnImprimeCanvas_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
            'Selectionne une imprimante et definit mise en page
            pd = New PrintDialog()
            If (pd.ShowDialog Is Nothing) Then
                Return
            End If
            ' Cree un document
            monDocument = New FixedDocument()
            monDocument.DocumentPaginator.PageSize = New Size(pd.PrintableAreaWidth, pd.PrintableAreaHeight)
            '1/ cree une page
            Dim page1 As FixedPage = New FixedPage()
            page1.Width = monDocument.DocumentPaginator.PageSize.Width
            page1.Height = monDocument.DocumentPaginator.PageSize.Height
            '2/ recupere le controle canvas
            Dim objCanvas As Canvas = Me.monCanvas
            '3/ necessaire supprimer canvas du grid pour l'ajouter à page1
            Me.monGrid.Children.Remove(objCanvas)
            objCanvas.Margin = New Thickness(96) ' 1 inch de marge
            '4/ ajoute canvas à page1
            page1.Children.Add(objCanvas)
            '5/ ajoute  page1 au document
            Dim page1Content As PageContent = New PageContent
            Dim Ipage1Content As IAddChild = CType(page1Content, IAddChild)
            Ipage1Content.AddChild(page1)
            monDocument.Pages.Add(page1Content)
            'REPETER LES ETAPES 1-5 POUR SECONDE PAGE
            'imprime le doc
            pd.PrintDocument(monDocument.DocumentPaginator, "My first document")
        End Sub
     
        Private Sub btnApercuCanvas(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
            'Selectionne une imprimante et definit mise en page
            pd = New PrintDialog()
            If (pd.ShowDialog Is Nothing) Then
                Return
            End If
            ' Cree un document
            monDocument = New FixedDocument()
            monDocument.DocumentPaginator.PageSize = New Size(pd.PrintableAreaWidth, pd.PrintableAreaHeight)
            '1/ cree une page
            Dim page1 As FixedPage = New FixedPage()
            page1.Width = monDocument.DocumentPaginator.PageSize.Width
            page1.Height = monDocument.DocumentPaginator.PageSize.Height
            Dim numPage As Integer = PageRangeSelection.UserPages
            'largeur & hauteur de Page Selectionnes 
            'conversion en millimetres (1 Inch=25.4 mm)
            'unites par defaut WPF exprimees = 96 dot/Inch 
            'unites en mm :u(mm)=u(wpf)*25.4/96
            Dim largPageSel As Double = pd.PrintableAreaWidth * 25.4 / 96
            Dim hautPageSel As Double = pd.PrintableAreaHeight * 25.4 / 96
            '2/ recupere le controle canvas 
            Dim objCanvas As Canvas = Me.monCanvas
            '3/memorise ses dimensions
            Dim ll As Double = objCanvas.ActualWidth
            Dim hh As Double = objCanvas.ActualHeight
            '4/ necessite de supprimer canvas du grid si on veut l'ajouter à page1
            Me.monGrid.Children.Remove(objCanvas)
            objCanvas.Margin = New Thickness(96) ' 1 inch de marge
            '5/ ajoute canvas à page1
            page1.Children.Add(objCanvas)
            '5-bis/ ajoute un titre 
            Dim monText As TextBox = New TextBox
            monText.Text = "mon canvas" & numPage.ToString & vbCrLf
            monText.Text = monText.Text & "Dimensions :" & largPageSel.ToString & "X" & hautPageSel.ToString
            monText.Background = Brushes.Goldenrod
            monText.FontSize = 16
            '5-tris/ ajoute TextBox à page1
            page1.Children.Add(monText)
            '6/ ajoute  page1 au document en utilisant Interface IAddChild
            Dim page1Content As PageContent = New PageContent
            Dim Ipage1Content As IAddChild = CType(page1Content, IAddChild)
            Ipage1Content.AddChild(page1)
            monDocument.Pages.Add(page1Content)
            'Cree une fenetre Apercu et y envoie le document 
            Dim winPreview As Window = New Window
            winPreview.Title = "Apercu avant Impression par Mabrouki"
            winPreview.Content = monDocument
            winPreview.ShowDialog()
            'supprime le controle de la page(pour restauration dans grid)
            page1Content.Child.Children.Clear()
            'restaure le controle canvas avec dimensions initiales dans window
            objCanvas.Width = ll
            objCanvas.Height = hh
            objCanvas.HorizontalAlignment = Windows.HorizontalAlignment.Center
            objCanvas.VerticalAlignment = Windows.VerticalAlignment.Center
            Me.monGrid.Children.Add(objCanvas)
        End Sub
    End Class
    En attendant la sortie de la classe printpreview....
    BON CODE

  6. #6
    Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 205
    Points : 66
    Points
    66
    Par défaut
    Merci pour ta réponse, mais je préfère utiliser un composant que Microsoft a déjà mis en place, mon problème, enfin de compte, n'est qu'un problème de mise en page. Je me suis aperçu que le code dont il est question dans mon post plus haut est correct, c'est un bug de VS 2010 de dire que c'est faux (ils sont tjs en train de travailler dessus...). Donc j'ai écrit ça:
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    <Grid>
            <DocumentViewer>
     
                <DocumentViewer.Document>
                    <FixedDocument>
                        <PageContent>
                            <FixedPage >
                                <TextBlock Text="Test" HorizontalAlignment="Center"/>
                            </FixedPage>
                        </PageContent>
                    </FixedDocument>
                </DocumentViewer.Document>
            </DocumentViewer>
    </Grid>

    Mais le texte "Test" n'est pas centré, mais est complètement en haut à gauche de la feuille...

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 69
    Points : 73
    Points
    73
    Par défaut
    Citation Envoyé par Babas007 Voir le message
    Mais le texte "Test" n'est pas centré, mais est complètement en haut à gauche de la feuille...
    Surement parce que tes composants parents s'ajuste au contenu et qu'ils ne prennent pas toute la page...

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

Discussions similaires

  1. Concepteur RAVE sous DELPHI 7 : aperçu avant impression
    Par tarbala dans le forum Composants VCL
    Réponses: 4
    Dernier message: 01/06/2020, 00h37
  2. Aperçu avant impression d'un TRichEdit
    Par PoOky dans le forum Composants VCL
    Réponses: 2
    Dernier message: 31/01/2016, 23h19
  3. [WPF - C#]Aperçu avant Impression et Impression du contenu d'un composant
    Par Nanos dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 19/02/2010, 16h17
  4. Aperçu avant impression
    Par Zebulon777 dans le forum Access
    Réponses: 18
    Dernier message: 15/09/2005, 10h46
  5. [Débutante] Aperçu avant impression d'un composant
    Par gwendo dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 09/07/2004, 09h52

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