3D in WPF, was soll ins Backend, was bleibt im XAML

  • WPF

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    3D in WPF, was soll ins Backend, was bleibt im XAML

    Heyho,

    hab mich jz nach einiger Zeit dann mal wieder mit meinem WPF Projekt befasst.
    Anfangs hab ich einen Würfel benötigt, und Niko Ortner war so nett und hat mir die Basis gegeben, ist auch wunderschön ;) (siehe hier).
    Jetzt brauche ich aber a) einen Würfel der 6 unterschiedliche Seitenfarben hat und b) 26 Stück davon.
    Ich kanns umsetzten, aber rauskommen wird iwas merkwürdiges in der MainWindow.cs, mit verschiedensten For-Schleifen.

    Wie löst man sowas ?

    Gruß
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    Also bei mir sieht das so aus :D
    Ich hab im XAML im Viewport3D drinnen sowas:

    XML-Quellcode

    1. <l:CubeModel
    2. Cube="{Binding Path=CurrentCube}"
    3. LeftColor="Orange"
    4. RightColor="Red"
    5. FrontColor="Green"
    6. BackColor="Blue"
    7. DownColor="Yellow"
    8. UpColor="LightGray"
    9. />

    Das CubeModel ist einfach eine Klasse, die von ModelVisual3D erbt und ein paar Sachen kann:
    Sie hat Properties für die Farben der unterschiedlichen Flächen.
    Sie hat eine Property, mit der festgelegt werden kann, welcher Würfel angezeigt wird. Sie hat Methoden, mit der, wenn sich der Würfel ändert, das angezeigte aktualisiert werden kann.

    VB.NET-Quellcode

    1. 'Grobes Schema
    2. Public Class CubeModel
    3. Inherits ModelVisual3D
    4. 'DependencyProperties für Cube-Property und Farben
    5. Public Shared ReadOnly CubeProperty As DependencyProperty = DependencyProperty.Register("Cube", ...)
    6. '...
    7. Private Sub OnCubePropertyChanged(Oldvalue As Cube, NewValue As Cube)
    8. ActualizeModel()
    9. End Sub
    10. Private Sub ActualizeModel()
    11. If Cube Is Nothing Then
    12. Me.Content = Nothing
    13. Else
    14. Dim Group As New Model3DGroup
    15. 'Der Gruppe die nötigen Flächen hinzufügen mit:
    16. Group.Children.Add(...)
    17. 'Und anschließend anzeigen.
    18. Me.Content = Group
    19. End If
    20. End Sub
    21. End Class

    Und Cube ist dann halt die Klasse, die den Würfel repräsentiert. Da gibt's unterschiedlichste Ansätze, aber ich würde empfehlen, die Klasse immutable, also unveränderbar, zu machen. Das heißt, jede Aktion wie z.B. das Drehen einer Seite verändert nicht die aktuelle Instanz, sondern gibt eine neue Instanz zurück und die alte bleibt unverändert.
    Im ViewModel hast Du dann eine Property, an die die Cube-Property der CubeModel-Klasse gebunden ist:

    VB.NET-Quellcode

    1. Public Class MainWindowViewModel
    2. '...
    3. Public Property CurrentCube As Cube
    4. '...
    5. End Property
    6. End Class

    Und immer, wenn Du z.B. eine Seite drehts, machst Du sowas:

    VB.NET-Quellcode

    1. ViewModel.CurrentCube = ViewModel.CurrentCube.Rotate(Face.Right)

    Wie dann die Rotate-Funktion genau aussieht, hängt von Deinem Datenmodell ab.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils