Winforms Control oder gleich WPF lernen

  • C#

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von rykoJLL.

    Winforms Control oder gleich WPF lernen

    Guten Abend/Morgen VBP-Community,
    Ich bin gerade dabei ein Tool zu schreiben,welches mir meine Projekte zwischen USB und PC Synchronisiert. Ich bin soweit, dass das auslesen der Projekt Ordner soweit klappt. Habe mir dazu natürlich ein Paar Klassen geschrieben. Eine Klasse die Eigenschaften der Projekte hält, eine workaround Klasse die ich schreiben musste,weil sich FileInfo Objekte sich nicht mit nem XMLSerializer Serialisieren lassen und ne Config Klasse, die Einstellungen durch Serialisierung speichert und ausliest. Ursprünglich wollte ich dann eine List<Project> an die Listbox binden und hab deshalb auch die ToString Methode überschrieben. Bei der Listbox fehlt mir aber die Funktion, ein Item auszuklappen und z.B. die in dem Projekt Ordner liegend Files aufzulisten. Keine Ahnung ob sich das mithilfe von nem Usercontrol lösen lässt,deshalb war mein zweiter Gedanke WPF zu lernen, zu dem es eigentlich auch mal Zeit ist. Die Frage ist, wenn ich nun auf WPF umstelle, muss ich dann meine ganze Klassen Struktur umwerfen? So ein Control ,bei dem sich die Items ausklappen lassen und weitere Subitems auflisten lässt ist in WPF doch recht einfach umsetzten? Wie groß ist dabei der Lern Aufwand,wenn man sich an Winforms gewöhnt hat?

    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. namespace Proj_Synchron
    6. {
    7. //FileInfo wont serialize because it has no parameterless constructor,so im using this class instead
    8. public class ConfigFileInfo
    9. {
    10. private string name;
    11. public string Name
    12. {
    13. get { return name; }
    14. set { name = value; }
    15. }
    16. private string fullname;
    17. public string Fullname
    18. {
    19. get { return fullname; }
    20. set { fullname = value; }
    21. }
    22. private long length;
    23. public long Length
    24. {
    25. get { return length; }
    26. set { length = value; }
    27. }
    28. public ConfigFileInfo(string cname, string cfullname,long clength)
    29. {
    30. this.Name = cname;
    31. this.Fullname = cfullname;
    32. this.Length = clength;
    33. }
    34. //Empty Constructor for Serializing
    35. public ConfigFileInfo()
    36. {
    37. }
    38. }
    39. }


    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.IO;
    6. namespace Proj_Synchron
    7. {
    8. public class Project
    9. {
    10. private string projname;
    11. private DateTime lastchanged;
    12. private int filecount;
    13. private List<ConfigFileInfo> files;
    14. private string projectfullpath;
    15. public string ProjectName
    16. {
    17. get { return projname; }
    18. set { projname = value; }
    19. }
    20. public DateTime LastChanged
    21. {
    22. get { return lastchanged; }
    23. set { lastchanged = value; }
    24. }
    25. public int Filecount
    26. {
    27. get { return filecount; }
    28. set { filecount = value; }
    29. }
    30. public List<ConfigFileInfo> ProjectFiles
    31. {
    32. get { return files; }
    33. set { files = value; }
    34. }
    35. public string ProjectFullPath
    36. {
    37. get { return projectfullpath; }
    38. set { projectfullpath = value; }
    39. }
    40. public Project(string Projectname,string Projectfullpath,List<ConfigFileInfo> ProjectFiles,int Filecount,DateTime LastChanged)
    41. {
    42. this.ProjectName = Projectname;
    43. this.ProjectFullPath = Projectfullpath;
    44. this.ProjectFiles = ProjectFiles;
    45. this.Filecount = Filecount;
    46. this.LastChanged = LastChanged;
    47. }
    48. //Empty Constructor for Serializing
    49. public Project()
    50. {
    51. }
    52. public override string ToString()
    53. {
    54. return this.ProjectName;
    55. }
    56. }
    57. }
    Also zunächst mal die Klassenstruktur musst du natürlich nicht verwerfen, höchstens etwas anpassen. Du hast damit praktisch schon ein schönes Model erstellt, fehlen also nur noch ViewModel und View (ich spreche hier übrigens vom in WPF üblichen MVVM-Pattern). Und wenn du bisher auch noch nicht viel an der WinForms-GUI gemacht hast, dann solltest du nicht viel Verlust haben.
    Und zum Control, klar wäre das in WPF einfach, nur musst du wissen, dass WPF an sich nicht einfach ist. Wenn mans kann gibt es einem viele tolle neue Möglichkeiten, aber man muss es eben auch können. Letzendlich kann ich nicht wirklich sagen, ob du umsteigen solltest oder nicht, das musst du ganz alleine entscheiden. Ein solches Control in WinForms zu erstellen wäre aber auch nicht gerade die einfachste Aufgabe, da könntest du auch schon mal ein Weilchen dran sitzen.
    Was du hier beschreibst, erinnert mich viel eher an ein TreeView-Control als an eine Listbox. Du kannst das TreeView-Control bestimmt auch selbst zeichnen und es wie eine Listbox aussehen lassen, falls du bei WinForms bleibst.

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Tag Artentus,
    danke für die Antwort. Natürlich kann ich momentan mit Sachen MVVM- Pattern und der gleichen nur recht wenig, bis garnichts Anfangen, da ich mich nur Oberflächlich mit WPF auseinander gesetzt habe,aber schon mal gut zu wissen,dass ich nicht alles Neu machen muss. WPF scheint hier halt eine gute Lösung, wegen der Control Templates.

    @vbchecker
    Ja das TreeView hatte ich auch schon im Gedanken,jedoch kann ich daran keine List<T> binden und ich müsste mich wieder zwecks einem Workaround Informieren.

    rykoJLL schrieb:

    Control Templates
    Hier wären es DataTemplates. :)

    Du kannst es auch mit vb-checkers Methode versuchen, das könnte sogar funktionieren, wäre aber vermutlich auch nicht wirklich einfacher, als das Control selbst zu erstellen. In WPF schaffst dus wahrscheinlich (ohne es ausprobiert zu haben) mit <50 Zeilen XAML (außer du willst die Controls auch noch umstylen).
    Ich kann aber wie gesagt nicht beurteilen, ob oder wie leicht dir WPF fallen wird. probier einfach mal ein paar Kleinigkeiten damit aus, dann kannst du selbst entscheiden, ob du dir das zumuten willst oder nicht.

    rykoJLL schrieb:

    Ja das TreeView hatte ich auch schon im Gedanken,jedoch kann ich daran keine List<T> binden und ich müsste mich wieder zwecks einem Workaround Informieren.

    Wenn du SubItems darstellen willst, reicht eine normale List(Of T) doch eh nicht aus, da die sowas nicht abbilden kann. Das TreeView wirst du daher wohl selbst befüllen müssen samt SubItems.

    Wenn es doch DataBinding sein soll, schau dir evtl dies an:
    Data Binding TreeView in C#
    Hierarchical TreeView control with data binding enabled

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Das erste Control sieht ja schon mal echt gut aus.Danke für den Link. Das werde ich jetzt erstmal nutzten und mich dann aber trotzdem mit WPF beschäftigen.
    Danke euch beiden und en schönes Wochenende noch :)