Zum Inhalt
Kuonen.UI

RichTextBox

Text mit Formaten bearbeiten: fett, kursiv, unterstrichen (Strg+B/I/U), ausrichten (Strg+L/E/R), Aufzählungen (Strg+Umschalt+L) mit Einzug (Tab), Rückgängig, Zwischenablage mit RTF und HTML. Das Dokument ist ein FlowDocument; die Knöpfe unten schreiben es als HTML, RTF oder Markdown aus.

Vorführung: RichTextBoxVorführung: RichTextBox

KXAML

RichTextBoxSeite.kxaml
<StackPanel xmlns="https://ui.kuonen.org/kxaml"
            xmlns:x="https://ui.kuonen.org/kxaml/x"
            xmlns:dok="using:Kuonen.UI.Controls.Dokumente"
            x:Class="Kuonen.UI.Galerie.Seiten.RichTextBoxVorfuehrung"
            Spacing="8">
  <!-- Dokument und Knöpfe füllt RichTextBoxSeite.Fuelle, dieselbe Methode wie die C#-Fassung. -->
  <StackPanel x:Name="Leiste" Orientation="Horizontal" Spacing="6" />
  <dok:RichTextBox x:Name="Box" Height="220" Width="520" />
  <StackPanel x:Name="AusgabeLeiste" Orientation="Horizontal" Spacing="6" />
  <TextBox x:Name="Ausgabe" Height="140" Width="520" AcceptsReturn="True" IsReadOnly="True" TextWrapping="Wrap" />
</StackPanel>
RichTextBoxSeite.kxaml.cs
using Kuonen.UI;

namespace Kuonen.UI.Galerie.Seiten;

public sealed partial class RichTextBoxSeite
{
    protected override Func<UIElement>? KxamlFabrik => () => new RichTextBoxVorfuehrung();
}

/// <summary>KXAML-Fassung der Seite RichTextBox: das Gerüst steht in RichTextBoxSeite.kxaml, das Innere füllt RichTextBoxSeite.Fuelle.</summary>
public sealed partial class RichTextBoxVorfuehrung
{
    public RichTextBoxVorfuehrung()
    {
        InitializeComponent();
        RichTextBoxSeite.Fuelle(Leiste, Box, AusgabeLeiste, Ausgabe);
    }
}

C#

RichTextBoxSeite.cs
using Kuonen.UI;
using Kuonen.UI.Controls;
using Kuonen.UI.Controls.Dokumente;
using Kuonen.UI.Layout;
using Kuonen.UI.Text;

namespace Kuonen.UI.Galerie.Seiten;

/// <summary>Galerie-Seite: RichTextBox mit Formatleiste und Ausgabe als HTML, RTF und Markdown (Plan 6i).</summary>
public sealed partial class RichTextBoxSeite : GalerieSeite
{
    public override string Titel => "RichTextBox";

    public override string Beschreibung =>
        "Text mit Formaten bearbeiten: fett, kursiv, unterstrichen (Strg+B/I/U), ausrichten (Strg+L/E/R), Aufzählungen (Strg+Umschalt+L) mit Einzug (Tab), Rückgängig, " +
        "Zwischenablage mit RTF und HTML. Das Dokument ist ein FlowDocument; die Knöpfe unten schreiben es als HTML, RTF oder Markdown aus.";

    public override string Stichworte => "RichTextBox FlowDocument Paragraph Run Bold Italic Underline Liste Einzug HTML RTF Markdown Zwischenablage Editor";

    public override string Datei => nameof(RichTextBoxSeite);

    public override UIElement Baue()
    {
        var seite = new StackPanel { Spacing = 8 };
        var leiste = new StackPanel { Orientation = Orientation.Horizontal, Spacing = 6 };
        var box = new RichTextBox { Height = 220, Width = 520 };
        var ausgabeLeiste = new StackPanel { Orientation = Orientation.Horizontal, Spacing = 6 };
        var ausgabe = new TextBox { Height = 140, Width = 520, AcceptsReturn = true, IsReadOnly = true, TextWrapping = TextWrapping.Wrap };
        Fuelle(leiste, box, ausgabeLeiste, ausgabe);
        seite.Children.Add(leiste);
        seite.Children.Add(box);
        seite.Children.Add(ausgabeLeiste);
        seite.Children.Add(ausgabe);
        return seite;
    }

    /// <summary>Dokument, Formatknöpfe und Ausgabeknöpfe (auch von der KXAML-Fassung benutzt).</summary>
    public static void Fuelle(StackPanel leiste, RichTextBox box, StackPanel ausgabeLeiste, TextBox ausgabe)
    {
        box.Document = Beispieldokument.Baue(weitereAbsaetze: 2);
        void Knopf(Panel ziel, string text, Action tun)
        {
            var k = new Button { Content = text };
            k.Click += (_, _) =>
            {
                tun();
                box.Focus();
            };
            ziel.Children.Add(k);
        }
        Knopf(leiste, "Fett", box.ToggleBold);
        Knopf(leiste, "Kursiv", box.ToggleItalic);
        Knopf(leiste, "Unterstrichen", box.ToggleUnderline);
        Knopf(leiste, "Liste", () => box.ToggleListe(TextMarkerStyle.Disc));
        Knopf(leiste, "Links", () => box.Ausrichten(TextAusrichtung.Links));
        Knopf(leiste, "Mitte", () => box.Ausrichten(TextAusrichtung.Mitte));
        Knopf(leiste, "Rechts", () => box.Ausrichten(TextAusrichtung.Rechts));
        Knopf(leiste, "Rückgängig", () => box.Undo());
        Knopf(ausgabeLeiste, "Als HTML", () => ausgabe.Text = DokumentHtml.Schreibe(box.Document));
        Knopf(ausgabeLeiste, "Als RTF", () => ausgabe.Text = DokumentRtf.Schreibe(box.Document));
        Knopf(ausgabeLeiste, "Als Markdown", () => ausgabe.Text = DokumentMarkdown.Schreibe(box.Document));
    }
}