Wprowadzenie do WPF – twoje pierwsze okno
Dowiesz się czym jest WPF, do czego służy i jak działa. Utworzysz swój pierwszy projekt, poznasz strukturę plików i uruchomisz działającą aplikację okienkową.
Czym jest WPF?
Aplikacja okienkowa vs konsolowa
Do tej pory tworzyłeś aplikacje konsolowe – program uruchamiał się w czarnym oknie terminala i komunikował z użytkownikiem przez wpisywanie tekstu.
Aplikacja konsolowa
Czarne okno, tekst, brak przycisków.
Console.Write("Podaj imię: "); string imie = Console.ReadLine(); Console.WriteLine($"Cześć, {imie}!");
Aplikacja WPF (okienkowa)
Prawdziwe okno z przyciskami, polami tekstowymi, obrazkami.
// Użytkownik klika przyciski, // wypełnia pola tekstowe, // widzi listy, obrazki, kolory... // Tak jak każdy program w Windows.
WPF (ang. Windows Presentation Foundation) to technologia firmy Microsoft do tworzenia aplikacji okienkowych dla systemu Windows. Używasz C# jako języka programowania, a wygląd okna opisujesz w specjalnym języku o nazwie XAML.
Pisanie aplikacji WPF można porównać do budowania strony internetowej. XAML pełni rolę podobną do HTML – opisuje co ma być widoczne na ekranie. C# to logika – opisuje co ma się dziać gdy użytkownik coś kliknie.
Co potrafi WPF?
WPF pozwala tworzyć aplikacje z pełnym interfejsem graficznym:
| Możliwość | Przykład zastosowania |
|---|---|
| Przyciski, pola tekstowe, listy | Formularze, kalkulatory, notatniki |
| Obrazki i multimedia | Galerie zdjęć, odtwarzacze |
| Tabele z danymi | Systemy zarządzania, bazy danych |
| Rysowanie i grafika | Gry, edytory graficzne |
| Animacje i efekty | Nowoczesny, atrakcyjny interfejs |
| Wiele okien | Aplikacje wielowidokowe |
Możesz spotkać też inne technologie tworzenia okienek w .NET: WinForms (starsze, prostsze, ale mniej możliwości), MAUI (nowsze, działa też na Android/iOS) czy Avalonia (wieloplatformowe). Na tym kursie uczymy się WPF – jest dojrzały, dobrze udokumentowany i powszechnie stosowany w firmach.
Tworzenie projektu WPF
Krok po kroku – Visual Studio
W Visual Studio kliknij „Utwórz nowy projekt”.
W polu wyszukiwania wpisz WPF i wybierz szablon
„Aplikacja WPF” (nie mylić z „Aplikacja WPF Framework” –
ta starsza wersja).
Wybieraj szablon „Aplikacja WPF” (korzysta z .NET 8 lub nowszego). Unikaj szablonu „WPF App (.NET Framework)” – to starsza wersja technologii, z której się już nie korzysta.
Nadaj projektowi sensowną nazwę, np. MojaAplikacjaWPF. Unikaj polskich liter i spacji w nazwie projektu.
Pierwsze uruchomienie
Po utworzeniu projektu naciśnij F5 (lub zielony przycisk ▶). Powinno pojawić się puste, szare okno – to Twoja pierwsza aplikacja WPF!
Visual Studio skompilowało kod C# i XAML, a następnie uruchomiło gotowy program. Widzisz puste okno, bo jeszcze nic do niego nie dodaliśmy. Skrót F5 = Uruchom z debugowaniem. Ctrl+F5 = Uruchom bez debugowania (szybciej).
Struktura projektu
Pliki w projekcie
Po utworzeniu projektu w panelu Eksplorator rozwiązań po prawej stronie zobaczysz kilka plików. Oto co każdy z nich oznacza:
| Plik | Do czego służy |
|---|---|
App.xaml |
Punkt startowy aplikacji – tutaj definiuje się wspólne zasoby (kolory, style) dla całej aplikacji |
App.xaml.cs |
Kod C# powiązany z App.xaml – obsługa startu i zamknięcia aplikacji |
MainWindow.xaml |
Główny plik okna – tutaj rysujemy interfejs (przyciski, pola tekstowe…) |
MainWindow.xaml.cs |
Kod C# głównego okna – tutaj piszemy logikę (co się dzieje po kliknięciu) |
Każde okno w WPF składa się z pary plików:
pliku .xaml (wygląd) i pliku .xaml.cs (logika).
Można myśleć o tym jak o dwóch stronach tej samej kartki – razem tworzą jedno okno.
W C# te dwa pliki to w rzeczywistości jedna klasa podzielona na dwie części
(słowo kluczowe partial).
App.xaml – punkt startowy
<Application x:Class="MojaAplikacjaWPF.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="MainWindow.xaml"> <Application.Resources> <!-- Tutaj będą wspólne zasoby dla całej aplikacji --> </Application.Resources> </Application>
Najważniejsza tu jest właściwość StartupUri – mówi WPF
które okno otworzyć jako pierwsze po uruchomieniu programu.
Domyślnie wskazuje na MainWindow.xaml.
MainWindow – główne okno
Plik XAML – wygląd okna
Otwórz plik MainWindow.xaml. Zobaczysz następującą treść:
<Window x:Class="MojaAplikacjaWPF.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="450" Width="800"> <Grid> <!-- Tutaj dodajemy przyciski, pola tekstowe itp. --> </Grid> </Window>
Przeanalizujmy co tu jest, linijka po linijce:
| Fragment kodu | Co oznacza |
|---|---|
<Window ...> |
Definicja okna – to jest „pojemnik” na całą zawartość |
x:Class="...MainWindow" |
Łączy plik XAML z klasą C# o nazwie MainWindow |
xmlns="..." |
Przestrzeń nazw WPF – bez tego XAML nie wiedziałby skąd brać kontrolki |
Title="MainWindow" |
Tekst wyświetlany na pasku tytułu okna |
Height="450" |
Wysokość okna w pikselach |
Width="800" |
Szerokość okna w pikselach |
<Grid> |
Kontener layoutu – siatka, w której umieszczamy kontrolki |
Długie linijki z xmlns= to adresy przestrzeni nazw – trochę jak
instrukcje using w C#. Muszą tam być, żeby XAML wiedział
skąd brać Button, TextBox itp.
Nie musisz ich rozumieć ani zapamiętywać – Visual Studio
wpisuje je automatycznie. Nigdy ich nie usuwaj.
Plik C# – logika okna (code-behind)
Otwórz plik MainWindow.xaml.cs. To jest kod C# powiązany z oknem:
using System.Windows; namespace MojaAplikacjaWPF { // Klasa okna – dziedziczy po Window public partial class MainWindow : Window { // Konstruktor – wywoływany przy tworzeniu okna public MainWindow() { InitializeComponent(); // ← OBOWIĄZKOWE! Inicjalizuje elementy z XAML } } }
InitializeComponent() to metoda generowana automatycznie przez
Visual Studio. Odczytuje plik XAML i tworzy wszystkie kontrolki w pamięci.
Bez niej okno byłoby puste – żaden przycisk, żadne pole
tekstowe nie pojawi się na ekranie, nawet jeśli masz je w XAML.
Nigdy jej nie usuwaj z konstruktora!
Słowo partial przy klasie oznacza, że ta klasa jest podzielona
na dwa pliki – MainWindow.xaml.cs (piszesz sam) i
wygenerowany automatycznie plik ukryty, który zawiera kod z XAML.
Razem tworzą jedną klasę MainWindow.
Właściwości okna
Oknem rządzą właściwości ustawiane w XAML. Oto najczęściej używane – zmień je i uruchom program, żeby zobaczyć efekt:
<Window Title="Moja pierwsza aplikacja" Width="600" Height="400" <!-- Minimalne i maksymalne rozmiary --> MinWidth="300" MinHeight="200" <!-- Kolor tła --> Background="#1e1e2e" <!-- Pozycja startowa: Center, Manual, CenterScreen, CenterOwner --> WindowStartupLocation="CenterScreen" <!-- Stan okna: Normal, Maximized, Minimized --> WindowState="Normal" <!-- Czy można zmieniać rozmiar: CanResize, NoResize, CanMinimize --> ResizeMode="CanResize" <!-- Czy okno jest zawsze na wierzchu --> Topmost="False"> </Window>
Właściwości okna można też zmieniać z kodu C# w czasie działania programu:
private void Window_Loaded(object sender, RoutedEventArgs e) { // Zmiana tytułu w czasie działania programu Title = "Witaj w mojej aplikacji!"; // Maksymalizacja okna WindowState = WindowState.Maximized; // Zmiana rozmiaru Width = 800; Height = 600; }
Właściwość Background przyjmuje nazwę koloru angielską
("Red", "SteelBlue", "White")
lub kod szesnastkowy poprzedzony # – np. "#1e1e2e".
Kolory szesnastkowe możesz dobierać na stronie
htmlcolorcodes.com lub w dowolnym color pickerze.
Ikona aplikacji
Żeby zmienić ikonę okna (domyślnie jest to ikona WPF),
dodaj plik .ico do projektu i ustaw właściwość Icon:
<!-- Plik ikona.ico musi być dodany do projektu --> <Window Icon="ikona.ico" ...>
Pierwszy przycisk – „Hello, WPF!”
Dodajmy do okna jeden przycisk, który po kliknięciu wyświetli komunikat. To klasyczny „Hello World” w WPF.
Krok 1 – Dodaj przycisk w XAML
<Window x:Class="MojaAplikacjaWPF.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Moja aplikacja" Width="400" Height="300" WindowStartupLocation="CenterScreen"> <Grid> <Button x:Name="btnPowitanie" Content="Kliknij mnie!" Width="150" Height="40" Click="btnPowitanie_Click" /> </Grid> </Window>
Krok 2 – Napisz obsługę kliknięcia w C#
using System.Windows; namespace MojaAplikacjaWPF { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void btnPowitanie_Click(object sender, RoutedEventArgs e) { MessageBox.Show("Witaj w WPF!", "Pierwsze okno"); } } }
Sposób 1 – ręcznie w XAML: W przycisku wpisz
Click="btnPowitanie_Click", a potem napisz metodę w C#.
Sposób 2 – przez Visual Studio: Kliknij dwukrotnie przycisk
w designerze XAML – VS automatycznie utworzy metodę w C# i doda
Click="..." do XAML.
Krok 3 – Uruchom i kliknij
Naciśnij F5. Pojawi się okno z przyciskiem. Po kliknięciu zobaczysz okno komunikatu z napisem „Witaj w WPF!”. Gratulacje – to Twoja pierwsza działająca aplikacja okienkowa!
Skrót: Naming Convention (konwencja nazewnictwa)
W WPF przyjął się zwyczaj nazywania kontrolek z przedrostkiem oznaczającym typ. Dzięki temu od razu wiesz z czym masz do czynienia w kodzie C#:
| Typ kontrolki | Przedrostek | Przykład |
|---|---|---|
Button | btn | btnZapisz, btnAnuluj |
TextBox | txt | txtImie, txtHaslo |
TextBlock | lbl lub tb | lblWynik, tbOpis |
ComboBox | cmb | cmbKategoria |
ListBox | lst | lstProdukty |
CheckBox | chk | chkZapisz |
RadioButton | rb | rbMezczyzna |
Image | img | imgAwatar |
Częste błędy początkujących
❌ Błąd 1: Brak InitializeComponent()
❌ Źle
public MainWindow()
{
// Usunąłem InitializeComponent()
// Okno będzie puste!
}
✅ Dobrze
public MainWindow()
{
InitializeComponent(); // zawsze!
}
❌ Błąd 2: Zły szablon projektu
❌ Źle
„WPF App (.NET Framework)” – starsza wersja, inne pliki konfiguracyjne, ograniczone możliwości.
✅ Dobrze
„Aplikacja WPF” lub „WPF Application” – korzysta z nowoczesnego .NET 8+.
❌ Błąd 3: Polskie znaki i spacje w nazwie projektu
❌ Źle
Mój Projekt WPF – spacje i polskie znaki w nazwie mogą powodować błędy kompilacji.
✅ Dobrze
MojProjektWPF lub ProjektWPF01 – tylko litery, cyfry i podkreślniki.
❌ Błąd 4: Zmiana rozmiaru okna na ekranie mniejszym niż MinWidth/MinHeight
❌ Źle
<Window Width="200"
MinWidth="400" />
<!-- Width mniejszy niż MinWidth -->
<!-- Okno otworzy się z MinWidth=400 -->
✅ Dobrze
<Window Width="600"
MinWidth="400" />
<!-- Width większy niż MinWidth -->
Zadania do wykonania
Utwórz nowy projekt WPF. Zmień właściwości okna tak, aby:
- Tytuł brzmiał: „[Twoje imię i nazwisko] – WPF”
- Okno miało szerokość
500i wysokość350 - Okno otwierało się wyśrodkowane na ekranie
- Nie można było zmieniać jego rozmiaru (
ResizeMode="NoResize") - Tło okna było w kolorze ciemnoniebieskim
Do projektu z zadania 1 dodaj przycisk. Po kliknięciu ma wyświetlać okno
komunikatu (MessageBox) z Twoim imieniem i nazwiskiem.
Stwórz aplikację z trzema przyciskami. Każdy przycisk
po kliknięciu zmienia kolor tła okna na inny (użyj właściwości
Background okna z kodu C#). Przykład zmiany tła z C#:
// Zmiana tła z kodu C# Background = new SolidColorBrush(Colors.SteelBlue);
Zbadaj różnicę między Show() a ShowDialog().
Utwórz drugie okno (OknoInfo.xaml) i dwa przyciski w głównym oknie:
- Przycisk „Otwórz normalnie” – otwiera OknoInfo przez
Show() - Przycisk „Otwórz modalnie” – otwiera OknoInfo przez
ShowDialog()
Sprawdź co się dzieje – czy po otwarciu drugiego okna można klikać w pierwsze?
// Otwieranie drugiego okna OknoInfo okno = new OknoInfo(); okno.Show(); // niemodalne – oba okna aktywne // lub: okno.ShowDialog(); // modalne – główne zablokowane