MVVM Curseur d'Attente comment définir l'.curseur d'attente lors de l'invocation d'une commande?
Scénario:
L'utilisateur clique sur un bouton sur la Vue
Cela appelle une commande sur le ViewModel, DoProcessing
Comment, et où est le curseur d'Attente, se mettre, compte tenu de la responsibilitues de Vue et ViewModel?
Juste pour être clair, je suis juste à la recherche pour modifier la valeur par DÉFAUT du curseur de la forme d'un sablier alors que la commande est en cours d'exécution. Lorsque la commande est terminée, le curseur mut revenir à une flèche. (C'est un fonctionnement synchrone, je suis à la recherche pour, et je veux l'INTERFACE utilisateur de bloquer).
J'ai créé un IsBusy propriété du ViewModel. Comment puis-je m'assurer que les Application's pointeur de la souris change?
Vous devez vous connecter pour publier un commentaire.
Je l'utilise avec succès dans mon application:
Cela a été pris à partir de ici. Courtsey huttelihut.
Vous devez appeler la
SetBusyState
méthode à chaque fois que vous pensez que vous allez effectuer tout le temps de l'opération. par exemple,Cela va automatiquement changer votre curseur curseur d'attente lorsque l'application est en train et le retour à la normale en cas d'inactivité.
Une méthode très simple est tout simplement de lier à la "Curseur" de la propriété de la fenêtre (ou de tout autre contrôle). Par exemple:
XAML:
ViewModel Curseur De La Propriété (À L'Aide De L'Apex.MVVM):
Puis il suffit de changer le curseur de votre point de vue lorsque nécessaire...
Commande est gérée sur le modèle de vue, de sorte que le raisonnable decission serait suivantes:
1) Créer un voyant d'activité de service et à l'injecter dans le modèle de vue (ce qui vous permettra de remplacer le curseur de la logique avec une certaine mauvaise animation facilement)
2) Dans le gestionnaire de commande d'appel de l'indicateur de service pour informer l'utilisateur de
J'ai peut-être tort, mais il semble que vous essayez de faire de lourds calculs ou des I/O sur le thread de l'INTERFACE utilisateur. Je vous recommande fortement d'effectuer des travaux sur le pool de thread dans ce cas. Vous pouvez utiliser les groupes de travail et TaskFactory facilement enrouler travailler avec ThreadPool
Il y a une grande Session(à 50:58) par Laurent Bugnion en ligne (Créateur de MVVM Light).
Il y a aussi un deepDive session disponible (sinon ici(à 24:47)).
Dans au moins l'un d'eux il live codes d'un Indicateur à l'aide d'un est BusyProperty.
Le ViewModel ne devrait décider si elle est occupée, et la décision sur ce curseur à l'utilisation, ou l'utilisation d'une autre technique comme une barre de progression doit être laissé à la Vue.
Et, d'autre part, la manipulation avec le code-behind de la Vue n'est pas si souhaitable soit, parce que l'idéal est que les Vues ne devrait pas avoir de code-behind.
Donc j'ai choisi de faire une classe qui peut être utilisée dans la Vue de XAML pour spécifier que le curseur doit être de changement à Attendre lors de la ViewModel est occupé. À l'aide de UWP + Prisme de la définition de la classe est:
Et la façon de l'utiliser est:
À mon humble avis qu'il est parfaitement bien pour le curseur d'attente logique d'être à côté de la commande dans le viewmodel.
Quant à la meilleure façon de faire changer le curseur de la, créer un
IDisposable
wrapper qui change laMouse.OverrideCursor
de la propriété.Utilisation:
Ci-dessus est une version révisée de la solution que j'ai posté à ce question.