diff --git a/TestProject.sln b/TestProject.sln new file mode 100644 index 0000000..4239e3e --- /dev/null +++ b/TestProject.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.11.35431.28 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestProject", "TestProject\TestProject.csproj", "{819BC87A-230C-488C-B5A2-050401FBF03D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {819BC87A-230C-488C-B5A2-050401FBF03D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {819BC87A-230C-488C-B5A2-050401FBF03D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {819BC87A-230C-488C-B5A2-050401FBF03D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {819BC87A-230C-488C-B5A2-050401FBF03D}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {95160B41-7027-401C-9FBC-8475F077EE81} + EndGlobalSection +EndGlobal diff --git a/TestProject/App.xaml b/TestProject/App.xaml new file mode 100644 index 0000000..d5a8267 --- /dev/null +++ b/TestProject/App.xaml @@ -0,0 +1,9 @@ + + + + + diff --git a/TestProject/App.xaml.cs b/TestProject/App.xaml.cs new file mode 100644 index 0000000..cbdd0a4 --- /dev/null +++ b/TestProject/App.xaml.cs @@ -0,0 +1,14 @@ +using System.Configuration; +using System.Data; +using System.Windows; + +namespace TestProject +{ + /// + /// Interaction logic for App.xaml + /// + public partial class App : Application + { + } + +} diff --git a/TestProject/AssemblyInfo.cs b/TestProject/AssemblyInfo.cs new file mode 100644 index 0000000..b0ec827 --- /dev/null +++ b/TestProject/AssemblyInfo.cs @@ -0,0 +1,10 @@ +using System.Windows; + +[assembly: ThemeInfo( + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] diff --git a/TestProject/Controller/MainController.cs b/TestProject/Controller/MainController.cs new file mode 100644 index 0000000..3e4d2d0 --- /dev/null +++ b/TestProject/Controller/MainController.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TestProject +{ + class MainController + { + //Liste der Karten + List KartenListe = new(); + //"View" + MainWindow mainWindow; + + //Hierbei handelt es sich um einen Konstruktor. Dieser wird immer beim Erstellen der Klasse mit new aufgerufen. Dieser Konstruktor will zusätzlich als Übergabewert das MainWindow haben. + public MainController(MainWindow mw) + { + //Setzen der "View", also des Hauptfensters + mainWindow = mw; + //Erstellen der Karten + KartenListe = Karte.GenerateCardPairs(5); + + //Einfügen der Karten in die GUI + mainWindow.InsertCardsIntoGui(KartenListe); + + + } + + //Diese Methode behandelt die Aktion, wenn ein User auf ein gewisses Element klickt. Dabei benötigt die Methode die individuelle ID der Karte. + public void ClickOnCard(int individualID) + { + //Zuerst suchen wir die Karte, zu der die ID gehört + Karte k = KartenListe.Where(k => k.IndividualID == individualID).ToList().First(); + //Dann ändern wir den Status ab + k.IsChecked = !k.IsChecked; + //Danach prüfen wir, ob Elemente rausgenommen werden müssen. + testCards(); + //Zum Schluss geben wir die neue Liste zur GUI, die diese dann aktualisiert + mainWindow.InsertCardsIntoGui(KartenListe); + } + + //Diese Methode überprüft, ob zwei gleiche Elemente ausgewählt sind und löscht diese dann aus der Liste. + void testCards() + { + //Zuerst holen wir uns alle Elemente, die gecheckt (ausgewählt) sind. + var checkedList = KartenListe.Where(k => k.IsChecked).ToList(); + //In dieser Liste sollen dann alle PairIDs stehen, die rausgelöscht werden sollen + List ints = new(); + //Mit der geschachtelten foreach-Schleife vergleichen wir alle Elemente miteinander und merken uns, wo beide Pairs gleich gleich waren + foreach (var element in checkedList) + foreach(var item in checkedList) + if(element.IndividualID != item.IndividualID && element.PairID == item.PairID) + ints.Add(item.PairID); + //Zum Schluss laufen wir durch alle Karten durch und löschen die jewiligen Pairs aus der Liste. + for (int i = 0; i < KartenListe.Count; i++) + if (ints.Contains(KartenListe[i].PairID)) + { + KartenListe.RemoveAt(i); + i--; + } + + } + + } +} diff --git a/TestProject/Karte.cs b/TestProject/Karte.cs new file mode 100644 index 0000000..fe76300 --- /dev/null +++ b/TestProject/Karte.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TestProject +{ + public class Karte + { + //Hier ist eine Liste der Bilder, die geladen werden können + private static List _sourceList = new() { @"C:\Users\s.schueler.doz\Pictures\image1.png", @"C:\Users\s.schueler.doz\Pictures\image2.jpg", @"C:\Users\s.schueler.doz\Pictures\image3.jpg", @"C:\Users\s.schueler.doz\Pictures\image4.jpg", @"C:\Users\s.schueler.doz\Pictures\image5.jpg" }; + + //Das ist das Bild des aktuellen Objekts + public string Bild { get; set; } + //Dies ist die individuelle ID jedes Objekts + public int IndividualID { get; set; } + //Zwei Paare besitzen die selbe PairID. + public int PairID { get; set; } + //Hier wird gesetzt, ob der User das Element ausgewählt hat, oder nicht + public bool IsChecked { get; set; } + + //Dieser Methode übergibt man eine Menge an Kartenpaaren, die man haben will. Dann bekommt man die Karten in einer Liste zurück. + public static List GenerateCardPairs(int amount) + { + //Wir erstellen zuerst eine neue Liste aus Karten + List CardList = new(); + //Das k brauchen wir für die einzigartige ID + int k = 0; + //Wir laufen dann so oft durch die Schleife und erstellen Elemente, je nachdem wie viele Paare der Aufrufer haben will + for (int i = 0; i < amount; i++) + { + //In jedem Durchlauf erstellen wir zwei neue Karten, mit derselben PairID und jeweils einer anderen individuellen ID. Mit dem Add fügen wir diese der Liste hinzu. + CardList.Add(new Karte { Bild = _sourceList[i], PairID = i, IndividualID = k }); + k++; + CardList.Add(new Karte { Bild = _sourceList[i], PairID = i, IndividualID = k }); + k++; + } + //Zum Schluss geben wir die Liste zurück. + return CardList; + } + } +} diff --git a/TestProject/MainWindow.xaml b/TestProject/MainWindow.xaml new file mode 100644 index 0000000..afbf889 --- /dev/null +++ b/TestProject/MainWindow.xaml @@ -0,0 +1,15 @@ + + + + + + + + diff --git a/TestProject/MainWindow.xaml.cs b/TestProject/MainWindow.xaml.cs new file mode 100644 index 0000000..8879779 --- /dev/null +++ b/TestProject/MainWindow.xaml.cs @@ -0,0 +1,83 @@ +using System.Text; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace TestProject +{ + /// + /// Interaction logic for MainWindow.xaml + /// + public partial class MainWindow : Window + { + MainController controller; + + public MainWindow() + { + InitializeComponent(); + //this ist immer das Objekt, indem man sich gerade befindet + controller = new(this); + } + + //Diese Methode fügt eine übergebene Liste von Karten in die GUI ein. + public void InsertCardsIntoGui(List cardList) + { + //Zuerst wird das Feld geleert + mainWrapPanel.Children.Clear(); + //Danach wird jedes übergebene Kartenobjekt in die GUI eingefügt + foreach (var element in cardList) + InsertKarteInGui(element); + } + + //Fügt die Karte in die GUI ein + void InsertKarteInGui(Karte k) + { + //Das ist der Rand außen rum, der für das Markieren zuständig ist + Border border = new(); + //Dies ist das Bild, das angezeigt wird + Image image = new(); + //Sollte das Objekt schon ausgewählt sein, muss man den Rahmen setzen + if (k.IsChecked) + { + border.BorderThickness = new(3); + border.BorderBrush = Brushes.Crimson; + //Hier wird das Bild gesetzt + var converter = new ImageSourceConverter(); + image.Source = (ImageSource)(converter.ConvertFromString(k.Bild) ?? new()); + } + else + { + //Hier wird die Rückseite gesetzt + var converter = new ImageSourceConverter(); + image.Source = (ImageSource)(converter.ConvertFromString(@"C:\Users\s.schueler.doz\Pictures\back.jpg") ?? new()); + } + //Hier wird das Event gesetzt, wenn wer auf das Bild klickt + image.MouseLeftButtonUp += Image_MouseLeftButtonUp; + //Hier werden die Höhe und die Seitenabstände definiert + image.Height = 100; + image.Margin = new(5); + //Hier wird die individuelle ID gesetzt + image.Tag = k.IndividualID; + //Der Border wird dann das Bild hinzugefügt + border.Child = image; + //Dem WrapPanel wird dann die Border hinzugefügt und somit in der GUI sichtbar + mainWrapPanel.Children.Add(border); + } + + //Behandelt den Klick auf eine Karte + private void Image_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) + { + //Wir holen und zuerst das Image + Image i = (Image)sender; + //Dann teilen wir dem Controller mit, dass auf dieses Objekt geklickt wurde. Dabei verwenden wir die individuelle ID aus dem Tag. + controller.ClickOnCard((int)i.Tag); + + } + } +} \ No newline at end of file diff --git a/TestProject/TestProject.csproj b/TestProject/TestProject.csproj new file mode 100644 index 0000000..e3e33e3 --- /dev/null +++ b/TestProject/TestProject.csproj @@ -0,0 +1,11 @@ + + + + WinExe + net8.0-windows + enable + enable + true + + +