7
votes

Comment supprimez-vous l'espace pris par un paragraphe vide?

Comment se débarrasser de l'espace d'un paragraphe? J'ai essayé d'utiliser négatif marge / rembourrage mais il n'accepte pas les valeurs négatives pour ces propriétés. Toute idée?

Mon code est mentionné ci-dessous: xxx

et, les sorties pour le code ci-dessus sont données ci-dessous:

 Entrez la description de l'image ici

EDIT: Voici un exemple qui ferait un peu plus de sens (selon les commentaires ): xxx

ce qui rend exactement le même résultat.


4 commentaires

Y a-t-il une raison pour laquelle vous êtes codant dur 4 paragraphes lors de votre question, ils pourraient être blancs? Un utilisateur ne serait pas en mesure d'ajouter quoi que ce soit au paragraphe si elle a été écrasée de toute façon, si cela devrait même être là? Si les paragraphes affichent uniquement des informations de quelque part d'ailleurs, il est-il préférable d'ajouter les paragraphes au besoin?


En effet je pensais la même chose. Pourquoi ne pas filtrer les paragraphes vides au niveau du modèle?


Ma question est une version simplifiée de mon problème. Le paragraphe ne contient pas exactement rien, ils ont plusieurs conteneurs. Mais je peux gérer cette partie de la question, tout ce dont j'ai besoin, c'est savoir comment cacher complètement un paragraphe, car il n'a aucune propriété "visibilité".


Vous pouvez masquer le paragraphe en le supprimant de son parent. Cependant, vous pouvez toujours le garder en mémoire


4 Réponses :


4
votes

J'hésite à poster cela, car je suis sûr qu'il doit y avoir une meilleure façon, mais que personne d'autre n'a répondu ....

Document de flux section apparaît pour envelopper Paragraphes avec WhitSpace équivilent au paragraphe LigneHeight .

LineHeight ne peut pas être 0, mais cela peut être très petit. Réglage lineheight sur la section supprimera WhitSpace autour de tous les paragraphes. xxx

paramètre LineHeight Comme cela n'affectera généralement pas le texte à l'intérieur des paragraphes, car le code par défaut LinestackingStrategy utilise la hauteur de la police à la place. Notez comment le paragraphe vierge a toujours une hauteur.

Vous pouvez penser que régler LineHeight uniquement sur le paragraphe vide fonctionnerait, mais section honorera toujours le blancheur du paragraphe précédent. Puisque le paragraphe précédent a normalement LineHeight , vous obtenez toujours la marge.

Donc, afin de supprimer complètement votre paragraphe vierge, vous devez définir lineheight Sur le paragraphe vierge et précédent, et dites à votre paragraphe vierge d'utiliser le lineheight comme hauteur de bloc: xxx

J'ai essayé d'écrire un déclencheur qui le ferait automatiquement pour les paragraphes vides, mais malheureusement paragraphe. Inlines.Count n'est pas une dépendanceProperty et d'essayer de l'utiliser pour détecter les paragraphes vierges n'est pas fiable en fonction du moment où le paragraphe est renseigné.


6 commentaires

Je suivais cette stratégie exacte et rencontré des inlines.Count = 0 déclenchement de tous les paragraphes. +1 :)


On dirait un peu piraté mais ça marche bien! À propos du paragraphe.Inlines.Count, je n'ai pas besoin de faire cela parce que je sais déjà ce qui est dans mes paragraphes. La plupart du temps (dans mon cas), le paragraphe ne contient qu'un seul textblock et je sais quel est le texte, mais cacher le texte textuel laisse toujours un espace vide en raison du paragraphe. Ce qui explique pourquoi j'ai besoin de savoir comment se débarrasser de cet espace.


C'est bien piraqué, c'est pourquoi j'étais hésitant à poster. Heureux qu'il semble fonctionner au moins.


Je laisserai un peu de temps pour que les autres donnent une réponse et si personne n'a une bonne réponse, je vous donnerai la "réponse correcte" et la générosité. Merci pour votre contribution sur mon problème!


Aucun problème. Je suis intéressé à voir s'il y a une solution "appropriée".


Considérant que flowdocument n'est pas vraiment un composant de mise en page, je dirais que la seule solution "appropriée" éliminerait tout le paragraphe du document. Si ce n'est pas un choix, c'est une solution aussi bonne que possible.



2
votes

Si cela est réalisable dans votre scénario d'avoir des propriétés VM indiquant si les paragraphes sont vides, cela fonctionnerait: -

<FlowDocument>
  <FlowDocument.Resources>
    <Style TargetType="{x:Type Paragraph}">
      <Setter Property="Margin" Value="0,0,0,18"/>
      <Style.Triggers>
        <Trigger Property="Tag" Value="True">
           <Setter Property="Margin" Value="0"/>
           <Setter Property="LineHeight" Value="0.1"/>
           <Setter Property="LineStackingStrategy" Value="BlockLineHeight"/>
        </Trigger>
      </Style.Triggers>
    </Style>
  </FlowDocument.Resources>
  <Section>
     <Paragraph x:Name="p1" Tag="{Binding IsPara1Empty}">1</Paragraph>
     <Paragraph x:Name="p2" Tag="{Binding IsPara2Empty}">2</Paragraph>
     <Paragraph x:Name="p3" Tag="{Binding IsPara3Empty}"></Paragraph>
     <Paragraph x:Name="p4" Tag="{Binding IsPara4Empty}">4</Paragraph>
  </Section>
</FlowDocument>


2 commentaires

Qu'est-ce que vm dans "vm propriétés" signifie?


@ Maximetremblay-Savard - Modèle de vue (en supposant que vous utilisez mvvm)



1
votes

Essayez ceci xxx


1 commentaires

Cela fonctionne mais je voulais savoir s'il y avait un moyen plus simple que de supprimer complètement le bloc de son parent. Merci pour la réponse cependant!



1
votes

En HTML, la raison pour laquelle une balise de paragraphe, même lorsque vide, prend de l'espace est parce qu'il s'agit d'un élément de niveau de bloc, et donc il haslayout . Cela signifie qu'il a des propriétés telles que le rembourrage et la hauteur de ligne qui lui est attribuée par l'agent de rendu, ainsi que il provoquera une pause de ligne .

Pouvez-vous trouver un moyen de détecter si un paragraphe sera être vide et changer sa règle d'affichage? Visibilité ne supprime pas d'élément, ne le rend invisible que si la balise de paragraphe provoquera toujours la pause de la ligne Pesky. En fait, cette solution de hauteur de ligne postée plus tôt quitte toujours la pause de la ligne. ( Un article sur l'affichage VS Visibilité. )

La règle CSS Affichage: Aucun; peut être utilisé pour le supprimer du flux de page (voir le lien HasLayout ci-dessus). J'aime utiliser une classe CSS et appliquer cela par programme. Quelque chose comme ça fait généralement le truc: xxx

Vous pouvez également inclure la hauteur de ligne: 0; dans cette classe pour couvrir la suggestion précédente. < / p>


1 commentaires

Cela fait de bon sens, mais comment l'atteindra-t-on sur une application WPF?