Zum Inhalt
Kuonen.UI

DocumentViewer

Feste Seiten (FixedDocument aus FixedPage) untereinander zeigen: rollen, Bild auf/ab blättert, Strg+Plus/Minus zoomt, die Knöpfe passen Breite oder ganze Seite ein. Gebaut werden nur die sichtbaren Seiten; Drucken gibt die Seiten in ihrer Grösse aus.

Vorführung: DocumentViewerVorführung: DocumentViewer

KXAML

DocumentViewerSeite.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.DocumentViewerVorfuehrung"
            Spacing="8">
  <!-- Seiten und Knöpfe füllt DocumentViewerSeite.Fuelle, dieselbe Methode wie die C#-Fassung. -->
  <StackPanel x:Name="Leiste" Orientation="Horizontal" Spacing="6" />
  <dok:DocumentViewer x:Name="Viewer" Height="420" Width="620" />
  <TextBlock x:Name="Meldung" />
</StackPanel>
DocumentViewerSeite.kxaml.cs
using Kuonen.UI;

namespace Kuonen.UI.Galerie.Seiten;

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

/// <summary>KXAML-Fassung der Seite DocumentViewer: das Gerüst steht in DocumentViewerSeite.kxaml, das Innere füllt DocumentViewerSeite.Fuelle.</summary>
public sealed partial class DocumentViewerVorfuehrung
{
    public DocumentViewerVorfuehrung()
    {
        InitializeComponent();
        DocumentViewerSeite.Fuelle(Leiste, Viewer, Meldung);
    }
}

C#

DocumentViewerSeite.cs
using Kuonen.UI;
using Kuonen.UI.Controls;
using Kuonen.UI.Controls.Dokumente;
using Kuonen.UI.Layout;
using Kuonen.UI.Media;
using Kuonen.UI.Shapes;

namespace Kuonen.UI.Galerie.Seiten;

/// <summary>Galerie-Seite: DocumentViewer mit festen Seiten (FixedDocument), Zoom, Einpassen und Drucken (Plan 6i).</summary>
public sealed partial class DocumentViewerSeite : GalerieSeite
{
    public override string Titel => "DocumentViewer";

    public override string Beschreibung =>
        "Feste Seiten (FixedDocument aus FixedPage) untereinander zeigen: rollen, Bild auf/ab blättert, Strg+Plus/Minus zoomt, die Knöpfe passen Breite oder " +
        "ganze Seite ein. Gebaut werden nur die sichtbaren Seiten; Drucken gibt die Seiten in ihrer Grösse aus.";

    public override string Stichworte => "DocumentViewer FixedDocument FixedPage PageContent Seiten Zoom Einpassen Drucken Rechnung";

    public override string Datei => nameof(DocumentViewerSeite);

    public override UIElement Baue()
    {
        var seite = new StackPanel { Spacing = 8 };
        var leiste = new StackPanel { Orientation = Orientation.Horizontal, Spacing = 6 };
        var viewer = new DocumentViewer { Height = 420, Width = 620 };
        var meldung = new TextBlock();
        Fuelle(leiste, viewer, meldung);
        seite.Children.Add(leiste);
        seite.Children.Add(viewer);
        seite.Children.Add(meldung);
        return seite;
    }

    /// <summary>Sechs Rechnungsseiten und die Knöpfe (auch von der KXAML-Fassung benutzt).</summary>
    public static void Fuelle(StackPanel leiste, DocumentViewer viewer, TextBlock meldung)
    {
        var d = new FixedDocument();
        for (int i = 1; i <= 6; i++)
        {
            int nummer = i;
            d.Pages.Add(new PageContent(() => Rechnung(nummer)));
        }
        viewer.Document = d;
        foreach (var (text, tun) in new (string, Action)[] { ("Breite einpassen", viewer.FitToWidth), ("Ganze Seite", viewer.FitToHeight), ("Grösser", viewer.IncreaseZoom), ("Kleiner", viewer.DecreaseZoom) })
        {
            var k = new Button { Content = text };
            k.Click += (_, _) => tun();
            leiste.Children.Add(k);
        }
        var drucken = new Button { Content = "Drucken" };
        drucken.Click += async (_, _) => meldung.Text = await viewer.PrintAsync() ? "Gedruckt." : "Nicht gedruckt.";
        leiste.Children.Add(drucken);
    }

    private static FixedPage Rechnung(int nummer)
    {
        var p = new FixedPage();
        void Setze(UIElement e, double x, double y)
        {
            Canvas.SetLeft(e, x);
            Canvas.SetTop(e, y);
            p.Children.Add(e);
        }
        Setze(new Rectangle { Width = 714, Height = 6, Fill = new SolidColorBrush(Color.FromRgb(0x2B, 0x57, 0x9A)) }, 40, 40);
        Setze(new TextBlock { Text = $"Rechnung {2025_000 + nummer}", FontSize = 28, FontWeight = 700 }, 40, 70);
        Setze(new TextBlock { Text = "Kuonen Reisen · Bahnhofstrasse 1 · 3000 Bern", FontSize = 13 }, 40, 115);
        for (int z = 0; z < 8; z++)
        {
            Setze(new TextBlock { Text = $"Position {z + 1}: Übernachtung und Frühstück", FontSize = 14 }, 40, 180 + z * 32);
            Setze(new TextBlock { Text = $"CHF {120 + z * 15}.00", FontSize = 14 }, 620, 180 + z * 32);
        }
        Setze(new TextBlock { Text = $"Seite {nummer} von 6", FontSize = 12 }, 40, 1060);
        return p;
    }
}