2010-10-03 6 views
1

J'ai le même problème que la question posée dans "Printing in Silverlight 4 ».
Pour contourner le problème, j'ai essayé à l'échelle de transformer la racine de mon arbre visuel avant l'impression.Comment cloner structure arborescente visuel Silverlight

void document_PrintPage(object sender, PrintPageEventArgs e) 
    { 
     var renderScale = 1.0D; 
     if (LayoutRoot.ActualWidth > e.PrintableArea.Width) 
      renderScale = e.PrintableArea.Width/LayoutRoot.ActualWidth; 

     var scaleTransform = new ScaleTransform(); 
     scaleTransform.ScaleX *= renderScale; 
     scaleTransform.ScaleY *= renderScale; 

     e.PageVisual = LayoutRoot; 
     e.PageVisual.RenderTransform = scaleTransform; 
    } 

maintenant au-dessus du code imprime correctement avec des visuels silverlight tenir sur un morceau de papier.

le problème est maintenant que LayoutRoot lui-même est maintenant mis à l'échelle vers le bas sur l'écran.
La question est, est-il un moyen pour moi de créer un clone de LayoutRoot avant d'appliquer la transformation d'échelle?

Mon rendez-vous autour est d'appliquer à nouveau la tranformation à grande échelle après l'impression, mais je voudrais savoir s'il y a un moyen de cloner l'arbre visuel

Répondre

1

Mon Dieu, merci pour la question. J'ai eu le même problème mais j'ai essayé de jouer avec les dimensions d'un conteneur (qui est déjà dans l'arbre visuel) à la zone imprimable, ce qui ne fonctionne pas, car une autre passe de mise en page semble être nécessaire. ScaleTransformest-ce que fonctionne ici cependant instantanément.

Je suis bien avec le "contourner" en faisant simplement un myContainer.ClearValue(FrameworkElement.RenderTransformProperty) dans l'événement EndPrint. Essayer de cloner l'arbre visuel donnera une pléthore d'autres problèmes (j'ai du contenu de chargement paresseux, etc.).

+0

Merci, herzmeister. Je n'ai pas pensé à "effacer" la valeur du conteneur. Cela semble être une meilleure approche que de sauver ma vieille valeur d'échelle de rendu et de la re-transformer. – Sung

0

Vérifiez cette link pour plus de détails sur le clone de l'objet silverlight.

également une autre idée utiliserait xamlreader/writer pour lire la chaîne xaml et créer une copie en mémoire du travail d'arborescence visuelle.

pour l'ex

Si votre XAML a appelé bouton originalbutton, en utilisant le code ci-dessous, vous aurez une copie du bouton dans readerLoadButton

// Save the Button to a string. 
string savedButton = XamlWriter.Save(originalButton); 

// Load the button 
StringReader stringReader = new StringReader(savedButton); 
XmlReader xmlReader = XmlReader.Create(stringReader); 
Button readerLoadButton = (Button)XamlReader.Load(xmlReader); 
+2

XamlWriter/Reader sont disponibles uniquement dans WPF. – Sung

Questions connexes