2015-06-16 13 views
7

Wie Raum von einem Absatz loswerden? Ich habe versucht, negative margin/padding zu verwenden, aber es akzeptiert keine negativen Werte für diese Eigenschaften. Irgendeine Idee?Wie entfernen Sie den Leerraum eines leeren Absatzes?

Mein Code unten erwähnt wird:

enter image description here

EDIT:

<FlowDocument> 
    <Section> 
     <Paragraph>1</Paragraph> 
     <Paragraph>2</Paragraph> 
     <Paragraph></Paragraph> 
     <Paragraph>4</Paragraph> 
    </Section> 
</FlowDocument> 

Und Ausgänge für den obigen Code ist unten angegeben Hier ist ein Beispiel, das ein bisschen mehr Sinn machen würde, (gemäß den Kommentaren):

<FlowDocument> 
    <Section> 
     <Paragraph> 
      <TextBlock Text="1" Visibility="Visible"/> 
     </Paragraph> 
     <Paragraph> 
      <TextBlock Text="2" Visibility="Visible"/> 
     </Paragraph> 
     <Paragraph> 
      <TextBlock Text="3" Visibility="Collapsed"/> 
     </Paragraph> 
     <Paragraph> 
      <TextBlock Text="4" Visibility="Visible"/> 
     </Paragraph> 
    </Section> 
</FlowDocument> 

Welche macht die genau dasselbe Ergebnis.

+1

Gibt es einen Grund, warum Sie 4 Absätze hart codieren, wenn Sie nach Ihrer Frage gehen, könnten sie leer sein? Ein Benutzer wäre nicht in der Lage, dem Absatz etwas hinzuzufügen, wenn er trotzdem gequetscht wurde, sollte er überhaupt vorhanden sein? Wenn die Absätze nur gelesene Informationen von irgendwo anders anzeigen, ist es vielleicht besser, die Absätze nach Bedarf hinzuzufügen. – kenjara

+2

In der Tat dachte ich das Gleiche. Warum nicht leere Absätze auf View-Model-Ebene filtern? – Maverik

+0

Meine Frage ist eine vereinfachte Version meines Problems. Der Absatz enthält nicht genau nichts, sie haben mehrere Container. Aber ich kann mit diesem Teil des Problems umgehen, ich muss nur wissen, wie man einen Absatz vollständig versteckt, da er keine "Visibility" -Eigenschaft hat. –

Antwort

4

Ich zögere, dies zu schreiben, wie ich bin sicher, dass es ein besserer Weg, aber da niemand anders geantwortet hat ....

Ein Fluss Dokument Section erscheint Absätze einzuzuwickeln mit Leerzeichen equivilent zu der Absatz LineHeight.

LineHeight kann nicht 0 sein, aber es kann sehr klein sein. Einstellung LineHeight auf der Section wird Leerzeichen um alle Absätze entfernen.

<FlowDocumentScrollViewer> 
    <FlowDocumentScrollViewer.Resources> 
     <Style TargetType="Paragraph"> 
      <Setter Property="Background" Value="LightBlue" /> 
     </Style> 
    </FlowDocumentScrollViewer.Resources> 

    <FlowDocument> 
     <Section LineHeight="0.1"> 
      <Paragraph>1</Paragraph> 
      <Paragraph>2</Paragraph> 
      <Paragraph/>      
      <Paragraph>4</Paragraph> 
      <Paragraph>5</Paragraph> 
     </Section> 
    </FlowDocument> 

</FlowDocumentScrollViewer> 

LineHeight wie diese Einstellung wird in der Regel nicht den Text in den Absätzen beeinflussen, da die Standard-LineStackingStrategy stattdessen die Höhe der Schriftart verwendet. Beachten Sie, dass der leere Absatz immer noch Höhe hat.

Man könnte denken, LineHeight nur auf dem leeren Absatz Einstellung funktionieren würde, aber Section immer noch die Leerzeichen des vorhergehenden Absatzes ehrt. Da der vorherige Absatz normal ist LineHeight, erhalten Sie immer noch die Marge.

Also, um Ihre leeren Absatz vollständig zu entfernen, müssen Sie LineHeight auf dem Rohling und dem vorhergehenden Absatz setzen und Ihre leeren Absatz erzählen die LineHeight als Blockhöhe zu verwenden:

<FlowDocumentScrollViewer> 
    <FlowDocumentScrollViewer.Resources> 
     <Style TargetType="Paragraph"> 
      <Setter Property="Background" Value="LightBlue" /> 
     </Style> 
    </FlowDocumentScrollViewer.Resources> 

    <FlowDocument> 
     <Section> 
      <Paragraph>1</Paragraph> 
      <Paragraph LineHeight="0.1">2</Paragraph> 
      <Paragraph LineHeight="0.1" LineStackingStrategy="BlockLineHeight"/>      
      <Paragraph>4</Paragraph> 
      <Paragraph>5</Paragraph> 
     </Section> 
    </FlowDocument> 

</FlowDocumentScrollViewer> 

Ich habe versucht, einen Trigger, der dies automatisch für leere Absätze tun würde, aber leider Paragraph.Inlines.Count ist keine DependencyProperty, und versuchen, es zu verwenden, um leere Absätze zu erkennen ist unzuverlässig, je nachdem, wenn der Absatz ausgefüllt wird.

+0

Ich folgte dieser genauen Strategie und lief in Inlines.Count = 0 für alle Absätze auslösend. +1 :) – Maverik

+0

Sieht ein bisschen hackish aber funktioniert gut! Über den Paragraph.Inlines.Count muss ich das nicht tun, weil ich bereits weiß, was in meinen Absätzen steht. Meistens (in meinem Fall) enthält der Absatz nur einen Textblock und ich weiß, was der Text darin ist, aber das Verstecken des Textblocks lässt immer noch ein Leerzeichen wegen des Absatzes übrig. Deshalb musste ich wissen, wie ich diesen Raum loswerden kann. –

+0

Es ist in der Tat hackish, weshalb ich zögerte zu posten. Froh scheint es zumindest zu funktionieren. – GazTheDestroyer

2

Wenn es in Ihrem Szenario möglich ist zeigt VM-Eigenschaften zu haben, ob die Absätze leer sind, dann würde dies funktionieren: -

<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> 

auf die Schriftgröße Je müssen Sie möglicherweise mit dem Stil des „default“ spielen Randwert von "0,0,0,18".

Wenn es möglich ist, programmgesteuert festzustellen, ob ein Absatz leer ist, können Sie alternativ ein geerbtes Paragraph-Steuerelement erstellen, das eine IsEmpty-Abhängigkeitseigenschaft verfügbar macht. Der Trigger würde dies anstelle von Tag verwenden, und Sie würden die VM-Eigenschaften nicht benötigen.

+0

Was bedeutet VM in "VM-Eigenschaften"? –

+1

@ MaximeTremblay-Savard - Modell anzeigen (vorausgesetzt, Sie verwenden MVVM) –

1

versuchen diese

<FlowDocument> 

      <Section> 

       <Paragraph> 
        1 
       </Paragraph> 
       <Paragraph> 
        2 
       </Paragraph> 
       <Paragraph local:AttachNew.MyProperty="1"> 

       </Paragraph> 

        <Paragraph> 
        4 
       </Paragraph> 
      </Section> 
     </FlowDocument> 

public class AttachNew 
    { 
     public static int GetMyProperty(DependencyObject obj) 
     { 
      return (int)obj.GetValue(MyPropertyProperty); 
     } 

     public static void SetMyProperty(DependencyObject obj, int value) 
     { 
      obj.SetValue(MyPropertyProperty, value); 
     } 

     // Using a DependencyProperty as the backing store for MyProperty. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty MyPropertyProperty = 
      DependencyProperty.RegisterAttached("MyProperty", typeof(int), typeof(AttachNew), new PropertyMetadata(0, new PropertyChangedCallback(ChangeProp))); 

     private static void ChangeProp(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      Section objparent = (d as System.Windows.Documents.Paragraph).Parent as Section; 
      objparent.Blocks.Remove((d as System.Windows.Documents.Paragraph)); 
     } 
    } 
+0

Das funktioniert, aber ich wollte wissen, ob es einen einfacheren Weg als das Entfernen des Blocks von seinem Elternteil gab. Danke für die Antwort! –

1

In HTML, der Grund ist ein Absatz-Tag, auch leer, wenn Platz in Anspruch nimmt, weil es ein Block-Element ist, und daher ist es hasLayout. Dies bedeutet, dass der Rendering-Agent Eigenschaften wie Auffüllung und Zeilenhöhe zugewiesen hat und dass einen Zeilenumbruch verursacht.

Können Sie feststellen, ob ein Absatz leer ist, und seine Anzeigeregel ändern? Die Sichtbarkeit löscht ein Element nicht, sondern macht es nur unsichtbar, so dass das Absatz-Tag immer noch dazu führt, dass die lästige Linie bricht. Diese Zeile-Höhe-Lösung, die früher veröffentlicht wurde, hinterlässt immer noch den Zeilenumbruch. (An article about display vs visibility.)

Die CSS-Regel display:none; kann verwendet werden, um es aus dem Seitenfluss zu entfernen (siehe hasLayout-Link oben). Ich mag es, eine CSS-Klasse zu verwenden und diese programmatisch anzuwenden. So etwas wie dies funktioniert im Allgemeinen den Trick:

.hidden {display:none;height:0;width:0;} 

Sie können auch line-height:0; in dieser Klasse gehören die früheren Vorschlag zu decken.

+0

Das macht Sinn, aber wie würden Sie dies bei einer WPF-Anwendung erreichen? –

Verwandte Themen