130 votes

Modification du curseur dans WPF parfois fonctionne, parfois doesn ' t

Sur plusieurs de mes usercontrols, je change le curseur en utilisant

quand je clique sur quelque chose.

Maintenant, je veux faire la même chose sur une page WPF sur un clic de bouton. Quand j’ai pointez sur mon bouton, le curseur se transforme en une main, mais quand je clique dessus, il ne change pas pour le curseur d’attente. Je me demande si cela a quelque chose à voir avec le fait que c’est un bouton, ou parce que c’est une page et pas un usercontrol ? Cela semble être le comportement bizarre.

220voto

Matt Hamilton Points 98268

Devez-vous le curseur pour un curseur de « attente » seulement quand c’est fini cette page particulière/usercontrol ? Si ce n’est pas le cas, je suggère d’utiliser Mouse.OverrideCursor:

Ce paramètre remplace le curseur de votre application plutôt que juste pour une partie de son interface utilisateur, donc le problème que vous décrivez s’en va.

65voto

Dennis Points 9534

Une façon de le faire dans notre application, à l'aide de IDisposable et puis avec using(){} blocs pour assurer le curseur est réinitialisé lorsque vous avez terminé.

public class OverrideCursor : IDisposable
{

  public OverrideCursor(Cursor changeToCursor)
  {
    Mouse.OverrideCursor = changeToCursor;
  }

  #region IDisposable Members

  public void Dispose()
  {
    Mouse.OverrideCursor = null;
  }

  #endregion
}

et puis dans votre code:

using (OverrideCursor cursor = new OverrideCursor(Cursors.Wait))
{
  // Do work...
}

Le remplacement prend fin lorsque: la fin de l'utilisation de déclaration est atteint; ou si une exception est levée et le contrôle des feuilles de la déclaration bloc avant la fin de l'instruction.

Mise à jour

Pour éviter le clignotement du curseur que vous pouvez faire:

public class OverrideCursor : IDisposable
{
  static Stack<Cursor> s_Stack = new Stack<Cursor>();

  public OverrideCursor(Cursor changeToCursor)
  {
    s_Stack.Push(changeToCursor);

    if (Mouse.OverrideCursor != changeToCursor)
      Mouse.OverrideCursor = changeToCursor;
  }

  public void Dispose()
  {
    s_Stack.Pop();

    Cursor cursor = s_Stack.Count > 0 ? s_Stack.Peek() : null;

    if (cursor != Mouse.OverrideCursor)
      Mouse.OverrideCursor = cursor;
  }

}

40voto

Zamboni Points 4319

Vous pouvez utiliser un déclencheur de données (avec un modèle de vue) sur le bouton pour activer un curseur d’attente.

Voici le code de la vue-modèle :

7voto

Valeriu Caraulean Points 396

Si votre application utilise async trucs et vous êtes jongler avec le curseur de la souris, vous souhaitez probablement le faire uniquement au thread d’interface utilisateur principal. Vous pouvez utiliser le thread du répartiteur de l’app pour ça :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X