Le gestionnaire de commandes.InvalidateRequerySuggested() n'est pas assez rapide. Que puis-je faire?

Version Courte

Appels à CommandManager.InvalidateRequerySuggested() prendre plus de temps pour prendre effet que je voudrais (1 à 2 secondes avant de l'INTERFACE utilisateur commandes sont désactivées).

Version Longue

J'ai un système où je soumettre des tâches à un arrière-plan-fil tâche sur la base de processeur. Cette soumettre arrive sur le WPF thread d'INTERFACE utilisateur.

Lorsque cette soumettre arrive, l'objet qui gère mon thread d'arrière-plan fait deux choses:

  1. Il soulève un "occupé" de l'événement (toujours sur le thread de l'INTERFACE utilisateur) que plusieurs modèles de vue de répondre à; lorsqu'ils reçoivent cet événement, ils ont mis un IsEnabled drapeau sur eux-mêmes pour false. Les contrôles dans mes vues, qui sont liées aux données à cette propriété, sont immédiatement grisé, qui est ce à quoi je m'attends.

  2. Il informe mon WPF ICommand des objets qu'ils ne devraient pas être autorisés à s'exécuter (encore une fois, toujours sur le thread d'INTERFACE utilisateur). Car il n'y a rien comme INotifyPropertyChanged pour ICommand objets, je suis obligé d'appeler CommandManager.InvalidateRequerySuggested() à force de WPF à reconsidérer l'ensemble de mes objets de commande' CanExecute états (oui, j'ai effectivement besoin pour ce faire: dans le cas contraire, aucun de ces contrôles deviennent handicapés). Contrairement à l'article 1, si, il prend beaucoup plus de temps pour mes boutons/menu articles/etc qui sont à l'aide de ICommand objets à modifier visuellement à un état désactivé que pour les contrôles de l'INTERFACE utilisateur qui ont leur IsEnabled bien définir manuellement.

Le problème est, à partir d'un UX point de vue, cela ressemble terrible; la moitié de mes contrôles sont immédiatement grisé (parce que leur IsEnabled propriété est définie sur false), et puis plein de 1-2 secondes plus tard, l'autre moitié de mes contrôles suivre (parce que leur CanExecute méthodes sont ré-évalués).

Donc, la partie 1 de ma question:

Comme cela peut paraître idiot de se demander s'il existe un moyen pour moi de faire CommandManager.InvalidateRequerySuggested() faire de l'emploi la plus rapide? Je soupçonne qu'il n'y en a pas.

Assez juste, la partie 2 de ma question:

Comment puis-je contourner cela? Je préfère tous mes contrôles de être désactivé en même temps. Il semble juste un manque de professionnalisme et maladroit autrement. Des idées? 🙂

InformationsquelleAutor Rob | 2009-11-17