2016-11-17 4 views
2

Ich verwende das Windows.UI.Composition Framework zum ersten Mal in meiner App. Meine App basiert auf MVVM Light. Ich aktualisiere die App, um weitere Übergangsanimationen zwischen Elementen hinzuzufügen. Die vorherrschende Meinung bei MVVM ist, dass Sie Ihren UI-Code so weit wie möglich in XAML aufbewahren sollten, indem Sie visuelle Zustände an die ViewModel-Eigenschaften binden usw. Aber das gesamte Windows.UI.Composition-Material und die Beispiele, die ich bisher verwendet habe Sehen Sie sich stattdessen die UI-Manipulationen im Code-Behind an.So integrieren Sie Windows.UI.Composition Animationen in UWP MVVM Light App

Lassen Sie uns ein show/hide-Szenario als ein Beispiel verwenden. Ich habe eine Bool-Eigenschaft in meinem ViewModel wie ShowTheBox. Ich verbinde die Visibility-Eigenschaft von TheBox mit der ViewModel-Eigenschaft. Die Box zeigt oder versteckt sich automatisch basierend auf Änderungen in meinem ViewModel.

Jetzt, mit Windows.UI.Composition, möchte ich Fade-in/Fadeout-Animationen zu den Sichtbarkeit Änderungen von TheBox hinzufügen. Wo ist der beste Ort, um diesen C# -Code zu platzieren, und wie binde ich diesen Übergang an meine ShowTheBox-Eigenschaft?

Antwort

1

Ich würde nicht damit einverstanden sein, dass Punkt von MVVM UI-Code ausschließlich in XAML hält. Der Punkt von MVVM ist, wie bei jedem anderen Ebenentrennungsmuster, die Trennung der UI-Ebene von der App-Logik. MVVM fügt einfach seine eigenen Aromen in Form von Bindungen hinzu.

Also ich denke, wenn Sie komplexe Animationen und andere UI-bezogene Sachen haben, ist es völlig in Ordnung, sie in Code-Behind zu setzen. Aber bevor Sie das tun, sollten Sie versuchen, so viel wie möglich von Ihren Animationen zu benutzerdefinierten Steuerelementen zu extrahieren, die Ihre Zweifel ein wenig erleichtern werden.

BEARBEITEN: Eine Menge Ihrer UI-Logik direkt an ViewModel Eigenschaften gebunden ist nicht immer eine gute Lösung. Die Ebenentrennung ist aus einem bestimmten Grund vorhanden. Wenn Sie also Ihre Ebenen zusammensetzen, stellen Sie sicher, dass Sie eine Xamarin-App schreiben und gemeinsame ViewModels, aber unterschiedliche Ansichten für verschiedene Plattformen verwenden. Jetzt sind Sie nicht einmal sicher, ob auf einer anderen Plattform diese Animationen haben oder nicht. Vielleicht dauert ein Flow, der einen Bildschirm auf UWP braucht, zwei Bildschirme auf iOS oder etwas anderes. Eine Eigenschaft "IsVisible" zu haben, die nur für eine von vielen Ansichten dient, macht jetzt keinen Sinn, oder? Sie müssen also eine gemeinsame Bezeichnung für ViewModel finden und alles andere auf UI-Ebenen verschieben.

Am Ende des Tages ist MVVM nur ein Muster, das Ihnen hilft, einen besseren Code zu schreiben. Es ist verständlich, dass Sie sich so gut wie möglich an alle guten Praktiken halten wollen, aber wenn es für Ihre App keinen Sinn ergibt - ist es das wert?

+0

Das macht alles Sinn, aber unabhängig davon, ob der Code im Code-Behind ist oder nicht, bekomme ich nicht, wie ich aus einem einfachen show/hide-Szenario basierend auf meiner ViewModel-Eigenschaft an Visibility gebunden bin (wie ich beschrieben habe) zu einer Fade-In/Out-Animation. Es scheint, als müsste ich jedes Mal ein benutzerdefiniertes Steuerelement erstellen, wenn ich einfach etwas ein- und ausbleichen möchte. – Scott

+0

Nun, ich schätze du bist verrückt und es gibt keine Animationen in der brutalen MVVM-Welt :) Auf eine ernsthafte Notiz, überprüfe meine aktualisierte Antwort. Ich hoffe es hilft ein wenig. –

+0

Nicht jeder hat den Luxus, seinen Rahmen zu wählen. Es lohnt sich oder nicht Ich bin mit einer MVVM Light App fest. Mein Beispiel war nicht sehr gut. Mein ViewModel enthält keine UI-Informationen, sondern spiegelt verschiedene Zustände der Daten wider. Verschiedene UI-Elemente sind über die VM an die Zustände der Daten gebunden. Dies funktioniert gut für einfache Sichtbarkeit. Das Problem, das ich habe, ist, wie ich Übergangsanimationen in die Sichtbarkeit von Elementen integriere, um die Benutzeroberfläche eleganter zu machen. Ich habe XAML-Übergänge ausprobiert, aber sie spielen nur einmal, wenn ein Element erstellt wird. Mir ist nicht klar, wie diese durch Sichtbarkeit ausgelöst werden können. – Scott