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 :

Impression de canvas


Sujet :

Windows Presentation Foundation

  1. #1
    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 Impression de canvas
    Bonjour à tous,

    Je rencontre quelques soucis en voulant imprimer un objet visuel de ma fenêtre.

    Ma fenêtre contient un objet "schemaPage" qui est un contrôle utilisateur qui s'affiche très bien dans mon application. Il contient des zones de tracé qui sont des "Canvas".

    Si j'imprime juste ce composant seul, sur un page, cela fonctionne :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    PrintDialog printDlg = new PrintDialog();
    PrintTicket printTicket = printDlg.PrintTicket;
    printTicket.PageOrientation = PageOrientation.Landscape;
    if (printDlg.ShowDialog() == true){
           printDlg.PrintVisual(schemaPage, "Schéma itinéraire");
    }

    Mais je voudrais maintenant en mettre plusieurs à la suite et les imprimer tous d'un coup. J'essaye donc de mettre mon objet "schemaPage" dans un "FixedDocument", dans un "FlowDocument"... rien n'y fait...
    Dans les deux cas, l'ensemble des contrôles de mon objet se dessinent... sauf mes Canvas !! Pour le FlowDocument, je n'arrive même pas à le mettre en paysage...

    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
    //  ****************    Flow document      ****************
                FlowDocument flowDoc = new FlowDocument();
                double pageWidth = flowDoc.PageWidth;
                flowDoc.PageWidth = flowDoc.PageHeight;
                flowDoc.PageHeight = pageWidth;
                //   pageScrollViewer est l'élément graphique qui contient l'objet "schemaPage"
                pageScrollViewer.Content = null;
                BlockUIContainer UIcontainer = new BlockUIContainer(schemaPage);
                flowDoc.Blocks.Add(UIcontainer);
                IDocumentPaginatorSource dps = flowDoc;
     
                if (printDlg.ShowDialog() == true){
                    printDlg.PrintDocument(dps.DocumentPaginator, "Schéma à imprimer flowDoc");
                }

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //  ****************    Fixed document      ****************
                FixedDocument fixedDoc = new FixedDocument();
                FixedPage page1 = new FixedPage();
                //   pageScrollViewer est l'élément graphique qui contient l'objet "schemaPage"
                pageScrollViewer.Content = null;
                page1.Children.Add(schemaPage);
                PageContent pageContent1 = new PageContent();
                pageContent1.Child = page1;
                fixedDoc.Pages.Add(pageContent1);
     
                if (printDlg.ShowDialog() == true){
                    printDlg.PrintDocument(fixedDoc.DocumentPaginator, "Schéma à imprimer fixedDoc");
                }

  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 versatile controle canvas
    bonjour
    le controle canvas est versatile ,en fait il s'imprime mais on ne le voit pas car il a apparement une taille nulle .
    L'astuce dans mon cas ou j'imprime directement un controle canvas personnallise c'etait imposer les dimensions de page dans fixedDocument.DocumentPaginator.PageSize et surtout fixer largeur , hauteur de mon canvas pour pouvoir le voir(teste le en supprimant les dimensions du canvas)
    De plus au niveau de la forme il y a declararation d'un DocumentViewer pour avoir un apercu et imprimer a partir du bouton incorpore.
    Bref voici un exemple de fenetre Window avec DocumentViewer qui imprime un controle Canvas pour lequel j'ajuste largeur et hauteur.
    (dans ton cas il faut acceder à canvas à partir de l'objet schemaPage pour ajuster ta dimension souhaite).
    Etant donne que tu as l'apercu tu peux trouver la taille convenable des canvas.
    code behind Window1 en vb.net(facile à retranscrire)
    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
     
    Imports System
    Imports System.Printing
    Imports System.Windows
    Imports System.Windows.Controls
    Imports System.Windows.Documents
    Imports System.Windows.Documents.Serialization
    Imports System.Windows.Markup
    Imports System.Windows.Media
    Imports System.Windows.Shapes
    Imports System.Windows.Xps
    Namespace PrintCanvasFixedDoc
     
        Partial Public Class Window1
            Private m_printQueue As PrintQueue
            Private m_printTicket As PrintTicket
            'garder une reference à XPS document en cours.
            Private m_xpsDocumentWriter As XpsDocumentWriter
            Public Sub New()
     
                ' Cet appel est requis par le Concepteur Windows Form.
                InitializeComponent()
     
                ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
                Me.dvDocumentViewer.Document = CreateMultiPageFixedDocument()
            End Sub
            'Cree un FixedDocument avec nombreuse pages.
            Public Function CreateMultiPageFixedDocument() As FixedDocument
     
                Dim m_fixedDocument As FixedDocument = New FixedDocument()
                m_fixedDocument.DocumentPaginator.PageSize = New Size(96 * 8.5, 96 * 11)
                'cree 10 pages
                For i As Integer = 0 To 10
                    Dim m_pageContent As PageContent = New PageContent()
                    m_fixedDocument.Pages.Add(m_pageContent)
                    Dim m_fixedPage As FixedPage = New FixedPage()
     
                    'Ajoute le canvas personnalise CanvasSrollableZoom avec un  
                    'TextBlock et un  Rectangle comme enfants.
                    Dim m_canvas As CanvasSrollableZoom = New CanvasSrollableZoom
                    m_canvas.Background = Brushes.Crimson
                    m_canvas.Visibility = Windows.Visibility.Visible
                    m_canvas.VerticalAlignment = Windows.VerticalAlignment.Stretch
                    m_canvas.HorizontalAlignment = Windows.VerticalAlignment.Stretch
                    m_canvas.Width = 96 * 8.0
                    m_canvas.Height = 96 * 10
                    m_fixedPage.Children.Add(m_canvas)
                    Dim m_textBlock As TextBlock = New TextBlock()
                    m_textBlock.Text = String.Format("Page {0} / {1}\n\nThis Is Page {0}.", i + 1, 1000)
                    m_textBlock.FontSize = 24
                    m_canvas.Children.Add(m_textBlock)
                    Dim m_rect As Rectangle = New Rectangle()
                    m_rect.Width = 200
                    m_rect.Height = 200
                    m_rect.Fill = New SolidColorBrush(Color.FromArgb(200, 20, 50, 200))
                    m_canvas.Children.Add(m_rect)
                    CType(m_pageContent, IAddChild).AddChild(m_fixedPage)
                Next
                Return m_fixedDocument
     
            End Function
            'Presente à l'Utilisateur un  PrintDialog pour obtenir une reference 
            'à PrintQueue.
            Public Function GetPrintQueue() As PrintQueue
                Dim m_printDialog As PrintDialog = New PrintDialog()
                If (m_printDialog.ShowDialog.HasValue And m_printDialog.ShowDialog.Value) Then
                    Return m_printDialog.PrintQueue
                End If
                Return Nothing
            End Function
     
     
            Private Sub DocumentViewer_PrintDocument(ByVal sender As System.Object, ByVal e As System.Windows.Input.ExecutedRoutedEventArgs)
                m_printQueue = GetPrintQueue()
                m_xpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(m_printQueue)
                m_xpsDocumentWriter.Write(CreateMultiPageFixedDocument(), m_printTicket)
                MessageBox.Show("impression Document terminee...", "CanvasScrollable", MessageBoxButton.OK, _
                MessageBoxImage.Information)
                Me.Show()
            End Sub
        End Class
     
    End Namespace
    code xaml window1:
    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
     
    <Window x:Class="PrintCanvasFixedDoc.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mm="clr-namespace:PrintCanvasFixedDoc"
        Title="Window1" Height="300" Width="300">
        <Grid>
            <DocumentViewer x:Name="dvDocumentViewer">
                <DocumentViewer.CommandBindings>
                    <CommandBinding
                        Command="ApplicationCommands.Print"
                        Executed="DocumentViewer_PrintDocument" />
                </DocumentViewer.CommandBindings>
            </DocumentViewer>
              <!--visibilite à collapse du grid-->
            <Grid
                x:Name="spProgressMask"
                Background="#66000000"
                Visibility="Collapsed">
                <StackPanel
                    VerticalAlignment="Center"
                    HorizontalAlignment="Center">
                    <TextBlock Text="Impression document..." />
     
                </StackPanel>
            </Grid>
        </Grid>
    </Window>
    code behind canvas perso scrollable
    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
     
    Imports System
    Imports System.Windows
    Imports System.Windows.Controls
    Namespace PrintCanvasFixedDoc
        Public Class CanvasSrollableZoom
            Inherits Canvas
     
     
            Shared Sub New()
                'This OverrideMetadata call tells the system that this element wants to provide a style that is different than its base class.
                'This style is defined in Themes\Generic.xaml
                DefaultStyleKeyProperty.OverrideMetadata(GetType(CanvasSrollableZoom), New FrameworkPropertyMetadata(GetType(CanvasSrollableZoom)))
            End Sub
            'rajout overrides  MeasureOverride
            Protected Overrides Function MeasureOverride(ByVal constraint As System.Windows.Size) As System.Windows.Size
                'Return MyBase.MeasureOverride(constraint)
                Dim bottomMost As Double = 0.0
                Dim rightMost As Double = 0.0
     
                'Boucle sur tous les elements enfanst et 
                'recherche plus grande valeur de  Top and Left parmi eux.   
                For Each obj As Object In Me.Children
                    Dim x_child As FrameworkElement = TryCast(obj, FrameworkElement)
                    If (x_child IsNot Nothing) Then
                        x_child.Measure(constraint)
                        bottomMost = Math.Max( _
                        bottomMost, GetTop(x_child) + x_child.DesiredSize.Height)
                        rightMost = Math.Max( _
                        rightMost, GetLeft(x_child) + x_child.DesiredSize.Width)
                    End If
                Next
                If (Double.IsNaN(bottomMost) Or Double.IsInfinity(bottomMost)) Then
                    bottomMost = 0.0
                End If
                If (Double.IsNaN(rightMost) Or Double.IsInfinity(rightMost)) Then
                    rightMost = 0.0
                End If
                'Renvoi nouvelle taille
                Return New Size(rightMost, bottomMost)
     
            End Function
     
        End Class
    End Namespace
    NB: le code est le meme pour un flowdocument.
    bon code......................

Discussions similaires

  1. [Lazarus] Impression directe sur le canvas
    Par jpp dans le forum Lazarus
    Réponses: 4
    Dernier message: 08/10/2013, 14h37
  2. Canvas et impression
    Par laurent1133 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 21/01/2012, 12h13
  3. impression d'un canvas
    Par Leena666 dans le forum Flex
    Réponses: 0
    Dernier message: 22/12/2008, 11h48
  4. Impression de plusieurs éléments d'un Canvas
    Par PhilTheGap dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 06/05/2008, 13h10
  5. Impression du Canvas d'une Form
    Par blondelle dans le forum C++Builder
    Réponses: 7
    Dernier message: 20/01/2008, 20h24

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