CA1301: Należy unikać duplikowania akceleratorów
TypeName |
AvoidDuplicateAccelerators |
CheckId |
CA1301 |
Kategoria |
Microsoft.Globalization |
Zmiana kluczowa |
Niekluczowa |
Przyczyna
Typ rozszerza Control i zawiera dwie lub więcej kontrolek najwyższego poziomu, które mają identyczne klawisze dostępu, które są przechowywane w pliku zasobów.
Opis reguły
Klucz dostępu, znany również jako akcelerator, umożliwia dostęp z klawiatury do kontrolki przy użyciu klawisza ALT.Kiedy wiele kontrolek ma zduplikowany klucz dostępu, zachowanie klucza dostępu nie jest dobrze zdefiniowane.Użytkownik może nie być w stanie dotrzeć do zamierzonej kontrolki przy użyciu klucza dostępu, inna kontrolka, niż ta która jest zamierzona, może zostać włączona.
Aktualna implementacja tej reguły ignoruje elementy menu.Jednak elementy menu w tym samym podmenu nie powinny mieć identycznego klucza dostępu.
Jak naprawić naruszenia
Aby naprawić naruszenie tej zasady, należy zdefiniować unikatowe klawisze dostępu dla wszystkich kontrolek.
Kiedy pominąć ostrzeżenia
Nie należy pomijać ostrzeżenia dotyczącego tej reguły.
Przykład
Poniższy przykład pokazuje minimalny formularz, który zawiera dwie kontrolki, które mają identyczne klawisze dostępu.Klucze są przechowywane w pliku zasobów, który nie jest wyświetlany; Jednakże ich wartości pojawiają się w zakomentowanych liniach checkBox.Text.Zachowanie zduplikowanych akceleratorów może być zbadane przez zamianę linii checkBox.Text z ich zakomentowanymi odpowiednikami.Jednakże w tym przypadku przykład nie wygeneruje ostrzeżenia tej reguły.
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);
}
}
}