CA1301: Evitar aceleradores duplicados

Item Valor
RuleId CA1301
Categoria Microsoft.Globalization
Alteração da falha Sem interrupção

Causa

Um tipo estende o System.Windows.Forms.Control e contém dois ou mais controles de nível superior que têm chaves de acesso idênticas armazenadas em um arquivo de recurso.

Descrição da regra

Uma chave de acesso, também conhecida como acelerador, dá ao teclado acesso a um controle usando a tecla Alt. Quando vários controles têm a mesma chave de acesso, o comportamento da chave de acesso não é bem definido. O usuário pode não conseguir acessar o controle pretendido usando a chave de acesso e um controle diferente daquele que se pretende pode ser habilitado.

A implementação atual dessa regra ignora itens de menu. No entanto, os itens de menu no mesmo submenu não devem ter chaves de acesso idênticas.

Como corrigir violações

Para corrigir uma violação dessa regra, defina chaves de acesso exclusivas para todos os controles.

Quando suprimir avisos

Não suprima um aviso nessa regra.

Exemplo

O exemplo a seguir mostra um formulário mínimo que contém dois controles que têm chaves de acesso idênticas. As chaves são armazenadas em um arquivo de recurso, que não é mostrado. No entanto, seus valores aparecem nas linhas comentadas checkBox.Text. O comportamento de aceleradores duplicados pode ser examinado trocando as linhas checkBox.Text por suas contrapartes comentadas. No entanto, nesse caso, o exemplo não gerará um aviso da regra.

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);
      }
   }
}

Confira também