1. Wprowadzenie teoretyczne: Nowy kontener DockPanel
Do tej pory poznałeś kontenery Grid (siatka jak w Excelu) oraz StackPanel (stos elementów). W tym zadaniu jako główny szkielet okna możesz wykorzystać kontener DockPanel.
Jak działa DockPanel?
DockPanel działa jak magnes przyciągający elementy do krawędzi okna:
- Dołączana właściwość
DockPanel.Dock="Top | Bottom | Left | Right"decyduje, do którego brzegu okna „przyklei się” dana kontrolka. LastChildFill="True"(wartość domyślna): Ostatnia kontrolka umieszczona wewnątrzDockPanelautomatycznie wypełnia całą pozostałą przestrzeń w środku okna, bez względu na to, jak użytkownik zmieni rozmiar okna.
┌────────────────────────────────────────────────────────┐
│ DockPanel.Dock="Top" (np. Menu) │
├──────────────┬──────────────────────────┬──────────────┤
│ Dock="Left" │ ŚRODEK OKNA │ Dock="Right" │
│ (Panel bocz)│ (Ostatni element │ │
│ │ wypełnia resztę) │ │
├──────────────┴──────────────────────────┴──────────────┤
│ DockPanel.Dock="Bottom" (Pasek statusu) │
└────────────────────────────────────────────────────────┘
2. Podpowiedź do konstrukcji siatki Grid (Środek okna)
Wewnątrz obszaru roboczego (środka okna) powinieneś użyć kontenera Grid. Aby interfejs był czytelny i responsywny, zastosuj odpowiednie jednostki wymiarowania:
- Kolumny (
ColumnDefinitions):- Kolumna lewa (Edytor tekstu):
Width="*"- zajmuje elastycznie całą dostępną przestrzeń. - Kolumna prawa (Podgląd grafiki):
Width="280"(lubAuto) - stała szerokość na panel ze zdjęciem.
- Kolumna lewa (Edytor tekstu):
- Wiersze (
RowDefinitions):- Wiersz 0 (Przyciski akcji):
Height="Auto"- wysokość dopasowana do przycisków. - Wiersz 1 (Główna zawartość - pole tekstowe i ramka zdjęcia):
Height="*"- rozciąga się w pionie.
- Wiersz 0 (Przyciski akcji):

3. Treść zadania do wykonania
Zaprojektuj i zaprogramuj aplikację WPF o nazwie MenedzerNotatek, która pozwoli użytkownikowi na wczytywanie i edycję plików tekstowych oraz przeglądanie plików graficznych.
Etap I: Przygotowanie zasobów projektu (Waga: 4 pkt)
- Utwórz w projekcie folder o nazwie
Dane, a w nim dwa pliki:- Plik tekstowy
start.txto treści: "Witaj w aplikacji! Możesz edytować ten tekst lub otworzyć plik z dysku." - Dowolny plik graficzny
domyslny.png(będący domyślnym podglądem).
- Plik tekstowy
- Dla obu plików ustaw we właściwościach (skrót F4):
Build Action:ContentCopy to Output Directory:Copy if newer(Kopiuj, jeśli nowszy).
- Warunek zaliczenia etapu: Po skompilowaniu projektu (F5) w katalogu
bin\Debug\...musi fizycznie istnieć folderDanez obydwoma plikami.
Etap II: Interfejs użytkownika XAML (Waga: 6 pkt)
- Główne okno aplikacji ma mieć wymiary początkowe: szerokość 750, wysokość 450, minimalną szerokość 600, minimalną wysokość 350 oraz tytuł: "Menedżer Notatek".
- Jako kontener główny okna zastosuj
DockPanel. - Na dole okna (
Dock="Bottom") umieść pasek statusu:TextBlocko nazwielblStatusz szarym tłem, marginesem wewnętrznym i początkowym tekstem: "Gotowy". - Wypełnij resztę okna kontenerem
Grid(podzielonym na kolumny i wiersze według wskazówek z punktu 2).- Interfejs musi zawierać:
- 3 przyciski:
btnOtworzTekst("Otwórz notatkę..."),btnZapiszTekst("Zapisz jako..."),btnWybierzObraz("Wybierz zdjęcie..."). - Pole edycyjne
TextBoxo nazwietxtNotatka: z włączonym zawijaniem wierszy (TextWrapping) oraz pionowym paskiem przewijania (VerticalScrollBarVisibility). - Kontrolkę
Imageo nazwieimgPodgladz właściwościąStretch="Uniform", osadzoną wewnątrz kontrolkiBorderz cienką ramką.
- 3 przyciski:
- Interfejs musi zawierać:
Etap III: Logika aplikacji w C# (Waga: 10 pkt)
1. Inicjalizacja przy uruchomieniu (2 pkt)
- Przy uruchomieniu programu sprawdź metodą
File.Exists(), czy pliki początkowe istnieją w folderzeDane:- Jeśli plik
start.txtistnieje - wczytaj jego zawartość do kontrolkitxtNotatkaz kodowaniem UTF-8. - Jeśli plik
domyslny.pngistnieje - ustaw go jako źródło kontrolkiimgPodglad. - Zaktualizuj
lblStatusna: "Załadowano pliki początkowe".
- Jeśli plik
2. Obsługa przycisku "Otwórz notatkę..." (3 pkt)
- Utwórz i skonfiguruj obiekt
OpenFileDialog:- Tytuł okna: "Wybierz plik notatki".
- Filtr plików: wyłącznie pliki tekstowe (
.txt) oraz opcja "Wszystkie pliki" (*.*).
- Po zatwierdzeniu wyboru przez użytkownika:
- Wczytaj cały tekst z wybranego pliku z kodowaniem UTF-8 do kontrolki
txtNotatka. - Zaktualizuj pasek statusu, wyświetlając nazwę otwartego pliku.
- Zabezpiecz operację blokiem
try-catch. W razie błędu wyświetl oknoMessageBoxz ikoną błędu.
- Wczytaj cały tekst z wybranego pliku z kodowaniem UTF-8 do kontrolki
3. Obsługa przycisku "Zapisz jako..." (2 pkt)
- Utwórz i skonfiguruj obiekt
SaveFileDialog:- Domyślne rozszerzenie:
txt. - Domyślna nazwa proponowana:
notatka.txt. - Filtr: Pliki tekstowe (
*.txt).
- Domyślne rozszerzenie:
- Po potwierdzeniu wyboru:
- Zapisz aktualną zawartość pola
txtNotatkado wybranego pliku. - Wyświetl okno
MessageBoxz informacją o sukcesie oraz zaktualizuj pasek statusu.
- Zapisz aktualną zawartość pola
4. Obsługa przycisku "Wybierz zdjęcie..." (2 pkt)
- Skonfiguruj
OpenFileDialogz filtrem dla plików graficznych (*.png;*.jpg;*.jpeg). - Po wyborze pliku utwórz obiekt
BitmapImage(pamiętaj oUriKind.Absolute) i przypisz go do właściwościSourcekontrolkiimgPodglad. - Zaktualizuj pasek statusu o ścieżkę wybranego obrazu.
5. Bezpieczeństwo i kultura kodu (1 pkt)
- Wszystkie nazwy kontrolek i zdarzeń muszą być czytelne i zgodne ze standardem CamelCase / PascalCase.
- Brak ostrzeżeń kompilatora o niespójności typów czy nieobsłużonych wyjątkach.