2010-03-12 3 views
1

J'ai cherché à travers de nombreuses fois, mais je n'ai pas vu cela avant. Question probablement très simple, mais je ne peux pas m'en passer la tête.XAML obtenir nouvelle largeur et hauteur pour la toile

A écrit un complément VSTO pour Excel qui dessine une grille dynamiquement. Puis lance une nouvelle fenêtre et remplace le contenu du canevas par la grille générée. Le problème est avec l'impression. Lorsque j'appelle la procédure d'impression, canvas.height et canvas.width retournent l'ancienne valeur avant de la remplacer par la grille.

Exemple:

string="<Grid Name=\"CanvasGrid\" xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\">..Lots of stuff..</Grid>"; 

// Launch new window and replace the Canvas element 

WpfUserControl newWindow = new WpfUserControl();        
newWindow.Show(); 


//To test 
MessageBox.Show(myCanvas.ActualWidth.ToString()); 
//return 894 
Grid testGrid = myCanvas.FindName("CanvasGrid") as Grid; 
MessageBox.Show("Grid " + testGrid.ActualWidth.ToString()); 
//return 234 


StringReader stringReader = new StringReader(LssAllcChrt); 
XmlReader xmlReader = XmlReader.Create(stringReader); 

Canvas myCanvas = newWindow.FindName("GrphCnvs") as Canvas; 
myCanvas.Children.Clear(); 
myCanvas.Children.Add((UIElement)XamlReader.Load(xmlReader)); 

//To test 
MessageBox.Show(myCanvas.ActualWidth.ToString()); 
//return 894 but should be much larger the Grid spans all three of my screens 
Grid testGrid = myCanvas.FindName("CanvasGrid") as Grid; 
MessageBox.Show("Grid " + testGrid.ActualWidth.ToString()); 
//return 234 but should be much larger the Grid spans all three of my screens 

//Run code from WpfUserControl.cs after it loads from button click 
Grid testGrid = canvas.FindName("CanvasGrid") as Grid; 
MessageBox.Show("Grid " + testGrid.ActualWidth.ToString()); 
//return 234 but should be much larger the Grid spans all three of my screens 

Donc, fondamentalement, je n'ai aucun moyen de dire ce que ma nouvelle largeur et la hauteur sont.

+0

En tant que conseil, vous pouvez formater un bloc code à l'aide du bouton 101010 dans l'éditeur. – itowlson

+0

Est-ce que 'Grid' occupe tout le' Canvas'? Pouvez-vous obtenir une taille fiable de la «grille»? – Jay

+0

La Grille initiale n'occupe pas la totalité du Canevas, mais la Grille générée peut ne pas occuper tout le Canevas. Intéressant comment lierais-je le Canvas à la dimension Grid? Actuellement, le Canvas se développe et se contracte avec la fenêtre. –

Répondre

0

Ok, voici ce que j'ai fait pour résoudre le problème. Fondamentalement, je cherchais à imprimer la grille que j'ai créée si elle sortait des liaisons visuelles. J'ai changé la nouvelle fenêtre en TabControl et TabItems parce que c'était une nouvelle exigence (Yeah me (sarcasme)). Donc, ce que je faisais était de faire référence à la TabItem sélectionnée, référence ScrollViewer comme le seul contenu dans le TabItem et la référence de la grille comme FrameworkElement:

TabItem ti = GBtabControl.SelectedItem as TabItem; 
ScrollViewer sc = ti.Content as ScrollViewer; 
FrameworkElement element = sc.Content as FrameworkElement; 

L'élément donne la largeur et de hauteur et je peux maintenant imprimer et exporter le graphique en tant que fichier png.

Merci pour le soutien

Questions connexes