C#: comenzi de tastatură și focalizare previzibilă
Adaugă comenzi de tastatură într-o aplicație C# fără să blochezi editarea textului. Înțelege KeyPreview, tastele de navigare și consumarea unei comenzi.
În acest material
O aplicație de concurs trebuie să poată fi folosită fără clickuri inutile. Tastatura poate activa comenzi sau muta o selecție, dar aceleași taste au deja semnificație în controalele de editare. Vom folosi F2 pentru a modifica o stare globală și Escape pentru resetare, păstrând un TextBox în care utilizatorul poate scrie normal.
Cum lucrezi cu exemplul
Exemplul complet se compilează ca Windows Forms App pe .NET Framework 4.8, cu C# 7.3. Deschide Lesson.csproj din arhivă în Visual Studio pe Windows. Rulează scenariile descrise mai jos; verificarea compilării nu înlocuiește testarea ferestrei și a dispozitivelor folosite.
Descarcă sursele și instrucțiunile.
Ideea și pașii de implementare
KeyPreview permite formularului să primească evenimentele tastaturii înaintea controlului focalizat. Handler-ul verifică exact comanda și setează SuppressKeyPress când o consumă. Nu suprimăm toate tastele, deoarece am face câmpul inutilizabil. Pentru comenzi din meniu, ShortcutKeys este adesea mai potrivit decât duplicarea logicii în KeyDown.
TabIndex definește ordinea navigării între controale. AcceptButton și CancelButton sunt mecanisme pentru dialoguri, nu înlocuitori universali ai tratării tastelor. Taste precum săgețile pot fi procesate ca taste de navigare de anumite controale, deci comportamentul trebuie testat în contextul concret.
Exemplu și rezultat așteptat
Cu focalizarea în TextBox, scrii un titlu. F2 incrementează contorul și nu adaugă un caracter în text. Escape îl resetează la zero. Tasta A rămâne disponibilă pentru editare. Butonul Adaugă folosește aceeași metodă ca F2, astfel încât rezultatele nu pot diverge.
Focalizare: TextBox → F2 ajunge la formular → AddOne() → Tasta consumată; text păstrat.Mărește schema ↗
Codul complet
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Windows.Forms;
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LessonForm());
}
}
class LessonForm : Form
{
int count; readonly Label output=new Label {Left=20,Top=100,Width=300,Text="Contor: 0"};
public LessonForm() {
Text="Tastatura"; ClientSize=new Size(420,180); KeyPreview=true;
var input=new TextBox {Left=20,Top=20,Width=300,TabIndex=0};
var add=new Button {Left=20,Top=60,Width=150,Text="Adauga (F2)",TabIndex=1};
add.Click += (s,e) => AddOne();
KeyDown += (s,e) => {
if(e.KeyCode==Keys.F2) { AddOne(); e.SuppressKeyPress=true; }
else if(e.KeyCode==Keys.Escape) {count=0; output.Text="Contor: 0"; e.SuppressKeyPress=true;}
};
Controls.AddRange(new Control[] {input,add,output});
}
void AddOne() {count++;output.Text="Contor: " + count;}
}
Greșeli și limite
Nu folosi un handler global care interceptează Ctrl+C sau săgețile fără motiv. Nu lega o comandă simultan la KeyDown și KeyUp dacă vrei o singură execuție. Menținerea unei taste poate produce repetări; dacă acțiunea trebuie să fie unică, modelează explicit apăsarea și eliberarea.
Exersează
Testează F2 cu focalizarea în fiecare control, apoi testează Tab și Shift+Tab. Verifică faptul că textul introdus rămâne neschimbat după resetarea contorului. Adaugă o etichetă care descrie scurtăturile, pentru ca ele să nu fie un secret al autorului.
Continuă parcursul
Parcursul complet de 50 de lecții
Lecția precedentă: C#: selectarea figurilor prin coordonatele mouse-ului
Lecția următoare: C#: cronometru corect cu Timer și Stopwatch.
Referință: documentația Microsoft.
Întrebări frecvente
KeyPreview oprește automat tasta?
Nu. Handler-ul decide dacă o consumă, de exemplu prin SuppressKeyPress.
Unde pun logica unei comenzi?
Într-o metodă comună, apelată de buton, meniu sau scurtătură.
De ce se repetă acțiunea la menținerea tastei?
Sistemul poate genera repetări de tastă. Dacă nu le dorești, urmărește separat starea apăsată.
Un pas mai departe
Autentifică-te pentru a păstra progresul în cont.