Zum Inhalt
Kuonen.UI

Drucken

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

Vorführung: DruckenVorführung: Drucken

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