diff --git a/Project_Periodensystem.Controller/PeriodensystemController.cs b/Project_Periodensystem.Controller/PeriodensystemController.cs
index e716743..ba6ece8 100644
--- a/Project_Periodensystem.Controller/PeriodensystemController.cs
+++ b/Project_Periodensystem.Controller/PeriodensystemController.cs
@@ -7,42 +7,21 @@ using Project_Periodensystem.Persistence;
namespace Project_Periodensystem.Controller
{
///
- /// Haupt-Controller für das Periodensystem - implementiert das MVC-Pattern
- ///
- /// ZWECK UND ARCHITEKTUR:
- /// - Zentrale Kontrollschicht zwischen View (UI) und Model/Persistence (Daten)
- /// - Koordiniert alle Geschäftslogik-Operationen für das Periodensystem
- /// - Delegiert komplexe Aufgaben an spezialisierte Helper-Klassen (Single Responsibility Principle)
- /// - Bietet eine einheitliche API für alle UI-Komponenten
- ///
- /// DESIGN PATTERN:
- /// - MVC (Model-View-Controller): Trennt Präsentation von Geschäftslogik
- /// - Delegation Pattern: Überträgt Verantwortlichkeiten an spezialisierte Klassen
- /// - Dependency Injection: Nimmt INavigationService als abhängige Komponente entgegen
- ///
- /// C# KONZEPTE:
- /// - Nullable Reference Types (INavigationService?, ElementValidator?)
- /// - LINQ für Datenoperationen (FirstOrDefault, Where, ToArray)
- /// - Exception Handling mit try-catch-Blöcken
- /// - Lambda Expressions für Delegation an Helper-Klassen
- /// - Tuple-Rückgabewerte für strukturierte Daten
+ /// Haupt-Controller für das Periodensystem - implementiert MVC-Pattern.
+ /// Koordiniert Geschäftslogik zwischen View und Model/Persistence.
+ /// Delegiert komplexe Aufgaben an spezialisierte Helper-Klassen.
///
public class PeriodensystemController
{
// ===== PRIVATE FELDER =====
///
- /// Zentrale Liste aller chemischen Elemente
- /// List<T> ermöglicht dynamisches Hinzufügen/Entfernen von Elementen
- /// Private Field mit Underscore-Notation (_elements) nach C#-Konvention
+ /// Liste aller chemischen Elemente
///
private List _elements = new List();
///
- /// Navigation Service für Seitenwechsel in der Avalonia-Anwendung
- /// Readonly: Kann nur im Konstruktor zugewiesen werden (Immutability)
- /// Nullable (?): Kann null sein, da Navigation optional ist
- /// Interface-basiert: Ermöglicht verschiedene Implementierungen (Dependency Inversion)
+ /// Navigation Service für Seitenwechsel (optional, da Interface-basiert)
///
private readonly INavigationService? _navigationService;
@@ -63,22 +42,8 @@ namespace Project_Periodensystem.Controller
private ElementStatistics? _statistics;
// ===== KONSTRUKTOR =====
-
///
- /// Konstruktor mit optionaler Dependency Injection
- ///
- /// PARAMETER:
- /// - navigationService: Optional (null by default), ermöglicht Navigation zwischen Seiten
- ///
- /// C# FEATURES:
- /// - Default Parameter (= null): Macht den Parameter optional
- /// - Nullable Reference Types: navigationService kann null sein
- /// - Constructor Chaining: Ruft LoadElements() zur Initialisierung auf
- ///
- /// ABLAUF:
- /// 1. Navigation Service speichern (kann null sein)
- /// 2. Elemente aus Persistence-Layer laden
- /// 3. Helper-Klassen mit geladenen Daten initialisieren
+ /// Konstruktor mit optionaler Navigation
///
public PeriodensystemController(INavigationService? navigationService = null)
{
@@ -86,52 +51,28 @@ namespace Project_Periodensystem.Controller
LoadElements(); // Daten sofort beim Erstellen laden
}
- // ===== PRIVATE INITIALISIERUNGSMETHODEN =====
-
///
- /// Lädt alle chemischen Elemente aus dem Persistence-Layer
- ///
- /// ZWECK:
- /// - Zentrale Initialisierung aller Elementdaten
- /// - Fehlerbehandlung beim Laden der Daten
- /// - Initialisierung der Helper-Klassen nach erfolgreichem Laden
- /// - Ausführliches Logging für Debugging und Monitoring
- ///
- /// C# KONZEPTE:
- /// - Exception Handling: try-catch für robuste Fehlerbehandlung
- /// - LINQ: Take(10) für die ersten 10 Elemente
- /// - Tuple Deconstruction: (totalElements, uniqueSeries, avgWeight) = GetStatistics()
- /// - Null-Conditional Operator: lightest?.Symbol verhindert NullReferenceException
- /// - String Interpolation: $"Text {variable}" für lesbare Ausgaben
- ///
- /// FEHLERBEHANDLUNG:
- /// - Bei Exceptions wird eine leere Liste initialisiert (Graceful Degradation)
- /// - Alle Fehler werden geloggt für spätere Analyse
+ /// Lädt alle chemischen Elemente und initialisiert Helper-Klassen
///
private void LoadElements()
{
try
{
- // Elemente aus DataManager laden (Persistence Layer)
+ // Elemente aus DataManager laden
_elements = DataManager.LoadElements();
- Logger.Log($"Controller: {_elements.Count} Elemente erfolgreich geladen (via DataManager)");
+ Logger.Log($"Controller: {_elements.Count} Elemente erfolgreich geladen");
- // Helper-Klassen mit den geladenen Daten initialisieren
- // Delegation Pattern: Spezialisierte Klassen für verschiedene Aufgaben
+ // Helper-Klassen initialisieren
_validator = new ElementValidator(_elements);
_statistics = new ElementStatistics(_elements);
- // ===== DEMONSTRATIVE LOGGING VON C#-FEATURES =====
-
- // Arrays: Alle Element-Symbole als Array
+ // Demonstrative Logging der geladenen Daten
var symbols = GetAllSymbols();
Logger.LogArray("Element-Symbole (erste 10)", symbols.Take(10).ToArray());
- // Tuples: Strukturierte Rückgabe mehrerer Werte
var (totalElements, uniqueSeries, avgWeight) = GetStatistics();
Logger.LogTuple("Statistiken", $"Elemente: {totalElements}, Serien: {uniqueSeries}, Ø-Gewicht: {avgWeight:F2}");
- // Tuples mit Objekten: Extremwerte finden
var (lightest, heaviest) = GetWeightExtremes();
if (lightest != null && heaviest != null)
{
diff --git a/Project_Periodensystem.Model/Elements.cs b/Project_Periodensystem.Model/Elements.cs
index 41fb3df..1ec3c2a 100644
--- a/Project_Periodensystem.Model/Elements.cs
+++ b/Project_Periodensystem.Model/Elements.cs
@@ -1,76 +1,25 @@
namespace Project_Periodensystem.Model
{
///
- /// Repräsentiert ein chemisches Element im Periodensystem
- ///
- /// ZWECK UND DATENMODELL:
- /// - Zentrale Datenstruktur für alle Elementinformationen
- /// - Kapselt alle relevanten chemischen Eigenschaften
- /// - Bildet die Grundlage für Periodensystem-Darstellung und -Berechnungen
- ///
- /// DESIGN PRINCIPLES:
- /// - Data Transfer Object (DTO): Reine Datenklasse ohne Geschäftslogik
- /// - Immutable nach Konstruktion: Alle Properties haben nur Setter (könnten readonly sein)
- /// - Rich Object: Enthält alle relevanten Eigenschaften in einer Klasse
- ///
- /// C# KONZEPTE:
- /// - Auto-Properties: { get; set; } automatische Getter/Setter
- /// - Constructor mit mehreren Parametern: Vollständige Initialisierung
- /// - Value Types (int, double): Primitive Datentypen für Zahlen
- /// - Reference Types (string): Referenzdatentypen für Text
- ///
- /// VERWENDUNG IM PERIODENSYSTEM:
- /// - Gespeichert in List<Element> Collections
- /// - Sortiert nach AtomicNumber für Periodensystem-Darstellung
- /// - Gruppiert nach Series für chemische Klassifizierung
- /// - Positioniert nach Row/Column im UI-Grid
+ /// Repräsentiert ein chemisches Element im Periodensystem.
+ /// Zentrale Datenstruktur für alle Elementinformationen und -eigenschaften.
///
public class Element
{
// ===== IDENTIFIKATIONS-EIGENSCHAFTEN =====
///
- /// Ordnungszahl (Protonenzahl) des Elements
- ///
- /// CHEMISCHE BEDEUTUNG:
- /// - Eindeutige Identifikation jedes Elements (1-118)
- /// - Bestimmt Position im Periodensystem
- /// - Entspricht der Anzahl Protonen im Atomkern
- ///
- /// BEISPIELE:
- /// - 1 = Wasserstoff (H)
- /// - 6 = Kohlenstoff (C)
- /// - 79 = Gold (Au)
+ /// Ordnungszahl (Protonenzahl) des Elements - eindeutige Identifikation (1-118)
///
public int AtomicNumber { get; set; }
///
- /// Chemisches Symbol (Kurzbezeichnung) des Elements
- ///
- /// KONVENTIONEN:
- /// - 1-2 Buchstaben, erster Buchstabe groß
- /// - Oft lateinischen/griechischen Ursprungs
- /// - International standardisiert (IUPAC)
- ///
- /// BEISPIELE:
- /// - "H" = Hydrogen (Wasserstoff)
- /// - "Au" = Aurum (Gold)
- /// - "Fe" = Ferrum (Eisen)
+ /// Chemisches Symbol (z.B. H, C, Au) - kurze Bezeichnung (1-2 Buchstaben)
///
public string Symbol { get; set; }
///
/// Vollständiger wissenschaftlicher Name des Elements
- ///
- /// NAMENSGEBUNG:
- /// - Offizielle IUPAC-Bezeichnung
- /// - Meist englische Namen in der internationalen Wissenschaft
- /// - Historische, mythologische oder wissenschaftliche Herkunft
- ///
- /// BEISPIELE:
- /// - "Hydrogen" (griechisch: Wasser-bildend)
- /// - "Californium" (nach Kalifornien benannt)
- /// - "Einsteinium" (nach Albert Einstein)
///
public string ElementName { get; set; }
@@ -78,154 +27,62 @@ namespace Project_Periodensystem.Model
///
/// Relative Atommasse in atomaren Masseneinheiten (u)
- ///
- /// CHEMISCHE BEDEUTUNG:
- /// - Durchschnittliche Masse aller Isotope eines Elements
- /// - Gewichtet nach natürlicher Häufigkeit der Isotope
- /// - Basis für stöchiometrische Berechnungen
- ///
- /// EINHEIT: u (atomic mass unit)
- /// - 1 u ≈ 1.66054 × 10⁻²⁷ kg
- /// - Relative Skala (Kohlenstoff-12 = 12.000 u)
- ///
- /// BEISPIELE:
- /// - Wasserstoff: ~1.008 u
- /// - Kohlenstoff: ~12.011 u
- /// - Uran: ~238.029 u
///
public double AtomicWeight { get; set; }
///
- /// Elektronegativität nach Pauling-Skala
- ///
- /// CHEMISCHE BEDEUTUNG:
- /// - Fähigkeit eines Atoms, Bindungselektronen anzuziehen
- /// - Bestimmt Art der chemischen Bindung (ionisch vs. kovalent)
- /// - Wichtig für Vorhersage chemischer Reaktionen
- ///
- /// PAULING-SKALA:
- /// - Dimensionslose Größe von 0.7 bis 4.0
- /// - Fluor hat den höchsten Wert (4.0)
- /// - Trends: Steigt in Perioden von links nach rechts
- ///
- /// BEISPIELE:
- /// - Fluor: 4.0 (höchste Elektronegativität)
- /// - Sauerstoff: 3.5
- /// - Wasserstoff: 2.1
- /// - Cäsium: 0.7 (niedrigste)
+ /// Elektronegativität nach Pauling-Skala (0.7 bis 4.0)
///
public double Electronegativity { get; set; }
///
/// Dichte bei Standardbedingungen in g/cm³
- ///
- /// PHYSIKALISCHE BEDEUTUNG:
- /// - Masse pro Volumeneinheit
- /// - Abhängig von Atomgröße und Kristallstruktur
- /// - Wichtig für technische Anwendungen
- ///
- /// TRENDS IM PERIODENSYSTEM:
- /// - Generell zunehmend mit steigender Ordnungszahl
- /// - Maximum bei Osmium (~22.6 g/cm³)
- /// - Gase haben sehr geringe Dichten
- ///
- /// BEISPIELE:
- /// - Wasserstoff (Gas): ~0.0000899 g/cm³
- /// - Wasser (Referenz): 1.0 g/cm³
- /// - Gold: ~19.3 g/cm³
- /// - Osmium: ~22.6 g/cm³ (dichtestes Element)
///
public double Density { get; set; }
// ===== KLASSIFIKATIONS-EIGENSCHAFTEN =====
///
- /// Chemische Serie/Gruppe des Elements
- ///
- /// KLASSIFIKATION:
- /// - Gruppiert Elemente nach ähnlichen chemischen Eigenschaften
- /// - Basis für Periodensystem-Farben und -Organisation
- /// - Ermöglicht Vorhersage chemischen Verhaltens
- ///
- /// WICHTIGE SERIEN:
- /// - "Alkali metal": Li, Na, K, Rb, Cs, Fr (sehr reaktiv)
- /// - "Noble gas": He, Ne, Ar, Kr, Xe, Rn (inert)
- /// - "Halogen": F, Cl, Br, I, At (7 Valenzelektronen)
- /// - "Transition metal": Fe, Cu, Au, etc. (d-Block)
- /// - "Lanthanoid": Seltene Erden (f-Block)
- ///
- /// UI-VERWENDUNG:
- /// - Farbkodierung im Periodensystem
- /// - Filterung und Gruppierung
- /// - Tooltip-Informationen
+ /// Chemische Serie/Gruppe für Klassifikation und UI-Farbkodierung
///
public string Series { get; set; }
- // ===== POSITIONIERUNGS-EIGENSCHAFTEN =====
-
///
- /// Zeile (Periode) im Periodensystem
- ///
- /// CHEMISCHE BEDEUTUNG:
- /// - Entspricht der Anzahl Elektronenschalen
- /// - Bestimmt vertikale Position im Periodensystem
- /// - 1-7 für natürliche Elemente
- ///
- /// TRENDS:
- /// - Atomradius nimmt innerhalb einer Periode ab
- /// - Ionisierungsenergie steigt innerhalb einer Periode
+ /// Zeile (Periode) im Periodensystem (1-7)
///
public int Row { get; set; }
///
- /// Spalte (Gruppe) im Periodensystem
- ///
- /// CHEMISCHE BEDEUTUNG:
- /// - Entspricht der Anzahl Valenzelektronen (vereinfacht)
- /// - Bestimmt horizontale Position im Periodensystem
- /// - 1-18 nach IUPAC-Nummerierung
- ///
- /// TRENDS:
- /// - Elemente derselben Gruppe haben ähnliche Eigenschaften
- /// - Chemische Reaktivität folgt Gruppenmustern
+ /// Spalte (Gruppe) im Periodensystem (1-18)
///
public int Column { get; set; }
// ===== KONSTRUKTOR =====
///
- /// Vollständiger Konstruktor für die Erstellung eines Element-Objekts
- ///
- /// ZWECK:
- /// - Stellt sicher, dass alle Eigenschaften beim Erstellen gesetzt werden
- /// - Verhindert unvollständig initialisierte Element-Objekte
- /// - Ermöglicht direkte Erstellung aus Datenquellen (CSV, JSON, Database)
- ///
- /// C# KONZEPTE:
- /// - Constructor Overloading: Könnte mehrere Konstruktoren haben
- /// - Parameter Validation: Könnte Validierung der Eingabewerte enthalten
- /// - Immutable Object: Nach Konstruktion unveränderlich (wenn Properties readonly wären)
- ///
- /// PARAMETER:
- /// - Alle 9 Eigenschaften müssen beim Erstellen angegeben werden
- /// - Reihenfolge entspricht logischer Gruppierung (ID, Name, Physik, Position)
- ///
- /// VERWENDUNG:
- /// var hydrogen = new Element(1, "H", "Hydrogen", 1.008, 2.1, 0.0000899, "Nonmetal", 1, 1);
+ /// Konstruktor - erstellt Element-Objekt mit allen erforderlichen Eigenschaften
///
+ /// Ordnungszahl (1-118)
+ /// Chemisches Symbol (z.B. "H", "Au")
+ /// Vollständiger Elementname
+ /// Atommasse in u
+ /// Elektronegativität (Pauling-Skala)
+ /// Dichte in g/cm³
+ /// Chemische Serie/Gruppe
+ /// Periodensystem-Zeile
+ /// Periodensystem-Spalte
public Element(int atomicNumber, string symbol, string elementname, double atomicWeight,
double electronegativity, double density, string series, int row, int column)
{
- // Eigenschafts-Zuweisungen mit Selbst-Dokumentation
- AtomicNumber = atomicNumber; // Eindeutige Identifikation
- Symbol = symbol; // Kurze chemische Bezeichnung
- ElementName = elementname; // Vollständiger Name
- AtomicWeight = atomicWeight; // Relative Atommasse
- Electronegativity = electronegativity; // Bindungsverhalten
- Density = density; // Physikalische Eigenschaft
- Series = series; // Chemische Klassifikation
- Row = row; // Periodensystem-Position vertikal
- Column = column; // Periodensystem-Position horizontal
+ AtomicNumber = atomicNumber;
+ Symbol = symbol;
+ ElementName = elementname;
+ AtomicWeight = atomicWeight;
+ Electronegativity = electronegativity;
+ Density = density;
+ Series = series;
+ Row = row;
+ Column = column;
}
}
}
diff --git a/Project_Periodensystem.View/MainWindow.axaml.cs b/Project_Periodensystem.View/MainWindow.axaml.cs
index 491bb3f..3b84f95 100644
--- a/Project_Periodensystem.View/MainWindow.axaml.cs
+++ b/Project_Periodensystem.View/MainWindow.axaml.cs
@@ -6,26 +6,43 @@ using Project_Periodensystem.Controller;
namespace Project_Periodensystem.View
{
///
- /// MainWindow mit sauberem MVC-Pattern und Interface-basierter Navigation
+ /// Hauptfenster der Avalonia-Anwendung - implementiert MVC-Pattern.
+ /// Koordiniert NavigationService und PeriodensystemController.
+ /// Löst zirkuläre Abhängigkeiten durch zweistufige Initialisierung.
///
public partial class MainWindow : Window
{
+ ///
+ /// Hauptbereich für Seitenwechsel zwischen PeriodicTablePage, AboutPage, etc.
+ ///
private ContentControl? mainContent;
+
+ ///
+ /// Zentrale Geschäftslogik für Periodensystem-Daten und -Operationen
+ ///
private readonly PeriodensystemController _dataController;
+
+ ///
+ /// Service für Navigation zwischen verschiedenen Anwendungsseiten
+ ///
private readonly NavigationService _navigationService;
+ ///
+ /// Konstruktor - initialisiert Avalonia-Komponenten und MVC-Architektur
+ ///
public MainWindow()
{
- InitializeComponent();
+ InitializeComponent(); // Avalonia UI initialisieren
mainContent = this.FindControl("MainContent");
- // Erstelle Navigation Service mit this (MainWindow)
+ // Zweistufige Initialisierung wegen zirkulärer Abhängigkeiten:
+ // 1. NavigationService mit MainWindow erstellen
_navigationService = new NavigationService(this);
- // Controller mit Navigation Service initialisieren (Dependency Injection)
+ // 2. Controller mit NavigationService erstellen
_dataController = new PeriodensystemController(_navigationService);
- // Data Controller an Navigation Service setzen
+ // 3. Controller an NavigationService zurückgeben (löst Zirkularität)
_navigationService.SetDataController(_dataController);
// Landing Page anzeigen
diff --git a/Project_Periodensystem.View/NavigationService.cs b/Project_Periodensystem.View/NavigationService.cs
index 9468956..6cc3cf0 100644
--- a/Project_Periodensystem.View/NavigationService.cs
+++ b/Project_Periodensystem.View/NavigationService.cs
@@ -8,130 +8,48 @@ using Project_Periodensystem.Controller;
namespace Project_Periodensystem.View
{
///
- /// Concrete Implementation des Navigation Service für Avalonia UI
- ///
- /// ZWECK UND ARCHITEKTUR:
- /// - Implementiert INavigationService Interface aus dem Controller-Layer
- /// - Trennt sauber "WAS navigiert wird" (Controller) von "WIE navigiert wird" (View)
- /// - Kapselt alle Avalonia-spezifische Navigation-Logik
- /// - Ermöglicht verschiedene UI-Frameworks ohne Controller-Änderungen
- ///
- /// DESIGN PATTERNS:
- /// - Interface Implementation: Konkrete Umsetzung der abstrakten Navigation
- /// - Dependency Injection: MainWindow wird von außen injiziert
- /// - Facade Pattern: Vereinfacht komplexe UI-Navigation für Controller
- /// - Bridge Pattern: Verbindet Controller (Abstraktion) mit View (Implementation)
- ///
- /// C# KONZEPTE:
- /// - Interface Implementation: public class NavigationService : INavigationService
- /// - Constructor Injection: MainWindow als Dependency
- /// - Null-Conditional Checks: Robuste Parameter-Validierung
- /// - Exception Handling: Try-Catch für alle UI-Operationen
- /// - Method Delegation: Weiterleitung von Interface-Aufrufen an UI-Code
- ///
- /// AVALONIA-INTEGRATION:
- /// - MainWindow.Content: Zentrale Inhaltsbereich für Page-Wechsel
- /// - UserControl-basierte Pages: PeriodicTablePage, AboutPage, LandingPage
- /// - Theme-Management: Avalonia Application Resources
- /// - Application.Current: Globaler Zugriff auf App-Instance
- ///
- /// ZIRKULÄRE ABHÄNGIGKEITEN:
- /// - Problem: Controller braucht NavigationService, NavigationService braucht Controller
- /// - Lösung: Zweistufige Initialisierung mit SetDataController()
- /// - Constructor nimmt MainWindow, SetDataController() löst Zirkularität auf
+ /// Implementiert die Navigation zwischen verschiedenen Seiten der Avalonia-Anwendung.
+ /// Trennt die Navigation-Logik (WAS) vom UI-Framework (WIE) durch Interface-Implementation.
+ /// Löst zirkuläre Abhängigkeiten durch zweistufige Initialisierung.
///
public class NavigationService : INavigationService
{
// ===== PRIVATE FELDER =====
///
- /// Referenz zum Hauptfenster der Avalonia-Anwendung
- ///
- /// ZWECK:
- /// - Zentrale Kontrolle über den Hauptinhaltsbereich
- /// - Zugriff auf MainWindow.Content für Page-Wechsel
- /// - Window-Eigenschaften (Titel, Größe, etc.) ändern
- ///
- /// C# KONZEPTE:
- /// - Readonly Field: Kann nur im Konstruktor gesetzt werden
- /// - Reference Type: Hält Verweis auf MainWindow-Objekt
- /// - Encapsulation: Private field mit controlled access
+ /// Referenz zum Hauptfenster für Navigation zwischen Seiten
///
private readonly MainWindow _mainWindow;
///
- /// Referenz zum Data Controller (für Daten-Zugriff)
- ///
- /// ZWECK:
- /// - Navigation-Pages benötigen Zugriff auf Element-Daten
- /// - Vermeidung direkter Model/Persistence-Zugriffe aus View
- /// - Konsistente Daten-API für alle UI-Komponenten
- ///
- /// ZIRKULÄRE ABHÄNGIGKEIT:
- /// - Controller erstellt NavigationService
- /// - NavigationService braucht Controller für Daten
- /// - Lösung: Nullable field + SetDataController() nach Konstruktion
+ /// Data Controller für Datenzugriff (wird nach Konstruktion gesetzt)
///
private PeriodensystemController? _dataController;
// ===== KONSTRUKTOR UND INITIALISIERUNG =====
///
- /// Konstruktor mit Dependency Injection des MainWindow
- ///
- /// ZWECK:
- /// - Initialisiert Navigation Service mit UI-Kontext
- /// - Stellt sicher, dass MainWindow verfügbar ist
- /// - Validiert kritische Dependencies
- ///
- /// C# KONZEPTE:
- /// - Constructor Dependency Injection: MainWindow als Parameter
- /// - ArgumentNullException: Robuste Parameter-Validierung
- /// - Null-Coalescing Throw: mainWindow ?? throw new ArgumentNullException()
- /// - Self-Documenting Code: Logging der Initialisierung
- ///
- /// PARAMETER-VALIDIERUNG:
- /// - Null-Check mit Exception: Verhindert spätere NullReferenceExceptions
- /// - Early Fail Principle: Probleme sofort erkennbar
- /// - Descriptive Exception: nameof() für präzise Fehlermeldung
+ /// Initialisiert den NavigationService mit dem Hauptfenster
///
/// Das Hauptfenster der Avalonia-Anwendung
- /// Wenn mainWindow null ist
public NavigationService(MainWindow mainWindow)
{
_mainWindow = mainWindow ?? throw new ArgumentNullException(nameof(mainWindow));
- Logger.Log("NavigationService initialisiert - implementiert Interface-basierte Navigation");
+ Logger.Log("NavigationService initialisiert");
}
///
/// Setzt den Data Controller nach der Konstruktion (löst zirkuläre Abhängigkeit)
- ///
- /// ZWECK:
- /// - Zweistufige Initialisierung zur Auflösung zirkulärer Dependencies
- /// - Ermöglicht Controller-Access für datenabhängige Navigation
- /// - Trennt UI-Initialisierung von Daten-Initialisierung
- ///
- /// ZIRKULÄRES ABHÄNGIGKEITS-PROBLEM:
- /// 1. MainWindow erstellt PeriodensystemController
- /// 2. Controller braucht NavigationService (this)
- /// 3. NavigationService braucht Controller für Daten
- /// 4. Lösung: Controller nach NavigationService-Konstruktion setzen
- ///
- /// C# KONZEPTE:
- /// - Two-Phase Construction: Konstruktor + Setter für komplexe Dependencies
- /// - Null-Conditional Assignment: _dataController wird aus null zu gültigem Objekt
- /// - Method Chaining möglich: SetDataController() könnte 'this' zurückgeben
///
/// Der PeriodensystemController für Datenzugriff
- /// Wenn dataController null ist
public void SetDataController(PeriodensystemController dataController)
{
_dataController = dataController ?? throw new ArgumentNullException(nameof(dataController));
- Logger.Log("DataController in NavigationService gesetzt - zirkuläre Abhängigkeit aufgelöst");
+ Logger.Log("DataController in NavigationService gesetzt");
}
///
- /// Navigation zum Periodensystem (Interface Implementation)
+ /// Navigation zum Periodensystem - zeigt PeriodicTablePage im MainContent an
///
public void NavigateToPeriodicTable()
{
@@ -143,9 +61,11 @@ namespace Project_Periodensystem.View
return;
}
+ // PeriodicTablePage erstellen und Controller setzen
var periodicTablePage = new PeriodicTablePage();
periodicTablePage.SetController(_dataController);
+ // MainContent Control finden und neue Seite anzeigen
var mainContent = _mainWindow.FindControl("MainContent");
if (mainContent != null)
{
@@ -164,7 +84,7 @@ namespace Project_Periodensystem.View
}
///
- /// Navigation zur About-Seite (Interface Implementation)
+ /// Navigation zur About-Seite - zeigt Projektinformationen und Credits
///
public void NavigateToAbout()
{
@@ -176,9 +96,11 @@ namespace Project_Periodensystem.View
return;
}
+ // AboutPage erstellen und Controller setzen
var aboutPage = new AboutPage();
aboutPage.SetController(_dataController);
+ // MainContent Control finden und neue Seite anzeigen
var mainContent = _mainWindow.FindControl("MainContent");
if (mainContent != null)
{
@@ -197,7 +119,7 @@ namespace Project_Periodensystem.View
}
///
- /// Navigation zur Landing Page (Interface Implementation)
+ /// Navigation zur Landing Page - Startseite der Anwendung
///
public void NavigateToLanding()
{
@@ -209,9 +131,11 @@ namespace Project_Periodensystem.View
return;
}
+ // LandingPage erstellen und Controller setzen
var landingPage = new LandingPage();
landingPage.SetController(_dataController);
+ // MainContent Control finden und neue Seite anzeigen
var mainContent = _mainWindow.FindControl("MainContent");
if (mainContent != null)
{
@@ -230,7 +154,7 @@ namespace Project_Periodensystem.View
}
///
- /// Theme-Wechsel (Interface Implementation)
+ /// Wechselt zwischen Dark- und Light-Theme der Avalonia-Anwendung
///
public void ToggleTheme()
{
@@ -239,14 +163,16 @@ namespace Project_Periodensystem.View
var app = Application.Current;
if (app != null)
{
+ // Aktuelles Theme ermitteln und umschalten
var currentTheme = app.ActualThemeVariant;
var newTheme = currentTheme == Avalonia.Styling.ThemeVariant.Dark
? Avalonia.Styling.ThemeVariant.Light
: Avalonia.Styling.ThemeVariant.Dark;
+ // Neues Theme anwenden
app.RequestedThemeVariant = newTheme;
- // Settings speichern
+ // Theme-Einstellung persistent speichern
var settings = new AppSettings
{
LastTheme = newTheme.ToString() ?? "Dark",
@@ -265,14 +191,14 @@ namespace Project_Periodensystem.View
}
///
- /// Export-Bestätigung anzeigen (Interface Implementation)
+ /// Zeigt eine Export-Bestätigung an (aktuell nur Logging)
///
public void ShowExportConfirmation()
{
try
{
Logger.Log("NavigationService: Export-Bestätigung angezeigt");
- // Hier könnte ein Dialog oder Notification angezeigt werden
+ // TODO: Hier könnte ein Dialog oder Notification angezeigt werden
}
catch (Exception ex)
{