2008-11-07 8 views
13

J'ai plusieurs contrôles sur ma fenêtre. L'un d'entre eux est un bouton d'actualisation qui effectue une tâche fastidieuse sur un thread d'arrière-plan.Désactivation de tous les contrôles enfants sauf un dans une fenêtre WPF

Lorsque l'utilisateur clique sur le bouton d'actualisation, je place le curseur dans un état d'attente (sablier) et désactive toute la fenêtre - Me.IsEnabled = False.

Je voudrais prendre en charge l'annulation de l'action de rafraîchissement en laissant l'utilisateur cliquer sur un bouton d'annulation, mais je ne peux pas faciliter cela lorsque toute la fenêtre est désactivée.

Existe-t-il un moyen de le faire en plus de désactiver un par un chaque contrôle (à l'exception du bouton Annuler) et de les réactiver un par un lorsque l'utilisateur clique sur Annuler?

+0

Je n'arrive pas à utiliser à la fois Me.IsEnabled et Me.Cursor. http://stackoverflow.com/questions/762396/wpf-wait-cursor-with-backgroundworker-thread –

Répondre

19

Vous pouvez mettre tous les contrôles dans un panneau (grille, StackPanel, etc.), et laisser le bouton d'annulation dans un autre panneau. Ensuite, définissez la propriété IsEnabled de l'autre panneau.

En pratique, cela introduira probablement plus d'un panneau supplémentaire.

Par exemple, si vous aviez un StackPanel de boutons, vous pouvez ajouter un StackPanel supplémentaire:

<StackPanel Orientation="Horizontal"> 
    <StackPanel x:Name="controlContainer" Orientation="Horizontal"> 
     <!-- Other Buttons Here --> 
    </StackPanel> 
    <Button Content="Cancel" /> 
</StackPanel> 

Ensuite, vous procédez comme suit pour tout désactiver, mais le bouton Annuler:

controlContainer.IsEnabled = false; 
+0

StackPanel n'a pas de propriété IsEnabled dans WP8 – radders

+0

Eh bien, j'ai fait 0 travail avec WP8, mais j'ai trouvé les documents pour le WP8 'StackPanel': http://msdn.microsoft.com/en-US/library/ windows/apps/windows.ui.xaml.controls.stackpanel.aspx Je suppose que vous utilisez cette API, et non celle de Silverlight, puisque Silverlight a une propriété 'IsEnabled'. Bien que vous n'obteniez pas l'apparence exacte des contrôles désactivés, vous pouvez toujours définir 'IsHitTestVisible =" false "' pour désactiver l'entrée sur 'controlContainer'. Sinon, vous pourriez avoir une superposition semi-transparente que vous rendrez visible lorsque vous voulez désactiver les autres contrôles (et utiliser un 'Grid' comme panneau externe). –

3

Vous pouvez lier des données à chaque propriété IsEnabled de contrôle à votre propriété de dépendance booléenne personnalisée qui signale lorsque votre application est verrouillée. Ne liez pas le bouton d'annulation.

Comme l'a mentionné Donnelle Vous pouvez configurer la liaison multiple avec un convertisseur. Voici quelques exemples auxquels vous pouvez vous référer. WPF MultiBinding with Converter Implementing Parameterized MultiBinding Sample

+0

Le seul problème que je rencontre est que la propriété IsEnabled sur certains de mes contrôles est déjà liée à une propriété booléenne à d'autres fins. –

+1

Vous pouvez utiliser une multi-liaison avec un convertisseur - il existe des exemples pour savoir comment faire un générique avec un paramètre pour les comportements AND et OR. – Donnelle

5

Je voulais aussi que l'utilisateur puisse annuler le chargement. J'ai trouvé une solution adorable.

foreach (Control ctrl in this.Controls) 
    ctrl.Enabled = false; 

CancelButton.Enabled = true; 

Cela permet également la fenêtre principale pour sélectionner et déplacer contrairement this.Enabled = false; qui bloque complètement la fenêtre.

+0

Le contrôle n'a pas de propriété IsEnabled dans WP8 – radders

Questions connexes