WPF - Wie geht das?

  • WPF

Es gibt 30 Antworten in diesem Thema. Der letzte Beitrag () ist von KingTimon.

    WPF - Wie geht das?

    Hi Leute,

    ich hab mir vorgenommen, meine Software (VocTrainor) komplett neu zu entwickeln und das nach zahlreichen Tipps mit WPF.
    Ich hab im Internet bzw im Forum schon danach gesucht, hab auch vieles gefunden, nur habe ich genau 0 Vorahnung in diesem Bereich und deswegen ist es sehr schwierig für mich, mich hier richtig zu informieren.
    Ich habe bereits herausgefunden, dass bei WPF von Events abgeraten wird, und man stattdessen Bindings verwenden soll, dass WPF den Code und das Design von einander strikt trenne will, und dass das ganze in xaml (oder so ähnlich) geschrieben wird.

    Also habe ich erstmal ein neues WPF-Projekt erstellt, mich ein bisschen mit dem Designer herumgespielt. Wie gesagt, ich habe gelesen, dass man statt Events sogenannte "Bindings" verwenden soll. Ich hab nur leider keine Ahnung was das ist und wie man diese verwendet. Kann mir das jemand, der sich gut auskennt, kurz erklären? Wäre wirklich sehr toll!

    MFG
    Ich schau mir das grad alles an, puh klingt ziemlich kompliziert...

    Funktioniert es theoretisch, dass man Events benutzt? Denn wenn ich ein Control doppelklicke dann bekomm ich wie bei Windows Forms ein Event.

    MFG
    Events funktionieren ja aber man sollte lieber mit dem MVVM-Prinzip arbeiten (also Databinding, ViewModels, etc...)

    Heißt du packst den Code nicht da im Codebehind rein sondern erstellst eine eigene Klasse für das ViewModel und bindest dann z.B die Command-Property vom Button an die ICommand-Variable im im ViewModel.
    Hier ein kleines Beispiel:

    XML-Quellcode

    1. <Window DataContext="{x:Static local:MainViewModel.Instance}">
    2. <-- ... --!>
    3. <Button x:Name="ButtonName" Content="Hallo Welt!" Command="{Binding HelloWorldCommand}" />


    im ViewModel:

    C#-Quellcode

    1. public ICommand HelloWorldCommand {get; private set;}
    2. private static MainViewModel _instance;
    3. public static MainViewModel Instance {
    4. get { return _instance ?? (_instance = new MainViewModel()); }
    5. }
    6. private MainViewModel() {
    7. HelloWorldCommand = new RelayCommand(HelloWorldVoid, true);
    8. }
    9. private void HelloWorldVoid() {
    10. // Tu was
    11. }


    bzw. in VB .NET übersetzt:

    VB.NET (Übersetzt mit Telerik Code Converter)

    VB.NET-Quellcode

    1. Private Shared _instance As MainViewModel
    2. Public Shared ReadOnly Property Instance() As MainViewModel
    3. Get
    4. Return If(_instance, (InlineAssignHelper(_instance, New MainViewModel())))
    5. End Get
    6. End Property
    7. Public Property HelloWorldCommand() As ICommand
    8. Get
    9. Return m_HelloWorldCommand
    10. End Get
    11. Private Set
    12. m_HelloWorldCommand = Value
    13. End Set
    14. End Property
    15. Private m_HelloWorldCommand As ICommand
    16. Private Sub New()
    17. HelloWorldCommand = New RelayCommand(AddressOf HelloWorldVoid, True)
    18. End Sub
    19. Private Sub HelloWorldVoid()
    20. ' Tu was
    21. End Sub

    KaskadekingDE on GitHub :)
    Bitte keine Fragen über Programmierung per PN! Dafür ist das Forum hier.

    Who cares? ¯\_(ツ)_/¯
    Auch wenn ichs noch nicht ganz kapiere, @KaskadekingDE danke für die Erklärung!
    Vlt bin ich heute einfach schon zu müde. Auf jeden Fall noch einmal, danke!

    MFG
    Mein Visual Studio kennt weder "InligneAssignhelper" noch "RelayCommand"^^
    Muss ich einen Verweis hinzufügen? Wenn ja, welchen?

    MFG
    Die RelayCommand-Klasse findest du in meinem Tutorial.
    InlineAssignHelper musst du ebenfalls selbst implementieren, die Funktion ersetzt die Mehrfachzuweisungen aus C# (in Zeile 5 im C#-Code bzw. Zeile 4 im Vb-Code wird gleichzeitig etwas zugewiesen und zurückgegeben). Der Code ist aber sehr simpel, ungefähr so sollte es sein:

    VB.NET-Quellcode

    1. ​Public Shared Function InlineAssignHelper(Of T)(ByRef destination As T, value As T) As T
    2. destination = value
    3. Return value
    4. End Function

    Oder aber du änderst einfach Zeile 4 so ab, dass du die Funktion gar nicht brauchst:

    VB.NET-Quellcode

    1. ​if _instance Is Nothing Then _instance = new MainViewModel()
    2. Return _instance
    @Artentus danke dir :)

    Darf ich den von dir geposteten Code in deinem Tutorial bezüglich der RelayCommand-Klasse verwenden?

    @KaskadekingDE

    Heißt das soviel, wie ich brauche jedesmal, für das ich in Windows-Forms ein Event brauchte, diesen ganzen Code? Da kommt dann doch um einiges mehr Code zustande, oder? Zahlt es sich überhaupt aus, mit diesen Bindings zu arbeiten? Mir komme Zweifel auf...

    KaskadekingDE schrieb:

    VB.NET-Quellcode

    1. Public Property HelloWorldCommand() As ICommand
    2. Get
    3. Return m_HelloWorldCommand
    4. End Get
    5. Private Set
    6. m_HelloWorldCommand = Value
    7. End Set
    8. End Property
    9. Private m_HelloWorldCommand As ICommand
    10. Private Sub New()
    11. HelloWorldCommand = New RelayCommand(AddressOf HelloWorldVoid, True)
    12. End Sub
    13. Private Sub HelloWorldVoid()
    14. ' Tu was
    15. End Sub

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „KingTimon“ ()

    KingTimon schrieb:

    Heißt das soviel, wie ich brauche jedesmal, für das ich in Windows-Forms ein Event brauchte, diesen ganzen Code?
    Naja, es geht auch mit weniger Umständen.
    Guck einfach die Tuts im Wpf-Tut-Bereich durch. Zumindest in meinen Tuts stolperst du auf Schritt und Tritt über RelayCommands.
    Ich habe übrigens eine etwas annere Implementation als Artentus, und du kannst auch die InterAction-Dll mit Nuget runterladen - da ist ein sog. "DelegateCommand" drinne, was dasselbe ist.
    Mehr dazu wird glaub im CodeBehind-Tut erwähnt.

    Jdfs. mein Umgang mit meine RelayCommands ist vlt. bischen schlampig (huch - sie sind nicht Readonly!), aber dafür handle ich solch mit einem Einzeiler ab. :P

    Immer feste die Tuts gucken - ohne bist du glaub ziemlich verloren.

    Annere Frage ist noch: Wie speicherst du die VocTrainer-Daten? typisiertes Dataset? Entity-Framework? iwas selbstgebasteltes?
    Besser ich frag nochmal nach, bevor ich Probleme bekomm ;) Danke dir auf jeden Fall!
    @ErfinderDesRades ich versuche schon seit 1, 2 Tagen, mich im Bereich WPF, sowohl in den Tipps und Tricks sowohl auch eigentlich im ganzen Forum zu recherchieren. Nur ist es ziemlich schwierig, wenn mir jede Art von Grundlage fehlt.
    Nuget hab ich nicht.

    Die Daten speichere ich bisher in .ini-Dateien. Ich werde aber höchstwahrscheinlich auf XML umsteigen. Hab ich auch noch nie gemacht, aber hab schon einen Ansatz^^

    Eine Frage am Rande: Gibt es bei WPF noch Vorteile, abgesehen von der Trennung zwischen Designer und Code?

    MFG
    @Artentus: Also ich meine, KaskadeKings Code würde sich bei mir auf einen Einzeiler reduzieren:
    KaskadeKings Code

    VB.NET-Quellcode

    1. Public Property HelloWorldCommand() As ICommand
    2. Get
    3. Return m_HelloWorldCommand
    4. End Get
    5. Private Set
    6. m_HelloWorldCommand = Value
    7. End Set
    8. End Property
    9. Private m_HelloWorldCommand As ICommand
    10. Private Sub New()
    11. HelloWorldCommand = New RelayCommand(AddressOf HelloWorldVoid, True)
    12. End Sub
    13. Private Sub HelloWorldVoid()
    14. ' Tu was
    15. End Sub

    VB.NET-Quellcode

    1. Public Property HelloWorldCommand() As new RelayCommand(AddressOf HelloWorldVoid)
    2. Private Sub HelloWorldVoid()
    3. ' Tu was
    4. End Sub
    Jo, keine Ahnung, vmtl. geht das mit deim genauso, aber im Tut machstes glaub anders, oder?
    (ist ja auch egal)

    Gibt es bei WPF noch Vorteile, abgesehen von der Trennung zwischen Designer und Code?
    "Trennung zwischen Designer und Code?" Was meinst du damit?
    Haupt-Vorteil ist halt der MVVM-Pattern, der es ermöglicht, eine Anwendung ordentlich zu strukturieren.
    Ungefähr jedes Problem kann man da klar einordnen, sodass man immer einerseits weiß, wo man anfängt, wenn man was in Angriff nimmt, andererseits aber auch, wo man suchen muss, wenn was anners funktioniert als gedacht.
    Der annere Vorteil ist, dass Wpf-Controls Sachen können, die WinForm-Controls nicht können.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    @ErfinderDesRades angenommen ich habe die RelayCommand-Klasse von @Artentus und dann deinen Code von #14, ich muss doch auch irgendwie, wie auch bei Win-Forms verschiedene "Events" abfangen können. Wir muss ich das dann machen?
    Sry, dass ich so viele Fragen habe, aber muss mich erst ein bisserl einfinden^^.

    MFG

    ErfinderDesRades schrieb:

    KaskadeKings

    Das K wird klein geschrieben :P

    KingTimon schrieb:

    Nuget hab ich nicht.


    Welche Version von VS hast du?
    Bei VS2013: Unter Extra --> NuGet-Paket-Manager --> NuGet Pakete für Projektmappe verwalten
    KaskadekingDE on GitHub :)
    Bitte keine Fragen über Programmierung per PN! Dafür ist das Forum hier.

    Who cares? ¯\_(ツ)_/¯

    KingTimon schrieb:

    @ErfinderDesRades angenommen ich habe die RelayCommand-Klasse von @Artentus und dann deinen Code von #14, ich muss doch auch irgendwie, wie auch bei Win-Forms verschiedene "Events" abfangen können. Wir muss ich das dann machen?
    Sry, dass ich so viele Fragen habe, aber muss mich erst ein bisserl einfinden^^.

    MFG


    WPF läuft nunmal über Bindings. Mit denen kannst du fast jedes Event ersetzen.
    Um zu verstehen, wie du das machst, solltest du dich erstmal über die WPF-Architektur und das MVVM-Pattern informieren. Damit kannst du dich paar Tage auseinandersetzen.

    KingTimon schrieb:

    Gibt es bei WPF noch Vorteile, abgesehen von der Trennung zwischen Designer und Code?
    ja, gibt es. Dank XAML ist es möglich, in Handumdrehen optisch ansprechende Designs zu erstellen, ohne auch nur eine Zeile Code zu schreiben, und das ohne Verlust von Funktionalität. AUßerdem wird durch dieses Modell auch redundanz vermieden, weil Designs global angewendet und Steuerelemente beliebig geschachtelt werden können.
    Dazu kommt dann noch, dass WPF-Anwendungen mit DirectX und damit vollständig hardwarebeschleunigt gerendert werden, dies entfaltet seine Wirkung aber erst wirklich, wenn man grafisch anspruchsvolle Anwendungen entwickelt.

    ErfinderDesRades schrieb:

    vmtl. geht das mit deim genauso, aber im Tut machstes glaub anders, oder?
    Ja geht, ich machs bloß anders, weil ich a) meine Initialisierungen lieber im Konstruktor vornehme und b) dadurch in C# im Vergleich zu VB trotzdem nur eine einzeilige Property entsteht.
    @KaskadekingDE

    Ich kenn Nuget nicht, hab nur geglaubt gelesen zu haben, dass das eine Software ist, mit der man irgendwie DLLs oder so implementieren kann, oder so ähnlich. Hab daraus geschlossen, dass dies eine externe Anwendung ist. Ich verwende noch Visual Studio 2010, funktioniert das damit auch? Also bei Extras finde ich kein Nuget. Oder hat das was mit diesem Erweiterungsmanager zu tun?

    MFG
    Mit 2010 habichs auch nicht hingekriegt, obwohl das prinzipiell wohl gehen soll.
    Aber ich finde das auch egal, denn zumindest für mich bringt die Interaction.dll keinen Gewinn.
    Ich hab meine eigene ViewmodelBase, MainViewmodelBase, RelayCommand, BehaviorBase und noch paar annere Sachen, und finde jeweils, dass die besser ticken als der Interaction-Kram.