2010-12-06 59 views
0

J'ai un élément de menu de niveau supérieur qui est responsable de l'actualisation d'un DataGrid dans la même fenêtre. Mon flux de contrôle actuel est:WPF toplevel MenuItem activer/désactiver en fonction de la tâche

  1. utilisateur clique sur Actualiser
  2. Dans le gestionnaire d'événements de clic, I:
    1. Désactiver le menuitem, en mettant oMenuItem.IsEnabled = false.
    2. Dispatch une action pour actualiser la grille et dans cette action, je réactivez le menuitem, en mettant IsEnabled = true

Le problème est que l'utilisateur peut cliquer rafraîchir même quand il est désactivé et il est aussi si les clics sont mis en file d'attente. Lorsque l'action revient, elle continue à traiter les clics "en file d'attente" restants. Ce que je m'attends à être: tous les clics pendant que le menuitem est désactivé sont ignorés et seulement quand il est activé, les clics sont reconnus.

La chose étrange est que si je viens de le désactiver et ne jamais permettre que cela continue, à savoir, il est disabled.wpf,

Répondre

1

« Dispatch une action » vous voulez dire en appelant Dispatcher.BeginInvoke() ou un autre type d'opération asynchrone? Quoi qu'il en soit, dans les deux cas, vous pouvez obtenir un "handle" de l'opération (DispatcherOperation ou IAsyncResult) et le stocker en tant que champ lors de l'envoi de votre opération. Une fois l'opération terminée, définissez ce champ sur null.

Dans le gestionnaire d'événement click de l'élément de menu, cochez cette case. Si elle est nulle, cela signifie que vous pouvez commencer l'opération en toute sécurité. Si ce n'est pas null - retourner immédiatement et ne rien faire.

Et quelque chose qui n'est pas lié à votre question mais important - pourquoi ne pas utiliser les commandes? De cette façon, vous n'avez pas besoin de jouer avec la gestion des événements et l'activation/désactivation. Et bien sûr, les commandes peuvent être invoquées par plusieurs moyens (par exemple, l'utilisateur a sélectionné la commande dans le menu à l'aide du clavier et a appuyé sur Entrée) Aucun clic de souris impliqué, mais doit faire la même chose que cliquer sur l'élément de menu.

Alex.

+0

Salut Alex. Merci pour la réponse. J'y suis allé aussi avec la commande, et dans mon gestionnaire CanExecute, j'ai vérifié si la propriété IsEnabled de MenuItem était false; essentiellement, e.CanExecute = oMenuItem.IsEnabled. Cela a eu le même comportement avec ma précédente approche non-IAsyncResult. Je vais donner un coup de feu à votre approche, et j'espère que cela sera compris. – Anuj

+1

La chose avec les commandes est que vous pouvez les mettre dans un ViewModel et ainsi séparer la présentation de la logique. Google MVVM si vous ne savez pas de quoi je parle. (En bref - il vous permet de tester votre logique en tant que classe simple sans avoir besoin d'afficher une fenêtre avec toutes les commandes). Quoi qu'il en soit, si vous utilisez MVVM, le champ IAsyncResult doit être stocké dans le ViewModel et non dans la vue. – Alex