Zum Inhalt
Kuonen.UI

WebView

Der Browser des Systems in der Oberfläche (macOS: WKWebView): Adresse, Zurück und Vor, HTML aus einer Zeichenkette, Skripte und Nachrichten. Erlaubt sind http, https, about und data; Navigating kann abbrechen. Wo der Host keinen Browser einbetten kann, steht ein Platzhalter.

Vorführung: WebViewVorführung: WebView

KXAML

WebViewSeite.kxaml
<StackPanel xmlns="https://ui.kuonen.org/kxaml"
            xmlns:x="https://ui.kuonen.org/kxaml/x"
            x:Class="Kuonen.UI.Galerie.Seiten.WebViewVorfuehrung"
            Spacing="8">
  <!-- Adresszeile und Knöpfe füllt WebViewSeite.Fuelle, dieselbe Methode wie die C#-Fassung. -->
  <StackPanel x:Name="Leiste" Orientation="Horizontal" Spacing="6" />
  <WebView x:Name="Web" Width="640" Height="360" />
  <TextBlock x:Name="Status" />
</StackPanel>
WebViewSeite.kxaml.cs
using Kuonen.UI;
using Kuonen.UI.Controls;

namespace Kuonen.UI.Galerie.Seiten;

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

/// <summary>KXAML-Fassung der Seite WebView: das Gerüst steht in WebViewSeite.kxaml, das Innere füllt WebViewSeite.Fuelle.</summary>
public sealed partial class WebViewVorfuehrung
{
    public WebViewVorfuehrung()
    {
        InitializeComponent();
        // Die Adresszeile steht in der Leiste (wie in der C#-Fassung), darum hier gebaut.
        WebViewSeite.Fuelle(Leiste, new TextBox { Width = 360, Text = "https://ui.kuonen.org" }, Web, Status);
    }
}

C#

WebViewSeite.cs
using Kuonen.UI;
using Kuonen.UI.Controls;
using Kuonen.UI.Layout;

namespace Kuonen.UI.Galerie.Seiten;

/// <summary>Galerie-Seite: WebView mit Adresszeile, Verlauf und HTML aus einer Zeichenkette (Plan 6j).</summary>
public sealed partial class WebViewSeite : GalerieSeite
{
    public override string Titel => "WebView";

    public override string Beschreibung =>
        "Der Browser des Systems in der Oberfläche (macOS: WKWebView): Adresse, Zurück und Vor, HTML aus einer Zeichenkette, Skripte und Nachrichten. " +
        "Erlaubt sind http, https, about und data; Navigating kann abbrechen. Wo der Host keinen Browser einbetten kann, steht ein Platzhalter.";

    public override string Stichworte => "WebView WebView2 WebBrowser Browser HTML Navigation Skript Nachricht WKWebView";

    public override string Datei => nameof(WebViewSeite);

    public override UIElement Baue()
    {
        var seite = new StackPanel { Spacing = 8 };
        var leiste = new StackPanel { Orientation = Orientation.Horizontal, Spacing = 6 };
        var adresse = new TextBox { Width = 360, Text = "https://ui.kuonen.org" };
        var web = new WebView { Width = 640, Height = 360 };
        var status = new TextBlock();
        Fuelle(leiste, adresse, web, status);
        seite.Children.Add(leiste);
        seite.Children.Add(web);
        seite.Children.Add(status);
        return seite;
    }

    /// <summary>Adresszeile und Knöpfe (auch von der KXAML-Fassung benutzt).</summary>
    public static void Fuelle(StackPanel leiste, TextBox adresse, WebView web, TextBlock status)
    {
        void Knopf(string text, Action tun)
        {
            var k = new Button { Content = text };
            k.Click += (_, _) => tun();
            leiste.Children.Add(k);
        }
        Knopf("◀", web.GoBack);
        Knopf("▶", web.GoForward);
        leiste.Children.Add(adresse);
        Knopf("Öffnen", () =>
        {
            if (Uri.TryCreate(adresse.Text, UriKind.Absolute, out var ziel)) web.Source = ziel;
        });
        Knopf("HTML", () => web.NavigateToString("<html><head><title>Hallo</title></head><body><h1>Hallo aus Kuonen.UI</h1><p>Diese Seite kommt aus einer Zeichenkette.</p></body></html>"));
        web.NavigationCompleted += (_, e) =>
        {
            status.Text = (e.IsSuccess ? "Geladen: " : "Nicht geladen: ") + e.Uri;
            if (e.Uri is { } u && u.Scheme != "about") adresse.Text = u.ToString();
        };
    }
}