Kommentare

This commit is contained in:
Tikkinger 2025-06-27 23:52:00 +02:00
parent 16fcf6ce53
commit 73bd118e8b
18 changed files with 182 additions and 86 deletions

View File

@ -3,15 +3,19 @@ using AquaCare.Persistence;
namespace AquaCare.Controller
{
// Controller-Klasse für die Verwaltung und Speicherung von Pflegemaßnahmen und Messwerten
public class PflegeController
{
// Referenz auf die Datenbank
private readonly Datenbank _db;
// Konstruktor: Übergibt die Datenbankinstanz
public PflegeController(Datenbank db)
{
_db = db;
}
// Speichert einen neuen Pflege- bzw. Werte-Eintrag in der Datenbank
public bool SavePflegeTask(DateTime datum, bool gefuettert, bool filterReinigen,
bool wasserWechseln, double temperatur, double phWert, double nitrat, double ammoniak)
{
@ -29,15 +33,16 @@ namespace AquaCare.Controller
Ammoniak = ammoniak
};
_db.AddValue(wert);
_db.AddValue(wert); // Eintrag in die Datenbank speichern
return true;
}
catch
{
return false;
return false; // Fehler beim Speichern
}
}
// Gibt alle gespeicherten Werte als Liste zurück
public List<Werte> GetAllWerte()
{
return _db.GetValuesAsObjects();

View File

@ -3,15 +3,19 @@ using AquaCare.Persistence;
namespace AquaCare.Controller
{
// Controller-Klasse für das Laden der gespeicherten Werte aus der Datenbank
public class WerteController
{
// Referenz auf die Datenbank
private readonly Datenbank _db;
// Konstruktor: Übergibt die Datenbankinstanz
public WerteController(Datenbank db)
{
_db = db;
}
// Lädt alle gespeicherten Werte als Liste
public List<Werte> LoadWerte()
{
return _db.GetValuesAsObjects();

View File

@ -1,14 +1,23 @@
namespace AquaCare.Model
{
// Modellklasse für einen Messwert- bzw. Pflegeeintrag
public class Werte
{
// Datum und Uhrzeit des Eintrags
public DateTime Datum { get; set; }
// Wurde gefüttert?
public bool Gefuettert { get; set; }
// Wurde der Filter gereinigt?
public bool FilterReinigen { get; set; }
// Wurde Wasser gewechselt?
public bool WasserWechseln { get; set; }
// Temperatur in °C
public double Temperatur { get; set; }
// pH-Wert
public double PhWert { get; set; }
// Nitratwert in mg/l
public double Nitrat { get; set; }
// Ammoniakwert in mg/l
public double Ammoniak { get; set; }
}
}

View File

@ -1,14 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">
<!--
Projektdatei für das AquaCare.Persistence-Projekt.
Enthält Einstellungen für das Ziel-Framework, Nullable, Projektabhängigkeiten und NuGet-Pakete.
-->
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<Nullable>enable</Nullable>
</PropertyGroup>
<!-- Verweis auf das Model-Projekt -->
<ItemGroup>
<ProjectReference Include="..\AquaCare.Model\AquaCare.Model.csproj" />
</ItemGroup>
<!-- NuGet-Paket für SQLite-Datenbankzugriff -->
<ItemGroup>
<PackageReference Include="Microsoft.Data.Sqlite" Version="8.0.0" />
</ItemGroup>

View File

@ -6,24 +6,30 @@ using AquaCare.Model;
namespace AquaCare.Persistence
{
// Klasse für den Datenbankzugriff (SQLite)
public class Datenbank
{
// Pfad zum Ordner, in dem die Datenbank liegt
private static readonly string PersistencePath = Path.GetDirectoryName(
typeof(Datenbank).Assembly.Location) ?? throw new InvalidOperationException("Assembly location not found");
// Pfad zur SQLite-Datenbankdatei
private static readonly string DbPath = Path.Combine(
PersistencePath,
"..", "..", "..", "..",
"AquaCare.Persistence",
"AquaCareDatenbank.db");
// Verbindungszeichenfolge für SQLite
private string ConnectionString => $"Data Source={DbPath}";
// Konstruktor: Prüft, ob die Datenbank existiert, und legt sie ggf. an
public Datenbank()
{
EnsureDatabaseExists();
}
// Stellt sicher, dass die Datenbank und der Ordner existieren
private void EnsureDatabaseExists()
{
var directory = Path.GetDirectoryName(DbPath);
@ -38,6 +44,7 @@ namespace AquaCare.Persistence
}
}
// Legt eine neue Datenbank mit der Tabelle "Werte" an
private void InitializeNewDatabase()
{
using var connection = new SqliteConnection(ConnectionString);
@ -58,6 +65,7 @@ namespace AquaCare.Persistence
command.ExecuteNonQuery();
}
// Fügt einen neuen Werte-Datensatz in die Datenbank ein
public void AddValue(Werte wert)
{
using var connection = new SqliteConnection(ConnectionString);
@ -85,6 +93,7 @@ namespace AquaCare.Persistence
command.ExecuteNonQuery();
}
// Gibt alle Werte als Liste von Objekten zurück
public List<Werte> GetValuesAsObjects()
{
var werte = new List<Werte>();

View File

@ -4,15 +4,19 @@ using Avalonia.Markup.Xaml;
namespace AquaCare.View;
// Einstiegspunkt für die Avalonia-Anwendung
public partial class App : Application
{
// Initialisiert die Anwendung und lädt die XAML-Ressourcen
public override void Initialize()
{
AvaloniaXamlLoader.Load(this);
}
// Wird nach Abschluss der Framework-Initialisierung aufgerufen
public override void OnFrameworkInitializationCompleted()
{
// Setzt das Hauptfenster, wenn die Anwendung als klassische Desktop-App läuft
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
desktop.MainWindow = new MainWindow();

View File

@ -8,37 +8,34 @@
<AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault>
</PropertyGroup>
<!-- NuGet-Pakete für Avalonia, Datenbank und MessageBox -->
<ItemGroup>
<PackageReference Include="Avalonia" Version="11.3.0" />
<PackageReference Include="Avalonia.Controls.DataGrid" Version="11.3.0" />
<PackageReference Include="Avalonia.Desktop" Version="11.3.0" />
<PackageReference Include="Avalonia.Themes.Fluent" Version="11.3.0" />
<PackageReference Include="Avalonia.Fonts.Inter" Version="11.3.0" />
<PackageReference Include="Avalonia.Diagnostics" Version="11.3.0">
<IncludeAssets Condition="'$(Configuration)' != 'Debug'">None</IncludeAssets>
<PrivateAssets Condition="'$(Configuration)' != 'Debug'">All</PrivateAssets>
</PackageReference>
<PackageReference Include="MessageBox.Avalonia" Version="3.2.0" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.5" />
</ItemGroup>
<PackageReference Include="Avalonia" Version="11.3.0" />
<PackageReference Include="Avalonia.Controls.DataGrid" Version="11.3.0" />
<PackageReference Include="Avalonia.Desktop" Version="11.3.0" />
<PackageReference Include="Avalonia.Themes.Fluent" Version="11.3.0" />
<PackageReference Include="Avalonia.Fonts.Inter" Version="11.3.0" />
<PackageReference Include="Avalonia.Diagnostics" Version="11.3.0">
<IncludeAssets Condition="'$(Configuration)' != 'Debug'">None</IncludeAssets>
<PrivateAssets Condition="'$(Configuration)' != 'Debug'">All</PrivateAssets>
</PackageReference>
<PackageReference Include="MessageBox.Avalonia" Version="3.2.0" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.5" />
</ItemGroup>
<!-- Verweise auf andere Projekte der Lösung -->
<ItemGroup>
<ProjectReference Include="..\AquaCare.Controller\AquaCare.Controller.csproj" />
<ProjectReference Include="..\AquaCare.Model\AquaCare.Model.csproj" />
</ItemGroup>
<!-- Einbindung von Ressourcen (Bilder, Icons, etc.) -->
<ItemGroup>
<AvaloniaResource Include="Ressourcen\**" />
</ItemGroup>
<!-- Einbindung der zentralen Style-Datei -->
<ItemGroup>
<AvaloniaResource Include="Style.xaml" />
</ItemGroup>
</Project>

View File

@ -2,11 +2,13 @@ using Avalonia.Controls;
namespace AquaCare.View
{
// Fenster für die Einstellungen der Anwendung
public partial class EinstellungenWindow : Window
{
// Konstruktor: Initialisiert das Einstellungsfenster
public EinstellungenWindow()
{
InitializeComponent();
InitializeComponent(); // Initialisiert die UI-Komponenten
}
}
}

View File

@ -1,3 +1,7 @@
<!--
Hauptfenster der Anwendung.
Zeigt einen Willkommensbildschirm mit Hintergrundbild, Einstellungen-Button und zentralen Navigationsbuttons.
-->
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="AquaCare.View.MainWindow"
@ -6,12 +10,12 @@
Icon="Ressourcen/Bilder/ProgrammIcon.ico">
<Grid>
<!-- Hintergrundbild für das Hauptfenster -->
<Grid.Background>
<ImageBrush Source="avares://AquaCare.View/Ressourcen/Bilder/WillkommenHintergrund.png" Stretch="UniformToFill"/>
</Grid.Background>
<!-- Grid-Aufteilung -->
<!-- Grid-Aufteilung für Layout -->
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
@ -21,35 +25,34 @@
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!-- Button oben links (Einstellungen)-->
<Button Classes="ImageButton" Click="buttonEinstellungenClick" Width="100" Height="100">
<Image Source="avares://AquaCare.View/Ressourcen/Bilder/EinstellungenImage.png"
HorizontalAlignment="Center" VerticalAlignment="Center" Stretch="Fill"/>
</Button>
<!-- Button oben links (Einstellungen) -->
<Button Classes="ImageButton" Click="buttonEinstellungenClick" Width="100" Height="100">
<Image Source="avares://AquaCare.View/Ressourcen/Bilder/EinstellungenImage.png"
HorizontalAlignment="Center" VerticalAlignment="Center" Stretch="Fill"/>
</Button>
<!-- Zentrierter Inhalt -->
<!-- Zentrierter Inhalt: Überschrift und Navigationsbuttons -->
<StackPanel Grid.Row="1" Grid.ColumnSpan="2"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Spacing="30">
<!-- Überschrift -->
<TextBlock Text="Willkommen bei AquaCare" HorizontalAlignment="Center" Classes="ÜberschriftText"/>
<!-- Button für Pflegemaßnahmen -->
<Button Classes="ImageButton" Click="buttonPflegeClick" Width="300" Height="100" HorizontalAlignment="Center">
<Image Source="avares://AquaCare.View/Ressourcen/Bilder/pflegebutton.png"
HorizontalAlignment="Center" VerticalAlignment="Center" Stretch="Fill"/>
</Button>
<!-- Button für Werteübersicht -->
<Button Classes="ImageButton" Click="buttonWerteClick" Width="300" Height="100" HorizontalAlignment="Center">
<Image Source="avares://AquaCare.View/Ressourcen/Bilder/wertebutton.png"
HorizontalAlignment="Center" VerticalAlignment="Center" Stretch="Fill"/>
</Button>
<!-- Button für Tutorials -->
<Button Classes="ImageButton" Click="buttonTutorialsClick" Width="300" Height="100" HorizontalAlignment="Center">
<Image Source="avares://AquaCare.View/Ressourcen/Bilder/tutorialsbutton.png"
HorizontalAlignment="Center" VerticalAlignment="Center" Stretch="Fill"/>

View File

@ -5,37 +5,41 @@ using AquaCare.View;
namespace AquaCare.View
{
// Hauptfenster der Anwendung Einstiegspunkt für den Nutzer
public partial class MainWindow : Window
{
// Konstruktor: Initialisiert das Hauptfenster
public MainWindow()
{
InitializeComponent();
}
// Öffnet das Fenster für Pflegemaßnahmen
private void buttonPflegeClick(object? sender, RoutedEventArgs e)
{
var pflegeWindow = new PflegeWindow();
pflegeWindow.ShowDialog(this);
}
// Öffnet das Fenster zur Anzeige der Messwerte
private void buttonWerteClick(object? sender, RoutedEventArgs e)
{
var werteWindow = new WerteWindow(); // Neues Werte-Fenster instanziieren
werteWindow.ShowDialog(this); // Fenster als Dialog öffnen
}
// Öffnet das Fenster für Tutorials
private void buttonTutorialsClick(object? sender, RoutedEventArgs e)
{
var tutorialsWindow = new TutorialsWindow();
tutorialsWindow.ShowDialog(this); // Dialog für Tutorial-Fenster
}
// Öffnet ein einfaches Einstellungsfenster (Platzhalter)
private void buttonEinstellungenClick(object? sender, RoutedEventArgs e)
{
var dialog = new Window { Title = "Einstellungen" };
dialog.ShowDialog(this);
}
}
}

View File

@ -1,3 +1,7 @@
<!--
Fenster zur Eingabe und Speicherung von Pflegemaßnahmen und Messwerten.
Enthält Felder für Datum, Checkboxen für Aktionen, Eingabefelder für Werte und einen Speichern-Button.
-->
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/express/blend/2008"
@ -7,54 +11,55 @@
Width="600" Height="500"
Icon="Ressourcen/Bilder/ProgrammIcon.ico">
<Grid>
<!-- Hintergrundbild ins äußere Grid verschieben -->
<!-- Hintergrundbild für das Fenster -->
<Grid.Background>
<ImageBrush Source="avares://AquaCare.View/Ressourcen/Bilder/PflegeHintergrund.png"
Stretch="Fill"/>
</Grid.Background>
<!-- Haupt-Grid für die Eingabefelder und Buttons -->
<Grid RowDefinitions="Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto"
ColumnDefinitions="Auto,*"
Margin="20"
RowSpacing="10"
ColumnSpacing="20">
<!-- Datum -->
<!-- Datumsauswahl -->
<TextBlock Text="Datum:" Grid.Row="0" Grid.Column="0" VerticalAlignment="Center"/>
<DatePicker x:Name="DatumPicker" Width="300" Grid.Row="0" Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<!-- Gefüttert -->
<!-- Checkbox: Gefüttert -->
<TextBlock Text="Gefüttert:" Grid.Row="1" Grid.Column="0" VerticalAlignment="Center"/>
<CheckBox x:Name="GefuettertCheckBox" Grid.Row="1" Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<!-- Filter reinigen -->
<!-- Checkbox: Filter gereinigt -->
<TextBlock Text="Filter gereinigt:" Grid.Row="2" Grid.Column="0" VerticalAlignment="Center"/>
<CheckBox x:Name="FilterReinigenCheckBox" Grid.Row="2" Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<!-- Wasser wechseln -->
<!-- Checkbox: Wasser gewechselt -->
<TextBlock Text="Wasser gewechselt:" Grid.Row="3" Grid.Column="0" VerticalAlignment="Center"/>
<CheckBox x:Name="WasserWechselnCheckBox" Grid.Row="3" Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<!-- Temperatur -->
<!-- Eingabefeld: Temperatur -->
<TextBlock Text="Temperatur (°C):" Grid.Row="4" Grid.Column="0" VerticalAlignment="Center"/>
<TextBox x:Name="TemperaturBox" Height="30" Grid.Row="4" Grid.Column="1" Width="100"/>
<!-- pH-Wert -->
<!-- Eingabefeld: pH-Wert -->
<TextBlock Text="pH-Wert:" Grid.Row="5" Grid.Column="0" VerticalAlignment="Center"/>
<TextBox x:Name="PhBox" Grid.Row="5" Grid.Column="1" Width="100"/>
<!-- Nitrat -->
<!-- Eingabefeld: Nitrat -->
<TextBlock Text="Nitrat (mg/l):" Grid.Row="6" Grid.Column="0" VerticalAlignment="Center"/>
<TextBox x:Name="NitratBox" Grid.Row="6" Grid.Column="1" Width="100"/>
<!-- Ammoniak -->
<!-- Eingabefeld: Ammoniak -->
<TextBlock Text="Ammoniak (mg/l):" Grid.Row="7" Grid.Column="0" VerticalAlignment="Center"/>
<TextBox x:Name="AmmoniakBox" Grid.Row="7" Grid.Column="1" Width="100"/>
<!-- Speichern-Button -->
<Button Content="Speichern" Grid.Row="8" Grid.Column="1" Margin="0,20,0,0" HorizontalAlignment="Right" Click="SaveClick"/>
</Grid>
<!-- Mindestbreite für die zweite Spalte -->
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>

View File

@ -8,25 +8,31 @@ using System;
namespace AquaCare.View
{
// Fenster zur Eingabe und Speicherung von Pflegemaßnahmen und Messwerten
public partial class PflegeWindow : Window
{
// Controller für die Logik und Datenzugriffe
private readonly PflegeController _controller;
// Konstruktor: Initialisiert das Fenster und den Controller
public PflegeWindow()
{
InitializeComponent();
_controller = new PflegeController(new Datenbank());
InitializeComponent(); // Initialisiert die UI-Komponenten
_controller = new PflegeController(new Datenbank()); // Erstellt Controller mit Datenbank
}
// Initialisiert die XAML-Komponenten
private void InitializeComponent()
{
AvaloniaXamlLoader.Load(this);
}
// Event-Handler für den Speichern-Button
private void SaveClick(object? sender, RoutedEventArgs e)
{
try
{
// Prüft, ob alle Felder korrekt ausgefüllt sind und Werte gültig sind
if (DatumPicker.SelectedDate.HasValue &&
double.TryParse(TemperaturBox.Text, out double temperatur) &&
double.TryParse(PhBox.Text, out double phWert) &&
@ -39,6 +45,7 @@ namespace AquaCare.View
return;
}
// Speichert die Werte über den Controller
var success = _controller.SavePflegeTask(
DatumPicker.SelectedDate.Value.DateTime,
GefuettertCheckBox.IsChecked ?? false,
@ -54,7 +61,7 @@ namespace AquaCare.View
{
Console.WriteLine("Erfolg: Werte erfolgreich gespeichert.");
// Eingabefelder zurücksetzen
// Setzt die Eingabefelder zurück
DatumPicker.SelectedDate = null;
GefuettertCheckBox.IsChecked = false;
FilterReinigenCheckBox.IsChecked = false;
@ -80,9 +87,10 @@ namespace AquaCare.View
}
}
// Event-Handler für den Abbrechen-Button
private void CancelClick(object? sender, RoutedEventArgs e)
{
Close();
Close(); // Schließt das Fenster
}
}
}

View File

@ -1,6 +1,11 @@
<Style xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!--
Style.xaml: Zentrale Datei für das Aussehen der Anwendung.
Enthält globale Styles für Buttons, TextBlöcke und Fenster.
-->
<!-- Allgemeiner Button-Style -->
<Style Selector="Button">
<Setter Property="FontSize" Value="30"/>
@ -13,7 +18,7 @@
<Setter Property="CornerRadius" Value="10"/> <!-- Fügt abgerundete Ecken hinzu -->
</Style>
<!-- Image Button-Style -->
<!-- Style für Buttons, die nur ein Bild enthalten -->
<Style Selector="Button.ImageButton">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderThickness" Value="0"/>
@ -38,7 +43,7 @@
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
<!--Default Hintergrundfarbe-->
<!-- Standard-Hintergrundfarbe für Fenster -->
<Style Selector="Window">
<Setter Property="Background" Value="#1E1E1E"/>
</Style>

View File

@ -1,3 +1,7 @@
<!--
Fenster zur Anzeige von Schritt-für-Schritt-Tutorials.
Enthält Auswahl-Buttons, ein Bildfeld, einen Hinweistext, Bildnavigation und einen Schließen-Button.
-->
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="AquaCare.View.TutorialsWindow"
@ -6,40 +10,43 @@
Icon="Ressourcen/Bilder/ProgrammIcon.ico">
<Grid>
<!-- Hintergrundbild für das Fenster -->
<Grid.Background>
<ImageBrush Source="avares://AquaCare.View/Ressourcen/Bilder/TutorialsHintergrund.png" Stretch="UniformToFill"/>
</Grid.Background>
<!-- Zeilenaufteilung für Überschrift, Buttons und Inhalt -->
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/> <!-- Überschrift (optional) -->
<RowDefinition Height="Auto"/> <!-- Buttons -->
<RowDefinition Height="Auto"/> <!-- Hauptinhalt -->
</Grid.RowDefinitions>
<!-- Buttons für Tutorials -->
<!-- Buttons für die Auswahl des Tutorials -->
<StackPanel Grid.Row="1"
Orientation="Horizontal"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Margin="0,5,0,0"> <!-- Unteres Margin reduziert -->
Margin="0,5,0,0">
<Button Content="Fische füttern" Width="300" Height="50" Click="FischeFütternClick"/>
<Button Content="Wasser wechseln" Width="300" Height="50" Click="WasserWechselnClick"/>
<Button Content="Filter reinigen" Width="300" Height="50" Click="FilterReinigenClick"/>
</StackPanel>
<!-- Inhalte mittig -->
<!-- Hauptinhalt: Bild, Text, Navigation -->
<StackPanel Grid.Row="2"
HorizontalAlignment="Center"
VerticalAlignment="Top"
Spacing="2">
<!-- StackPanel für Tutorial-Inhalt -->
<!-- Tutorial-Inhalt: Bild und Hinweistext -->
<StackPanel Orientation="Vertical" HorizontalAlignment="Center" Spacing="5">
<!-- Container für Bild und initialen Text -->
<Grid Height="450" Width="500" Margin="0,0,0,0"> <!-- Höhe reduziert -->
<Grid Height="450" Width="500" Margin="0,0,0,0">
<!-- Bildanzeige für das Tutorial -->
<Image x:Name="tutorialImage"
Stretch="Uniform"
IsVisible="False"/>
<!-- Hinweistext, wenn kein Tutorial ausgewählt ist -->
<TextBlock x:Name="initialText"
Text="Wähle oben, was du nicht kannst!"
FontSize="30"
@ -48,19 +55,20 @@
VerticalAlignment="Center"/>
</Grid>
<!-- Bildindex-Text -->
<!-- Anzeige des aktuellen Bildindexes -->
<TextBlock x:Name="imageIndexTextBlock"
Text=""
FontSize="18"
HorizontalAlignment="Center"
Margin="0,2,0,2"/> <!-- Margins reduziert -->
Margin="0,2,0,2"/>
<!-- Navigation unter dem Bild -->
<!-- Navigations-Buttons unter dem Bild -->
<StackPanel Orientation="Vertical" HorizontalAlignment="Center" Spacing="5">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Spacing="10">
<Button Content="Zurück" Click="PreviousImageClick" />
<Button Content="Weiter" Click="NextImageClick" />
</StackPanel>
<!-- Schließen-Button -->
<Button Content="Schließen"
Click="CloseClick"
Width="200"

View File

@ -6,13 +6,19 @@ using System;
namespace AquaCare.View
{
// Fenster zur Anzeige von Schritt-für-Schritt-Tutorials mit Bildern
public partial class TutorialsWindow : Window
{
// Liste der Bildpfade für das aktuelle Tutorial
private List<string> _images;
// TextBlock zur Anzeige des aktuellen Bildindexes
private TextBlock? _imageIndexTextBlock;
// TextBlock für den Starttext
private TextBlock? _initialText;
// Index des aktuell angezeigten Bildes
private int _currentImageIndex;
// Dictionary mit der Anzahl der Bilder pro Tutorial-Ordner
private readonly Dictionary<string, int> _imageCountPerFolder = new()
{
{"Fische füttern", 3},
@ -20,17 +26,20 @@ namespace AquaCare.View
{"Filter reinigen", 8}
};
// Konstruktor: Initialisiert das Fenster und sucht die UI-Elemente
public TutorialsWindow()
{
InitializeComponent();
InitializeComponent(); // Initialisiert die UI-Komponenten
_images = new List<string>();
// Sucht die Textblöcke anhand ihres Namens in der XAML
_imageIndexTextBlock = this.Find<TextBlock>("imageIndexTextBlock")
?? throw new InvalidOperationException("imageIndexTextBlock not found");
_initialText = this.Find<TextBlock>("initialText")
?? throw new InvalidOperationException("initialText not found");
}
// Lädt die Bilder für das gewählte Tutorial
private void LoadTutorialImages(string folderName)
{
if (_initialText == null || tutorialImage == null) return;
@ -51,6 +60,7 @@ namespace AquaCare.View
UpdateTutorialContent();
}
// Aktualisiert das angezeigte Bild und den Index-Text
private void UpdateTutorialContent()
{
try
@ -77,6 +87,7 @@ namespace AquaCare.View
}
}
// Navigiert zum nächsten oder vorherigen Bild
private void NavigateImages(bool forward)
{
if (forward)
@ -90,7 +101,7 @@ namespace AquaCare.View
UpdateTutorialContent();
}
// Event Handler
// Event Handler für die Tutorial-Auswahl
private void FischeFütternClick(object? sender, RoutedEventArgs e)
=> LoadTutorialImages("Fische füttern");
@ -100,12 +111,14 @@ namespace AquaCare.View
private void FilterReinigenClick(object? sender, RoutedEventArgs e)
=> LoadTutorialImages("Filter reinigen");
// Event Handler für die Navigation durch die Bilder
private void NextImageClick(object? sender, RoutedEventArgs e)
=> NavigateImages(true);
private void PreviousImageClick(object? sender, RoutedEventArgs e)
=> NavigateImages(false);
// Event Handler zum Schließen des Fensters
private void CloseClick(object? sender, RoutedEventArgs e)
=> Close();
}

View File

@ -1,3 +1,7 @@
<!--
Fenster zur Anzeige der Messwerte.
Enthält eine Überschrift, Beispielwerte, eine Liste, ein DataGrid und einen Schließen-Button.
-->
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="AquaCare.View.WerteWindow"
@ -6,15 +10,16 @@
Icon="Ressourcen/Bilder/ProgrammIcon.ico">
<Grid>
<!-- Hintergrundbild für das Fenster -->
<Grid.Background>
<ImageBrush Source="avares://AquaCare.View/Ressourcen/Bilder/WerteHintergrund.png" Stretch="UniformToFill"/>
</Grid.Background>
<!-- Zeilenaufteilung: Überschrift, Hauptinhalt, Schließen-Button -->
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/> <!-- Überschrift -->
<RowDefinition Height="*"/> <!-- Hauptinhalt -->
<RowDefinition Height="*"/> <!-- Hauptinhalt (Beispielwerte + DataGrid) -->
<RowDefinition Height="Auto"/> <!-- Schließen-Button -->
</Grid.RowDefinitions>
<!-- Überschrift -->
@ -24,21 +29,24 @@
HorizontalAlignment="Center"
Margin="0,10,0,10"/>
<!-- Hauptinhalt -->
<!-- Hauptinhalt: Beispielwerte und DataGrid -->
<StackPanel Grid.Row="1" Margin="20" Spacing="10">
<ListBox x:Name="ValuesList" Grid.Row="1" Margin="20" />
<!-- Beispielwerte -->
<TextBlock Text="Temperatur: 25°C" FontSize="18"/>
<TextBlock Text="pH-Wert: 7.5" FontSize="18"/>
<TextBlock Text="Nitrat: 10 mg/L" FontSize="18"/>
<TextBlock Text="Ammoniak: 0 mg/L" FontSize="18"/>
<Grid>
<DataGrid x:Name="WerteDataGrid" AutoGenerateColumns="True" />
</Grid>
<!-- Schließen-Button -->
<Button Content="Schließen" HorizontalAlignment="Center" Width="100" Click="CloseWindowClick"/>
<!-- DataGrid -->
<DataGrid x:Name="WerteDataGrid"
AutoGenerateColumns="True"
Margin="0,10,0,0"/>
</StackPanel>
<!-- Schließen-Button immer ganz unten -->
<Button Grid.Row="2"
Content="Schließen"
HorizontalAlignment="Center"
Margin="0,10,0,10"
Click="CloseWindowClick"/>
</Grid>
</Window>

View File

@ -6,36 +6,42 @@ using System;
namespace AquaCare.View
{
// Fenster zur Anzeige und Verwaltung von Messwerten
public partial class WerteWindow : Window
{
// Controller für die Logik und Datenzugriffe
private readonly WerteController _controller;
// Konstruktor: Initialisiert das Fenster und lädt die Daten
public WerteWindow()
{
InitializeComponent();
_controller = new WerteController(new Datenbank());
LoadData();
InitializeComponent(); // Initialisiert die UI-Komponenten
_controller = new WerteController(new Datenbank()); // Erstellt Controller mit Datenbank
LoadData(); // Lädt die Messwerte
}
// Lädt die Messwerte aus der Datenbank und bindet sie an das DataGrid
private void LoadData()
{
try
{
var werte = _controller.LoadWerte();
var werte = _controller.LoadWerte(); // Holt die Werte aus dem Controller
WerteDataGrid.ItemsSource = werte; // Bindet die Werte an das DataGrid
}
catch (Exception ex)
{
// Gibt eine Fehlermeldung aus, falls das Laden fehlschlägt
Console.WriteLine($"Fehler beim Laden der Werte: {ex.Message}");
}
}
// Event-Handler zum Schließen des Fensters
private void CloseWindowClick(object? sender, RoutedEventArgs e)
{
// Direkte Benutzerinteraktion ohne MessageBox
// Hinweis für den Benutzer (hier nur Konsolenausgabe)
Console.WriteLine("Möchten Sie das Fenster wirklich schließen? (Ja/Nein)");
// Simuliere eine Benutzeraktion (z. B. durch eine UI-Komponente oder Konsoleninteraktion)
// Simuliert eine Benutzerbestätigung (hier immer 'Ja')
bool userConfirmed = true; // Setze dies basierend auf der Benutzeraktion
if (userConfirmed)