OK, ich habe herausgefunden, wie Sie mithilfe von LayoutTransform und ScaleTransform das Grid von UI-Elementen zum Zoomen bringen können. Was ich nicht verstehe, ist, wie ich meine View dazu bringen kann, auf STRG + MouseWheelUp \ Down zu reagieren und den Code in das MVVM-Muster einzufügen.
Meine erste Idee war, den ZoomFactor als Eigenschaft zu speichern und an einen Befehl zu binden, um ihn anzupassen.
Ich schaute auf etwas wie:
%Vor%aber ich sehe 2 Probleme:
1) Ich glaube nicht, dass es eine Möglichkeit gibt zu sagen, ob das Rad nach oben oder nach unten bewegt wurde, noch kann ich sehen, wie ich bestimmen kann, um wie viel. Ich habe MouseWheelEventArgs.Delta gesehen, habe aber keine Ahnung, wie ich es bekommen kann.
2) Die Bindung an einen Befehl im Viewmodel scheint nicht richtig zu sein, da es sich um eine View-Sache handelt.
Da der Zoom ausschließlich UI View ist, denke ich, dass der eigentliche Code in den Code-Behind gehen sollte.
Wie würdest ihr das umsetzen?
ps., verwende ich .net \ wpf 4.0 mit Cinch für MVVM.
Ich würde vorschlagen, dass Sie einen generischen Zoom-Befehl in Ihrer VM implementieren. Der Befehl kann mit einer neuen Zoomstufe parametrisiert werden, oder (vielleicht sogar einfacher) Sie könnten einen IncreaseZoomCommand und DecreaseZoomCommand implementieren. Verwenden Sie anschließend den Code der Ansicht, um diese Befehle aufzurufen, nachdem Sie die Ereignisargumente des Mouse Wheel-Ereignisses verarbeitet haben. Wenn das Delta positiv ist, zoomen Sie heran, wenn Sie das Bild verkleinern.
Es ist nicht schaden, dieses Problem zu lösen, indem Sie ein paar Codezeilen verwenden. Die Grundidee von MVVM besteht darin, dass Sie in der Lage sind, nahezu den vollständigen Status Ihrer Ansicht in einem Objekt zu verfolgen und zu ändern, das nicht von der Benutzeroberfläche abhängt (verbessert die Testbarkeit). Folglich sollte die Berechnung des neuen Ansichtsfensters, das das Ergebnis des Zooms ist, in der VM und nicht im Code dahinter erfolgen.
Die kleine Lücke der Testbarkeit, die im Code dahinter existiert, kann entweder ignoriert oder durch automatische UI-Tests abgedeckt werden. Automatische UI-Tests können jedoch sehr teuer sein.
Ich denke, was du zu tun versuchst, hängt sehr stark mit der Sichtweise zusammen, also schadet es dir nicht, Code in deinen Code zu schreiben (zumindest meiner Meinung nach), obwohl ich mir sicher bin, dass es elegante Methoden gibt dass es mehr Viewmodel basiert.
Sie sollten sich beim OnPrevewMouseWheel-Ereignis anmelden können. Überprüfen Sie, ob der Benutzer die Steuertaste gedrückt hat, und ändern Sie den Zoomfaktor entsprechend, um den gewünschten Zoomeffekt zu erhalten.
Ich stimme beiden Antworten zu und würde nur hinzufügen, dass die Verwendung von Code dahinter in diesem Fall der einzige Weg ist, so dass Sie nicht einmal darüber nachdenken müssen, ob es gute Praktiken bricht oder nicht.
Tatsache ist, dass der MouseEventArgs (und damit das Delta) nur im Code hinter dem MouseEventArgs zu finden ist. Ergreifen Sie also das, was Sie dort brauchen (keine Logik dafür), und geben Sie es als olli an Ihr View-Modell weiter vorgeschlagen.
Auf der anderen Seite möchten Sie vielleicht ein allgemeineres Delta verwenden (z. B. teilen Sie es durch 120, bevor Sie es als Schritt zum View-Modell übergeben), damit es keine Konventionen bezüglich der Ansicht oder des Betriebssystems kennt . Dies ermöglicht eine maximale Wiederverwendung Ihres Codes im Ansichtsmodell.
Um das ganze Problem zu vermeiden, gibt es noch eine weitere Option: -Verwenden Sie einen ContentPresenter in der XAML und lassen Sie den Inhalt an ein Viewmodel-Objekt binden. -handle die Mausrad Ereignisse innerhalb des Viewmodels.
Tags und Links wpf data-binding mvvm mouse cinch