DATA
CZAS
IMIENINY
FAZA KSIĘŻYCA
STAFLOTA ⊕ SEKTOR ALFA · BITEDU STATION

Każda aplikacja reaguje na działania użytkownika – kliknięcie przycisku, wpisanie tekstu, zmianę suwaka czy wybór z listy.
To właśnie zdarzenia.
W tym artykule zobaczysz, jak działają one w dwóch środowiskach: Windows Forms i WPF.
Oba wykorzystują język C#, ale sposób podpinania kodu i niektóre właściwości kontrolek różnią się.


Windows Forms a WPF – dwie drogi do tego samego celu


Przycisk (Button)

To najczęściej używana kontrolka – reaguje na kliknięcie.

Właściwości:

Zdarzenie (Forms):

private void btnZapisz_Click(object sender, EventArgs e)
{
    labelWynik.Text = "Dane zapisane!";
}

Po kliknięciu wykonywany jest kod w tej metodzie.


WPF i pojęcie Command

W WPF przycisk może korzystać nie tylko z eventu Click, ale też z Command – czyli polecenia.
Command to specjalna właściwość, która łączy przycisk z metodą w logice aplikacji (ViewModelu).
To pozwala oddzielić wygląd od działania – przycisk „wie”, co ma wykonać, ale nie zna kodu tej metody.

<Button Content="Zapisz" Command="{Binding ZapiszCommand}" />

W ViewModelu definiujesz:

public ICommand ZapiszCommand { get; }

public MainViewModel()
{
    ZapiszCommand = new Command(WykonajZapis);
}

private void WykonajZapis()
{
    Wynik = "Dane zapisane!";
}

Efekt: po kliknięciu przycisku metoda WykonajZapis() uruchamia się automatycznie.
Command to nowoczesny sposób obsługi zdarzeń – szczególnie przydatny w MAUI i WPF.


TextBox – pole tekstowe

Służy do wprowadzania tekstu przez użytkownika.

Właściwości:

Zdarzenie (Forms):

private void txtImie_TextChanged(object sender, EventArgs e)
{
    lblDlugosc.Text = $"Długość: {txtImie.TextLength}";
}

WPF – wersja z Bindingiem:

<TextBox Text="{Binding Imie, UpdateSourceTrigger=PropertyChanged}" />

Efekt: tekst w polu automatycznie aktualizuje właściwość Imie w modelu danych.


Label / TextBlock – wyświetlanie tekstu

Label (Forms) służy do prostych opisów i wyników.
TextBlock (WPF) działa podobnie, ale obsługuje lepsze formatowanie.

Właściwości:

Przykład (Forms):

lblWynik.Text = "Witaj, " + txtImie.Text + "!";

WPF:

<TextBlock Text="{Binding Wynik}" FontSize="16" Foreground="Blue"/>

CheckBox – zaznaczenie opcji

Właściwości:

Zdarzenie:

private void chkZgoda_CheckedChanged(object sender, EventArgs e)
{
    btnDalej.Enabled = chkZgoda.Checked;
}

Efekt: przycisk włącza się tylko, gdy uczeń zaznaczy zgodę.


RadioButton – wybór jednej opcji

RadioButtony działają w grupie – można wybrać tylko jeden z nich.

Właściwości:

Forms:

string plec = rbKobieta.Checked ? "Kobieta" : "Mężczyzna";

WPF:

<StackPanel>
  <RadioButton Content="Mężczyzna" IsChecked="{Binding CzyMezczyzna}" />
  <RadioButton Content="Kobieta"   IsChecked="{Binding CzyKobieta}" />
</StackPanel>

ComboBox – lista rozwijana

Właściwości:

Forms:

comboBox1.Items.AddRange(new[] { "Kot", "Pies", "Papuga" });
comboBox1.SelectedIndexChanged += (_, __) =>
{
    lblWybor.Text = comboBox1.SelectedItem?.ToString();
};

WPF:

<ComboBox ItemsSource="{Binding Zwierzeta}"
          SelectedItem="{Binding WybraneZwierzze}" />

Slider (TrackBar w Forms)

Służy do wybierania wartości liczbowych przez przesuwanie suwaka.

Właściwości:

Zdarzenie:

private void trackBar1_Scroll(object sender, EventArgs e)
{
    panel1.BackColor = Color.FromArgb(trackBar1.Value, 0, 0);
}

WPF:

<Slider Minimum="0" Maximum="255"
        Value="{Binding R, Mode=TwoWay}"
        TickFrequency="10"
        IsSnapToTickEnabled="True" />

Efekt: suwak zmienia intensywność koloru czerwonego w panelu.


SearchBar (MAUI/WPF)

W WPF nie ma wbudowanego SearchBar, ale w MAUI i nowoczesnych UI to standardowa kontrolka.

Właściwości:

Zdarzenie (Forms):

private void txtSearch_TextChanged(object sender, EventArgs e)
{
    var fraza = txtSearch.Text.ToLower();
    var wyniki = lista.Where(x => x.Contains(fraza)).ToList();
    listBox1.DataSource = wyniki;
}

WPF / MAUI (binding):

<SearchBar Placeholder="Szukaj..."
           Text="{Binding Zapytanie, UpdateSourceTrigger=PropertyChanged}" />

ListBox / DataGrid – listy danych

ListBox – do prostych list,
DataGrid – do tabel i rekordów.

Właściwości:

Forms:

listBox1.Items.AddRange(new[] { "Python", "C#", "Java" });

WPF:

<DataGrid ItemsSource="{Binding Studenci}" AutoGenerateColumns="True"/>

ProgressBar – pasek postępu

Właściwości:

Forms:

private async void btnStart_Click(object sender, EventArgs e)
{
    for (int i = 0; i <= 100; i += 10)
    {
        progressBar1.Value = i;
        await Task.Delay(100);
    }
}

Timer – cykliczne działania

Forms:

timer1.Interval = 1000;
timer1.Tick += (_, __) => lblCzas.Text = DateTime.Now.ToString("HH:mm:ss");
timer1.Start();

WPF:

var zegar = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };
zegar.Tick += (_, __) => Zegar = DateTime.Now.ToString("HH:mm:ss");
zegar.Start();

Otwieranie nowych okien i przekazywanie danych

Windows Forms

// Form1
private void btnOtworz_Click(object sender, EventArgs e)
{
    var imie = txtImie.Text;
    var okno = new Form2(imie);
    okno.Show();
}

// Form2
public Form2(string imie)
{
    InitializeComponent();
    lblImie.Text = imie;
}

WPF

var okno = new SzczegolyWindow
{
    DataContext = new SzczegolyViewModel { Imie = txtImie.Text }
};
okno.Show();

Lub w aplikacjach z nawigacją:

await Navigation.PushAsync(new SzczegolyPage(model));

Podsumowanie


C