Ein Druckauftrag baut seine Seiten als Elemente; die PrintPreview zeigt sie zum Blättern und Zoomen, mit Papierformat und Querformat. Gedruckt wird über den Weg der Plattform: Windows (Druckdialog und GDI), Linux (Druckportal), macOS (PDFKit), Android (PrintManager), iOS (UIPrintInteractionController) und Browser (Druck der Seite). Die PDF dazwischen ist eine Vektor-PDF mit eingebetteten Teilschriften (durchsuchbar, scharf in jeder Grösse).


KXAML
DruckenSeite.kxaml
<StackPanel xmlns="https://ui.kuonen.org/kxaml"
xmlns:x="https://ui.kuonen.org/kxaml/x"
x:Class="Kuonen.UI.Galerie.Seiten.DruckenVorfuehrung"
Spacing="12">
<TextBlock Text="Druckvorschau" FontWeight="SemiBold" />
<PrintPreview x:Name="Vorschau" Height="480" Gedruckt="Vorschau_Gedruckt" />
<TextBlock x:Name="Ergebnis" Text="Noch nicht gedruckt." TextWrapping="Wrap" />
</StackPanel>DruckenSeite.kxaml.cs
using Kuonen.UI;
namespace Kuonen.UI.Galerie.Seiten;
public sealed partial class DruckenSeite
{
protected override Func<UIElement>? KxamlFabrik => () => new DruckenVorfuehrung();
}
/// <summary>KXAML-Fassung der Druckseite: der Baum steht in DruckenSeite.kxaml; den Auftrag (Seiten aus Code) setzt der Code-Behind.</summary>
public sealed partial class DruckenVorfuehrung
{
public DruckenVorfuehrung()
{
InitializeComponent();
Vorschau.Auftrag = DruckenSeite.Beispiel();
}
private void Vorschau_Gedruckt(object? sender, bool gedruckt) => Ergebnis.Text = DruckenSeite.Meldung(gedruckt);
}C#
DruckenSeite.cs
using Kuonen.UI;
using Kuonen.UI.Controls;
using Kuonen.UI.Dienste;
using Kuonen.UI.Layout;
using Kuonen.UI.Media;
namespace Kuonen.UI.Galerie.Seiten;
/// <summary>Galerie-Seite: Druckvorschau und Drucken über den Weg der Plattform (Plan 6h).</summary>
public sealed partial class DruckenSeite : GalerieSeite
{
/// <summary>Seitenzahl des Beispielauftrags.</summary>
public const int Seiten = 3;
public override string Titel => "Drucken";
public override string Beschreibung =>
"Ein Druckauftrag baut seine Seiten als Elemente; die PrintPreview zeigt sie zum Blättern und Zoomen, mit Papierformat und Querformat. "
+ "Gedruckt wird über den Weg der Plattform: Windows (Druckdialog und GDI), Linux (Druckportal), macOS (PDFKit), Android (PrintManager), "
+ "iOS (UIPrintInteractionController) und Browser (Druck der Seite). Die PDF dazwischen ist eine Vektor-PDF mit eingebetteten Teilschriften "
+ "(durchsuchbar, scharf in jeder Grösse).";
public override string Stichworte => "Drucken Druck PrintPreview Druckvorschau Druckauftrag Seiteneinrichtung Seitenformat Querformat PDF IDruckdienst Window.Druckdienst";
public override string Datei => nameof(DruckenSeite);
/// <summary>Der Beispielauftrag: drei Seiten mit Überschrift, Text und einer farbigen Fläche.</summary>
internal static Druckauftrag Beispiel() => new(Seiten, i =>
{
var seite = new StackPanel { Spacing = 12 };
seite.Children.Add(new TextBlock { Text = $"Bericht – Seite {i + 1} von {Seiten}", FontSize = 22, FontWeight = 600 });
seite.Children.Add(new TextBlock
{
Text = "Diese Seite ist ein ganz gewöhnlicher Baum aus Kuonen.UI-Elementen. Die Vorschau zeigt ihn so, wie er auf das Papier kommt; "
+ "gedruckt wird er als Vektor-PDF mit eingebetteten Schriften.",
TextWrapping = TextWrapping.Wrap,
});
seite.Children.Add(new Border { Height = 60, Background = new SolidColorBrush(Color.FromRgb(0, 120, 212)), CornerRadius = new CornerRadius(6) });
return seite;
})
{
Titel = "Galerie-Bericht",
};
internal static string Meldung(bool gedruckt) => gedruckt ? "Gedruckt." : "Nicht gedruckt (abgebrochen oder ohne Druckweg).";
public override UIElement Baue()
{
var ergebnis = new TextBlock { Text = "Noch nicht gedruckt.", TextWrapping = TextWrapping.Wrap };
var vorschau = new PrintPreview { Auftrag = Beispiel(), Height = 480 };
vorschau.Gedruckt += (_, gedruckt) => ergebnis.Text = Meldung(gedruckt);
var seite = new StackPanel { Spacing = 12 };
seite.Children.Add(new TextBlock { Text = "Druckvorschau", FontWeight = 600 });
seite.Children.Add(vorschau);
seite.Children.Add(ergebnis);
return seite;
}
}