2011-01-07 3 views
2

EDIT:Comment déterminer la largeur du contenu ou de la taille d'un conteneur au contenu

Ok, il est un peu résolu, mais il se sent sale:

foreach (ContainerVisual cv in SurfaceNYTR.Helpers.VFTreeHelper.FindVisualChildren<ContainerVisual>(flowDocReader)) 
{ 
    if (cv.Parent.DependencyObjectType.SystemType.FullName == "MS.Internal.PtsHost.PageVisual") 
    { 
     flowDocReader.Width = cv.DescendantBounds.Width; 
    } 
} 

J'ai regardé dans Snoop , et il semble que l'un des objets ContainerVisual stocke la largeur correcte dans sa propriété DescendantBounds. Sa mère est PageVisual (cette classe est interne, cependant, de sorte que la comparaison de chaînes avec SystemType.FullName ou GetType() ToString() a été utilisé qui aspire sans doute.)

Note: FindVisualChildren finds all children by type, source for it can be found here


Mon objectif est d'afficher tout le contenu d'un FlowDocument (c'est-à-dire, sans pagination) dans une disposition de colonnes. Il aurait une hauteur fixe, mais la largeur dépendrait du contenu du FlowDocument.

Mon problème est le suivant: FlowDocumentReader ne redimensionne pas automatiquement le contenu de FlowDocument. Comme vous voyez dans mon XAML ci-dessous, FlowDocumentReader.Width est de 5000 unités (juste un grand nombre qui peut accueillir la plupart des documents) - quand je le fais Auto, il se clipse juste à la largeur du ScrollViewer et pagine mes affaires!

Y a-t-il une bonne façon de résoudre ce problème?

J'ai aussi fait une capture d'écran de ce que cela ressemble maintenant, mais les rouleaux de ScrollViewer passé la fin du document dans la plupart des cas: http://i.stack.imgur.com/3FSRl.png

<ScrollViewer x:Name="scrollViewer" 
       HorizontalScrollBarVisibility="Visible" 
       VerticalScrollBarVisibility="Disabled" 
       > 
     <FlowDocumentReader x:Name="flowDocReader" 
          ClipToBounds="False" 
          Width="5000" 
          > 
      <FlowDocument x:Name="flowDoc" 
          Foreground="#FF404040" 
          ColumnRuleWidth="2" 
          ColumnGap="40" 
          ColumnRuleBrush="#FF404040" 
          IsHyphenationEnabled="True" 
          IsOptimalParagraphEnabled="True" 
          ColumnWidth="150"> 

       <Paragraph> 
        Lorem ipsum dolor sit amet, ...etc... 
       </Paragraph> 
       <Paragraph> 
        Lorem ipsum dolor sit amet, ...etc... 
       </Paragraph> 
       <Paragraph> 
        Lorem ipsum dolor sit amet, ...etc... 
       </Paragraph> 
      </FlowDocument> 
     </FlowDocumentReader> 
</ScrollViewer> 

Répondre

2

Pourriez-vous appeler juste Measure() sur le FlowDocumentReader, en lui passant une infinie Size, puis vérifiez la propriété FlowDocumentReader.DesiredSize?

flowDocumentReader.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); 
var desiredSize = flowDocumentReader.DesiredSize; 
+0

Merci beaucoup! J'ai essayé d'utiliser Measure, en suivant vos conseils, mais il ne signale pas la taille correcte. Après avoir creusé à travers l'arbre visuel, j'ai trouvé que l'un des éléments de ContainerVisual avait les bonnes limites (celui dont le parent est un MS.Internal.PtsHost.PageVisual.) La propriété DescendantBounds.Width est la bonne largeur de FlowDocument. se sentir un peu sale en l'utilisant - édité le message original avec l'extrait de code si vous voulez voir – ISVK

1

Je ne comprends pas ce que vous entendez par « dans une mise en page de colonne ». Voulez-vous dire plusieurs colonnes, et une barre de défilement horizontale? Ou voulez-vous dire une seule colonne, et une barre de défilement verticale?

Si vous souhaitez une seule colonne et une barre de défilement verticale, vous pouvez rechercher FlowDocumentScrollViewer à la place. Je l'ai trouvé beaucoup plus facile à utiliser que FlowDocumentReader.

+0

Ah, merci - oui, je veux dire plusieurs colonnes avec une barre de défilement horizontale (comme le montre la capture d'écran). un moyen d'obtenir la largeur FlowDocument, et édité le message original Merci! – ISVK

Questions connexes