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ą.

WPF Visual Studio XAML pierwsze okno
1

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.

Analogia

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, listyFormularze, kalkulatory, notatniki
Obrazki i multimediaGalerie zdjęć, odtwarzacze
Tabele z danymiSystemy zarządzania, bazy danych
Rysowanie i grafikaGry, edytory graficzne
Animacje i efektyNowoczesny, atrakcyjny interfejs
Wiele okienAplikacje wielowidokowe
WPF a inne technologie

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.

2

Tworzenie projektu WPF

Krok po kroku – Visual Studio

Otwórz Visual Studio
Utwórz nowy projekt
Wybierz szablon WPF
Nadaj nazwę i lokalizację
Kliknij Utwórz

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).

Uwaga na wybór szablonu

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!

Co właśnie się stało?

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).

3

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:

PlikDo 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)
Dwa pliki = jeden ekran

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

App.xaml – wygenerowany automatycznie
<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.

4

MainWindow – główne okno

Plik XAML – wygląd okna

Otwórz plik MainWindow.xaml. Zobaczysz następującą treść:

MainWindow.xaml – wygenerowany automatycznie
<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 koduCo 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
xmlns – co to jest?

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:

MainWindow.xaml.cs – wygenerowany automatycznie
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
        }
    }
}
Co to jest InitializeComponent()?

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.

5

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:

MainWindow.xaml – popularne właściwości okna
<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:

MainWindow.xaml.cs – zmiana właściwości okna z kodu
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;
}
Skąd wziąć kolory?

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:

Ustawienie ikony okna
<!-- Plik ikona.ico musi być dodany do projektu -->
<Window Icon="ikona.ico" ...>
6

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

MainWindow.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#

MainWindow.xaml.cs
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");
        }
    }
}
Jak powiązać przycisk z metodą? Dwie drogi

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 kontrolkiPrzedrostekPrzykład
ButtonbtnbtnZapisz, btnAnuluj
TextBoxtxttxtImie, txtHaslo
TextBlocklbl lub tblblWynik, tbOpis
ComboBoxcmbcmbKategoria
ListBoxlstlstProdukty
CheckBoxchkchkZapisz
RadioButtonrbrbMezczyzna
ImageimgimgAwatar
7

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 -->
8

Zadania do wykonania

Zadanie 1 łatwe

Utwórz nowy projekt WPF. Zmień właściwości okna tak, aby:

  • Tytuł brzmiał: „[Twoje imię i nazwisko] – WPF”
  • Okno miało szerokość 500 i 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
Zadanie 2 łatwe

Do projektu z zadania 1 dodaj przycisk. Po kliknięciu ma wyświetlać okno komunikatu (MessageBox) z Twoim imieniem i nazwiskiem.

Zadanie 3 średnie

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);
Zadanie 4 średnie

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