Autor Beitrag
georgeboy
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 246



BeitragVerfasst: Do 09.04.26 09:20 
Hallo zusammen, mal wieder. Ich habe bei WPF eine TextBox, und später eine RichTextBox eingebaut. Leider habe ich festgestellt, dass der Abstand zwischen den Zeilen viel zu gross ist. Ob ich jetzt Enter oder Shift-Enter drücke. Bei Google habe ich vergeblich gesucht. Dann habe ich versucht, eine TextBox von WinForms zu hosten. Das ging soweit. Kann man den Zeilenabstand verringern ?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4806
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 09.04.26 13:08 
Kannst du mal einen Screenshot zeigen?

Die Zeilenhöhe wird wohl automatisch vom Zeichensatz bestimmt. Bei Shift+Enter sollte aber der Zeilenabstand so sein, daß nur einige Leerpixel zwischen den Zeilen sind.
Welchen Zeichensatz (+ Größe) hast du denn eingestellt?

ChapGPT hat mir folgende Antwort auf die Frage "Bei einer WPF-RichTextBox für reine Editierung durch den Anwender soll der Zeilenabstand verringert werden (ohne daß `Paragraph` im XAML vorgegeben ist)." gegeben:

Ja, das geht – du musst nur **zur Laufzeit an das `FlowDocument` bzw. die `Paragraphs` ran**, weil bei einer leeren `RichTextBox` nichts im XAML definiert ist.

Der entscheidende Punkt:
Auch ohne XAML erzeugt die `RichTextBox` intern automatisch ein `FlowDocument` mit mindestens einem `Paragraph`.

---

## ✅ Lösung: Default-Paragraph manipulieren

### 🔹 Einfachster Ansatz (nach Laden)

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var doc = richTextBox.Document;

foreach (var block in doc.Blocks)
{
    if (block is Paragraph p)
    {
        p.LineHeight = 12// kleinerer Zeilenabstand
        p.LineStackingStrategy = LineStackingStrategy.BlockLineHeight;
        p.Margin = new Thickness(0); // optional: extra Abstand entfernen
    }
}


---

## ⚠️ Problem: Neue Absätze!

Sobald der Nutzer Enter drückt, entstehen neue `Paragraph`-Objekte – die haben wieder Standardwerte.

👉 Deshalb brauchst du eine **dauerhafte Lösung**.

---

## ✅ Bessere Lösung: Default-Style für Paragraph setzen

Du kannst dem `FlowDocument` einen Style geben:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
var style = new Style(typeof(Paragraph));

style.Setters.Add(new Setter(Paragraph.LineHeightProperty, 12.0));
style.Setters.Add(new Setter(Paragraph.LineStackingStrategyProperty, LineStackingStrategy.BlockLineHeight));
style.Setters.Add(new Setter(Paragraph.MarginProperty, new Thickness(0)));

richTextBox.Document.Resources.Add(typeof(Paragraph), style);


👉 Vorteil:

* Gilt automatisch für **alle bestehenden und zukünftigen Paragraphs**
* Kein Nacharbeiten nötig

---

## 🧠 Alternative (global im App.xaml)

Wenn du das überall willst:

ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
<Application.Resources>
    <Style TargetType="Paragraph">
        <Setter Property="LineHeight" Value="12"/>
        <Setter Property="LineStackingStrategy" Value="BlockLineHeight"/>
        <Setter Property="Margin" Value="0"/>
    </Style>
</Application.Resources>


---

## 💡 Tipps

* Typische Werte: `LineHeight ≈ FontSize * 1.0–1.2`
* Wenn es „zu gequetscht“ wirkt → leicht erhöhen
* Ohne `BlockLineHeight` ignoriert WPF oft kleine Werte

---

## 🧾 Kurzfazit

* ✔ Kein XAML nötig
* ✔ Über `Document.Resources` steuerbar
* ✔ Funktioniert auch für neu eingegebenen Text

---
georgeboy Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 246



BeitragVerfasst: Do 09.04.26 13:46 
Also, ich verwende eine TextBox, folgender Text, tut sich nichts

ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
<Window x:Class="AnchorTest1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" WindowState="Maximized" Loaded="Window_Loaded">
    
    <Grid>
        <TextBox Height="Auto" HorizontalAlignment="Stretch"   Margin="20,20,20,20" Name="textBox1" 
                 VerticalAlignment="Stretch" Width="Auto" FontSize="40" 
                 Foreground="Red" Background="#FFA0A0FF" AcceptsReturn="True">
            <TextBox.Resources>
                <Style TargetType="{x:Type Paragraph}">
                    <Setter Property="LineHeight" Value="1"/>
                    <Setter Property="LineStackingStrategy" Value="BlockLineHeight"/>
                    <Setter Property="Margin" Value="0"/>
                </Style>
            </TextBox.Resources>
        </TextBox>
    </Grid>
</Window>
georgeboy Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 246



BeitragVerfasst: Do 09.04.26 13:56 
Und im App.xaml: ohne Erfolg

ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
<Application x:Class="AnchorTest1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <Style TargetType="Paragraph">
            <Setter Property="LineHeight" Value="12"/>
            <Setter Property="LineStackingStrategy" Value="BlockLineHeight"/>
            <Setter Property="Margin" Value="0"/>
        </Style>
    </Application.Resources>
</Application>
georgeboy Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 246



BeitragVerfasst: Do 09.04.26 14:12 
Bei RichTextBox, gings ! Danke !

ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
<Application x:Class="AnchorTest1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <Style TargetType="Paragraph">
            <Setter Property="LineHeight" Value="38"/>
            <Setter Property="LineStackingStrategy" Value="BlockLineHeight"/>
            <Setter Property="Margin" Value="0"/>
        </Style>
    </Application.Resources>
</Application>
georgeboy Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 246



BeitragVerfasst: Do 09.04.26 15:08 
Kenne mich bei WPF nicht besonders gut aus, bin kein Spezialist wie Du ! Nochmals Danke !