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.


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));
}
}