fix(ui): render rounded frame as explicit top overlay
This commit is contained in:
@@ -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, den Body-Host per Geometrie mit zum Innenradius passenden gerundeten unteren Ecken begrenzt, eine On-Top-Corner-Maske (`Rectangle - RoundedRectangle`) ergänzt und zusätzlich per Win32-Window-Region (`SetWindowRgn`) die Fensterkontur selbst auf Rundung 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, eine On-Top-Corner-Maske (`Rectangle - RoundedRectangle`) ergänzt, eine explizite On-Top-Rahmenkontur als `Path` ergänzt und zusätzlich per Win32-Window-Region (`SetWindowRgn`) die Fensterkontur selbst auf Rundung begrenzt (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
|
||||||
|
|||||||
@@ -357,7 +357,7 @@
|
|||||||
<Border x:Name="MainWindowSurface"
|
<Border x:Name="MainWindowSurface"
|
||||||
CornerRadius="20"
|
CornerRadius="20"
|
||||||
BorderThickness="1"
|
BorderThickness="1"
|
||||||
BorderBrush="{DynamicResource panelBorderColor}"
|
BorderBrush="Transparent"
|
||||||
Background="{DynamicResource backgroundColor}"
|
Background="{DynamicResource backgroundColor}"
|
||||||
SnapsToDevicePixels="True"
|
SnapsToDevicePixels="True"
|
||||||
ClipToBounds="True">
|
ClipToBounds="True">
|
||||||
@@ -1011,6 +1011,15 @@
|
|||||||
Fill="{DynamicResource backgroundColor}"
|
Fill="{DynamicResource backgroundColor}"
|
||||||
IsHitTestVisible="False"
|
IsHitTestVisible="False"
|
||||||
SnapsToDevicePixels="True" />
|
SnapsToDevicePixels="True" />
|
||||||
|
<Path x:Name="MainWindowFrameOverlay"
|
||||||
|
Panel.ZIndex="3001"
|
||||||
|
HorizontalAlignment="Left"
|
||||||
|
VerticalAlignment="Top"
|
||||||
|
Fill="Transparent"
|
||||||
|
Stroke="{DynamicResource panelBorderColor}"
|
||||||
|
StrokeThickness="1"
|
||||||
|
IsHitTestVisible="False"
|
||||||
|
SnapsToDevicePixels="True" />
|
||||||
</Grid>
|
</Grid>
|
||||||
</Window>
|
</Window>
|
||||||
|
|
||||||
|
|||||||
@@ -2211,6 +2211,11 @@ namespace C4IT_CustomerPanel
|
|||||||
MainWindowCornerMaskOverlay.Data = CreateCornerOverflowMaskGeometry(surfaceWidth, surfaceHeight, surfaceRadius);
|
MainWindowCornerMaskOverlay.Data = CreateCornerOverflowMaskGeometry(surfaceWidth, surfaceHeight, surfaceRadius);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (MainWindowFrameOverlay != null)
|
||||||
|
{
|
||||||
|
MainWindowFrameOverlay.Data = CreateFrameOverlayGeometry(surfaceWidth, surfaceHeight, surfaceRadius, 1d);
|
||||||
|
}
|
||||||
|
|
||||||
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);
|
||||||
@@ -2260,6 +2265,23 @@ namespace C4IT_CustomerPanel
|
|||||||
return mask;
|
return mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static Geometry CreateFrameOverlayGeometry(double width, double height, double radius, double strokeThickness)
|
||||||
|
{
|
||||||
|
if (width <= 0d || height <= 0d)
|
||||||
|
return Geometry.Empty;
|
||||||
|
|
||||||
|
double inset = Math.Max(0d, strokeThickness / 2d);
|
||||||
|
double frameWidth = Math.Max(0d, width - strokeThickness);
|
||||||
|
double frameHeight = Math.Max(0d, height - strokeThickness);
|
||||||
|
if (frameWidth <= 0d || frameHeight <= 0d)
|
||||||
|
return Geometry.Empty;
|
||||||
|
|
||||||
|
double frameRadius = Math.Max(0d, Math.Min(radius - inset, Math.Min(frameWidth / 2d, frameHeight / 2d)));
|
||||||
|
var frame = new RectangleGeometry(new Rect(inset, inset, frameWidth, frameHeight), frameRadius, frameRadius);
|
||||||
|
frame.Freeze();
|
||||||
|
return frame;
|
||||||
|
}
|
||||||
|
|
||||||
private void ApplyRoundedWindowRegion()
|
private void ApplyRoundedWindowRegion()
|
||||||
{
|
{
|
||||||
if (!IsLoaded || WindowState == WindowState.Minimized)
|
if (!IsLoaded || WindowState == WindowState.Minimized)
|
||||||
|
|||||||
Reference in New Issue
Block a user