CA1301 : Éviter les accélérateurs en double

Élément Valeur
ID de la règle CA1301
Category Microsoft.Globalization
Modification avec rupture Sans rupture

Cause

Un type étend System.Windows.Forms.Control et contient au moins deux contrôles de niveau supérieur qui ont des clés d’accès identiques stockées dans un fichier de ressources.

Description de la règle

Une touche d’accès rapide, également connue sous le nom d’accélérateur, autorise l’accès à un contrôle par le biais du clavier, à l’aide de la touche Alt. Lorsque plusieurs contrôles présentent des touches d’accès rapide identiques, le comportement de ces dernières n’est pas correctement défini. L’utilisateur peut ne pas être en mesure d’accéder au contrôle prévu à l’aide de la touche d’accès rapide, et un autre contrôle que celui prévu peut être activé.

L’implémentation actuelle de cette règle ignore les éléments de menu. Toutefois, les éléments de menu du même sous-menu ne doivent pas avoir de touches d’accès rapide identiques.

Comment corriger les violations

Pour corriger une violation de cette règle, définissez des touches d’accès uniques pour tous les contrôles.

Quand supprimer les avertissements

Ne supprimez aucun avertissement de cette règle.

Exemple

L’exemple suivant montre un formulaire minimal qui contient deux contrôles qui ont des touches d’accès rapides identiques. Les clés sont stockées dans un fichier de ressources, qui n’est pas affiché. Toutefois, leurs valeurs apparaissent dans les lignes commentées checkBox.Text. Le comportement des accélérateurs en double peut être examiné en échangeant les lignes checkBox.Text avec leurs contreparties commentées. Toutefois, dans ce cas, l’exemple ne génère pas d’avertissement de la règle.

using System;
using System.Drawing;
using System.Resources;
using System.Windows.Forms;

namespace GlobalizationLibrary
{
   public class DuplicateAccelerators : Form
   {
      [STAThread]
      public static void Main()
      {
         DuplicateAccelerators accelerators = new DuplicateAccelerators();
         Application.Run(accelerators);
      }

      private CheckBox checkBox1;
      private CheckBox checkBox2;

      public DuplicateAccelerators()
      {
         ResourceManager resources = 
            new ResourceManager(typeof(DuplicateAccelerators));

         checkBox1 = new CheckBox();
         checkBox1.Location = new Point(8, 16);
         // checkBox1.Text = "&checkBox1";
         checkBox1.Text = resources.GetString("checkBox1.Text");

         checkBox2 = new CheckBox();
         checkBox2.Location = new Point(8, 56);
         // checkBox2.Text = "&checkBox2";
         checkBox2.Text = resources.GetString("checkBox2.Text");

         Controls.Add(checkBox1);
         Controls.Add(checkBox2);
      }
   }
}

Voir aussi