2010-07-07 2 views
7

In einer WPF/MVVM-Anwendung versuche ich eine code-effiziente Möglichkeit zu finden, den Hauptansichts-Cursor vor jeder längeren Operation auf Cursors.Wait festzulegen und nach Abschluss auf den Standardcursor zurückzusetzen.Wie wird die Ausführung eines RoutedCommand in der Ansicht abgefangen? (WPF/MVVM)

Da alle Operationen mit gerouteten Befehlen aufgerufen werden, möchte ich eine Möglichkeit finden, die Befehlsausführung abzufangen, idealerweise durch Erstellen einer generischen Befehlsklasse, die eine Instanz eines integrierten gerouteten Befehls umschließt, aber nicht visualisieren, wie das geht.

Insbesondere ist die RoutedCommand.Execute Methode nicht virtuell, also brauche ich einen anderen Mechanismus, um seine Anrufe abzufangen. Ich bin mir auch nicht sicher, wie eine Instanz der generischen Befehlsklasse auf die Ansicht verweisen würde, für die sie den Cursor setzen soll.

Bitte um Rat fragen?

Danke,

Tim

+0

Es Vielleicht ist das ein Grund, dass Sie das tun wollen, was etwas kompliziert klingt, aber gibt es einen Grund, warum Sie nicht einfach eine CurrentCursor-Eigenschaft in Ihrem ViewModel erstellen und den Cursor in Ihrer Ansicht (en) an diese Eigenschaft binden können? –

+1

@Wonko. Danke - das ist eine gute Frage und ich stimme zu, dass dies der MVVM-konforme Ansatz zu sein scheint. Es bedeutet jedoch, dass ich die gleiche zweizeilige Codeänderung auf viele ViewModel-Methoden anwenden muss, während ich hoffte, den Cursorverwaltungscode zu zentralisieren. Eine zweite Komplikation besteht darin, dass meine Ansicht einige Steuerelemente enthält, die geroutete Befehle akzeptieren. Wie verwende ich die gleiche Logik für ihre Operationen, da sie nicht Teil des ViewModels sind? –

Antwort

3

Sie können den Cursor in einer statischen Art und Weise eingestellt. Der Effekt ist, dass der Cursor "Warten" ist, während die App den Fokus hat, und nicht, wenn sie sich über einem bestimmten Steuerelement befindet.

Der Code, der zu Beginn des langen Betriebsteil des Ansichtsmodell wäre:

Mouse.OverrideCursor = Cursors.Wait; 

Nach der Operation abgeschlossen haben, die Überschreibung wie diese löschen haben:

Move.OverrideCursor = null; 
+0

danke für deine Idee und +1, dass du mir etwas Neues und Nützliches beigebracht hast, aber es löst immer noch nicht die Probleme, die ich in meinem Kommentar zu @Wonko angesprochen habe. –

+0

Eine Alternative ist hier, um Ihre eigene Implementierung von ICommand zu erstellen. Ein beliebter ist ein RelayCommand, von dem ich sicher bin, dass er irgendwo online implementiert ist. Wenn Sie es für Ihre Befehle verwenden, können Sie diese Cursor-Behandlung in der 'Ausführen' -Behandlung des Basistyps abstrahieren. Nach meinem Wissen gibt es keine Möglichkeit, alle gerouteten Befehle global abzufangen. Der einzige Nachteil wäre, dass Ihre Befehle nicht mehr weitergeleitet werden. Stattdessen werden sie in das ViewModel verschoben. Hoffe, dass hilft. – Steven

+0

Danke nochmal Steven. Genau das versuche ich zu erreichen, obwohl ich denke, dass ich darüber nachdenken muss, ob ich ohne die Befehle leben kann. Ich habe Mühe zu visualisieren, wie dies bei integrierten Befehlen funktionieren würde, die auf Steuerelemente abzielen (z. B. der ToggleBold-Befehl, der auf RichTextBox abzielt). Gibt es eine Möglichkeit, dieses Szenario mit RelayCommand zu arbeiten? –

Verwandte Themen