Zum Inhalt
Kuonen.UI

Pipette

Window.Pipette holt eine Farbe vom ganzen Bildschirm: Windows (Maushaken, Klick wählt, rechte Taste oder Esc bricht ab), Linux (Screenshot.PickColor des Portals), macOS (NSColorSampler) und Browser (EyeDropper in Chrome und Edge). Die ColorView zeigt dafür einen Knopf neben der Vorschau, sobald der Host eine Pipette hat (IsEyedropperVisible schaltet ihn ab). Die Farbe kommt deckend herein.

Vorführung: PipetteVorführung: Pipette

KXAML

PipetteSeite.kxaml
<StackPanel xmlns="https://ui.kuonen.org/kxaml"
            xmlns:x="https://ui.kuonen.org/kxaml/x"
            x:Class="Kuonen.UI.Galerie.Seiten.PipetteVorfuehrung"
            Spacing="12">
  <TextBlock Text="Eigener Knopf" FontWeight="SemiBold" />
  <StackPanel Orientation="Horizontal" Spacing="12">
    <Button x:Name="Knopf" Content="Farbe vom Bildschirm" Style="{x:Static Fluent.AkzentButton}" Click="Knopf_Click" />
    <Border x:Name="Vorschau" Width="48" Height="48" CornerRadius="4" Background="#FFFFFF" />
    <TextBlock x:Name="Ergebnis" Text="Noch keine Farbe." VerticalAlignment="Center" />
  </StackPanel>
  <TextBlock Text="In der Farbwahl" FontWeight="SemiBold" />
  <ColorView Color="#0078D4" Width="360" IsColorPaletteVisible="False" />
</StackPanel>
PipetteSeite.kxaml.cs
using Kuonen.UI;
using Kuonen.UI.Ereignisse;

namespace Kuonen.UI.Galerie.Seiten;

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

/// <summary>KXAML-Fassung der Pipetten-Seite: der Baum steht in PipetteSeite.kxaml, hier nur das Verhalten.</summary>
public sealed partial class PipetteVorfuehrung
{
    public PipetteVorfuehrung() => InitializeComponent();

    private async void Knopf_Click(object sender, RoutedEventArgs e) => await PipetteSeite.Waehle(Knopf, Vorschau, Ergebnis);
}

C#

PipetteSeite.cs
using Kuonen.UI;
using Kuonen.UI.Controls;
using Kuonen.UI.Layout;
using Kuonen.UI.Media;
using Kuonen.UI.Themes;

namespace Kuonen.UI.Galerie.Seiten;

/// <summary>Galerie-Seite: eine Farbe vom Bildschirm holen, auch ausserhalb des Fensters (Plan 6h, D14).</summary>
public sealed partial class PipetteSeite : GalerieSeite
{
    public override string Titel => "Pipette";

    public override string Beschreibung =>
        "Window.Pipette holt eine Farbe vom ganzen Bildschirm: Windows (Maushaken, Klick wählt, rechte Taste oder Esc bricht ab), Linux "
        + "(Screenshot.PickColor des Portals), macOS (NSColorSampler) und Browser (EyeDropper in Chrome und Edge). Die ColorView zeigt dafür einen "
        + "Knopf neben der Vorschau, sobald der Host eine Pipette hat (IsEyedropperVisible schaltet ihn ab). Die Farbe kommt deckend herein.";

    public override string Stichworte => "Pipette Farbe Bildschirm EyeDropper NSColorSampler PickColor IPipette Window.Pipette ColorView IsEyedropperVisible";

    public override string Datei => nameof(PipetteSeite);

    /// <summary>Holt eine Farbe und zeigt sie in <paramref name="vorschau"/> und <paramref name="ergebnis"/>.</summary>
    internal static async Task Waehle(Visual element, Border vorschau, TextBlock ergebnis)
    {
        if (MessageBoxSeite.FensterVon(element)?.Pipette is not { KannWaehlen: true } pipette)
        {
            ergebnis.Text = "Dieser Host hat keine Pipette.";
            return;
        }
        try
        {
            if (await pipette.WaehleAsync() is { } farbe)
            {
                vorschau.Background = new SolidColorBrush(farbe);
                ergebnis.Text = $"Gewählt: #{farbe.R:X2}{farbe.G:X2}{farbe.B:X2}";
            }
            else ergebnis.Text = "Abgebrochen.";
        }
        catch (Exception e) when (e is InvalidOperationException or PlatformNotSupportedException)
        {
            ergebnis.Text = "Nicht möglich: " + e.Message;
        }
    }

    public override UIElement Baue()
    {
        var vorschau = new Border { Width = 48, Height = 48, CornerRadius = new CornerRadius(4), Background = new SolidColorBrush(Color.FromRgb(255, 255, 255)) };
        var ergebnis = new TextBlock { Text = "Noch keine Farbe.", VerticalAlignment = VerticalAlignment.Center };
        var knopf = new Button { Content = "Farbe vom Bildschirm", Style = Fluent.AkzentButton };
        knopf.Click += async (_, _) => await Waehle(knopf, vorschau, ergebnis);
        var zeile = new StackPanel { Orientation = Orientation.Horizontal, Spacing = 12 };
        zeile.Children.Add(knopf);
        zeile.Children.Add(vorschau);
        zeile.Children.Add(ergebnis);
        var seite = new StackPanel { Spacing = 12 };
        seite.Children.Add(new TextBlock { Text = "Eigener Knopf", FontWeight = 600 });
        seite.Children.Add(zeile);
        seite.Children.Add(new TextBlock { Text = "In der Farbwahl", FontWeight = 600 });
        seite.Children.Add(new ColorView { Color = Color.FromRgb(0, 120, 212), Width = 360, IsColorPaletteVisible = false });
        return seite;
    }
}