C#: atestat și pregătire ONTI

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.

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.

Schemă pentru lecția 21: Focalizare: TextBox; F2 ajunge la formular; AddOne(); Tasta consumată; text păstrat.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

Bazele C#

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.

Exersează cu o problemă →