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.


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