From a6358d581e3946f1f7622feabc545c5f84b5681b Mon Sep 17 00:00:00 2001 From: Meik Date: Thu, 5 Mar 2026 16:40:26 +0100 Subject: [PATCH] fix(layout): clip main body to rounded bottom corners --- Changelog.md | 2 +- MainWindow.xaml | 23 ++++++++++++++--------- MainWindow.xaml.cs | 30 ++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 10 deletions(-) diff --git a/Changelog.md b/Changelog.md index b4a31db..560f7ef 100644 --- a/Changelog.md +++ b/Changelog.md @@ -10,7 +10,7 @@ - Hauptlayout von festen `Window.ActualWidth`-Bindings entkoppelt, damit Header/Content nicht über die gerundete Innenfläche hinausragen. - Feste Hauptlayout-Höhen (Navigation/Content) auf die verfügbare Innenhöhe abgestimmt und Clipping im Dock-Bereich aktiviert, damit keine Inhalte in die Rundungsbereiche überlaufen. - Initialisierung des Rounded-Clips auf den finalen Layout-Zeitpunkt erweitert (Loaded/Render), damit die Rundungsbegrenzung stabil greift. -- MainWindow-Ecküberstände beseitigt: Navigation-Rail unten links an den Fensterradius angepasst, Content-Bereich im `DockPanel` als Fill-Element geführt und zusätzlicher Surface-Clip auf Radius `20` gesetzt. +- MainWindow-Ecküberstände beseitigt: Navigation-Rail unten links an den Fensterradius angepasst, Content-Bereich im `DockPanel` als Fill-Element geführt, zusätzlicher Surface-Clip auf Radius `20` gesetzt und Body-Host per Geometrie mit gerundeten unteren Ecken begrenzt. - Sichtbarkeit des Main-Contents wiederhergestellt: Navigations-/Content-Host auf feste Breitenaufteilung (`75 + 425`) umgestellt, damit das Inhaltspanel nicht mehr durch einen Zero-Width-Viewport abgeschnitten wird. ### Navigation und Interaktion diff --git a/MainWindow.xaml b/MainWindow.xaml index 5035ea0..a468e0f 100644 --- a/MainWindow.xaml +++ b/MainWindow.xaml @@ -492,13 +492,17 @@ - - + + + + + - - + 0d && btnSP.ActualHeight > 0d) + { + btnSP.Clip = CreateBottomRoundedRectGeometry(btnSP.ActualWidth, btnSP.ActualHeight, surfaceRadius); + } + _mainSurfaceClipInitialized = true; } + private static Geometry CreateBottomRoundedRectGeometry(double width, double height, double radius) + { + if (width <= 0d || height <= 0d) + return Geometry.Empty; + + double r = Math.Max(0d, Math.Min(radius, Math.Min(width / 2d, height / 2d))); + if (r <= 0d) + return new RectangleGeometry(new Rect(0d, 0d, width, height)); + + var geometry = new StreamGeometry(); + using (var context = geometry.Open()) + { + context.BeginFigure(new Point(0d, 0d), true, true); + context.LineTo(new Point(width, 0d), true, false); + context.LineTo(new Point(width, height - r), true, false); + context.ArcTo(new Point(width - r, height), new Size(r, r), 0d, false, SweepDirection.Clockwise, true, false); + context.LineTo(new Point(r, height), true, false); + context.ArcTo(new Point(0d, height - r), new Size(r, r), 0d, false, SweepDirection.Clockwise, true, false); + context.LineTo(new Point(0d, 0d), true, false); + } + + geometry.Freeze(); + return geometry; + } + } public class cMainFunctionInfo