fix(layout): add top-level corner mask overlay

This commit is contained in:
Meik
2026-03-05 16:58:39 +01:00
parent d411f23fc4
commit c72231f3b3
3 changed files with 29 additions and 1 deletions

View File

@@ -10,7 +10,7 @@
- Hauptlayout von festen `Window.ActualWidth`-Bindings entkoppelt, damit Header/Content nicht über die gerundete Innenfläche hinausragen. - 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. - 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. - 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, zusätzlicher Surface-Clip auf Radius `20` gesetzt, den gesamten `MainWindowContentRoot` als konstanten `1px`-Inset innerhalb des Rahmens geführt und den Body-Host per Geometrie mit zum Innenradius passenden gerundeten unteren Ecken begrenzt (WPF-Typen für Geometriepunkte/-größen explizit qualifiziert, um Mehrdeutigkeiten mit `System.Drawing` zu vermeiden). - 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, den gesamten `MainWindowContentRoot` als konstanten `1px`-Inset innerhalb des Rahmens geführt, den Body-Host per Geometrie mit zum Innenradius passenden gerundeten unteren Ecken begrenzt und zusätzlich eine On-Top-Corner-Maske (`Rectangle - RoundedRectangle`) ergänzt, die Überzeichnung außerhalb der Rundung zuverlässig abdeckt (WPF-Typen für Geometriepunkte/-größen explizit qualifiziert, um Mehrdeutigkeiten mit `System.Drawing` zu vermeiden).
- 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. - 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 ### Navigation und Interaktion

View File

@@ -1004,6 +1004,13 @@
Margin="80,0,0,140" /> Margin="80,0,0,140" />
</Grid> </Grid>
</Border> </Border>
<Path x:Name="MainWindowCornerMaskOverlay"
Panel.ZIndex="3000"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Fill="{DynamicResource backgroundColor}"
IsHitTestVisible="False"
SnapsToDevicePixels="True" />
</Grid> </Grid>
</Window> </Window>

View File

@@ -2191,6 +2191,11 @@ namespace C4IT_CustomerPanel
MainWindowSurface.Clip = new RectangleGeometry(new Rect(0d, 0d, surfaceWidth, surfaceHeight), surfaceRadius, surfaceRadius); MainWindowSurface.Clip = new RectangleGeometry(new Rect(0d, 0d, surfaceWidth, surfaceHeight), surfaceRadius, surfaceRadius);
MainWindowContentRoot.Clip = new RectangleGeometry(new Rect(0d, 0d, contentWidth, contentHeight), contentRadius, contentRadius); MainWindowContentRoot.Clip = new RectangleGeometry(new Rect(0d, 0d, contentWidth, contentHeight), contentRadius, contentRadius);
if (MainWindowCornerMaskOverlay != null)
{
MainWindowCornerMaskOverlay.Data = CreateCornerOverflowMaskGeometry(surfaceWidth, surfaceHeight, surfaceRadius);
}
if (btnSP != null && btnSP.ActualWidth > 0d && btnSP.ActualHeight > 0d) if (btnSP != null && btnSP.ActualWidth > 0d && btnSP.ActualHeight > 0d)
{ {
btnSP.Clip = CreateBottomRoundedRectGeometry(btnSP.ActualWidth, btnSP.ActualHeight, contentRadius); btnSP.Clip = CreateBottomRoundedRectGeometry(btnSP.ActualWidth, btnSP.ActualHeight, contentRadius);
@@ -2224,6 +2229,22 @@ namespace C4IT_CustomerPanel
return geometry; return geometry;
} }
private static Geometry CreateCornerOverflowMaskGeometry(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 Geometry.Empty;
var fullRect = new RectangleGeometry(new Rect(0d, 0d, width, height));
var roundedRect = new RectangleGeometry(new Rect(0d, 0d, width, height), r, r);
var mask = new CombinedGeometry(GeometryCombineMode.Exclude, fullRect, roundedRect);
mask.Freeze();
return mask;
}
} }
public class cMainFunctionInfo public class cMainFunctionInfo