Jacek Matulewski
Programowanie Windows (WPF) - Zadania do części I
- 
Przygotuj aplikację WPF korzystającą ze zdarzeń, w której w oknie widoczne są kontrolki 
TextBox i TextBlock. Tekst wpisywany w pierwszej kontrolce powinien pojawić się w drugiej kontrolce. Do okna dodaj też przycisk z etykietą Czyść, który usuwa tekst z obu kontrolek (powinno wystarczyć usunięcie z kontrolki TextBox).
 - 
Proszę przygotować aplikację WPF, która pozwala na wpisanie trzech współczynników równania kwadratowego i podaje jego rozwiązania, jeżeli istnieją. Wyodrębnij klasę modelu odpowiedzialną za obliczenia, której konstruktor przyjmuje współczynniki równania i nie pozwala ich potem zmieniać, a udostępnia dwie własności z rozwiązaniami.
 - 
Do projektu Kolory dodaj trzy kontrolki 
TextBlock umieszczone z prawej strony każdego suwaka, które prezentują wartości poszczególnych składowych RGB koloru wybranego za pomocą suwaków (zaokrąglowe do liczby całkowitej).
 - 
Zmodyfikuj projekt Kolory w taki sposób, żeby dodać do niego model przechowujący stan aplikacji (trzy liczby typu 
byte). Może to być osobna biblioteka lub po prostu podfolder w projekcie. W modelu umieść także klasę Ustawienia.
 - 
W projekcie Kolory przechowaj także ustawienia dotyczące położenia i rozmiaru okna. Zapisz je przed zamknięciem okna, a odtwórz po ponownym uruchomieniu aplikacji.
 - 
W projekcie Tekst z zadania I dodaj odtwarzanie dźwięku po każdym wprowadzeniu litery. Do emisji dźwięku użyj polecenia 
SystemSounds.Beep.Play();.
 - 
Dynamiczne tworzenie kontrolek: Przygotuj projekt aplikacji z jednym przyciskiem zajmującym sporą część okna. Kliknięcie tego przycisku powinno powodować utworzenie kolejnego przycisku umieszczonego wewnątrz przycisku oryginalnego (zagnieżdżonego, z uwzględnienniem dziesięciopikselowych marginesów z każdej strony). Do zdarzenia 
Click nowego przycisku powinna być podłączona metoda zdarzeniowa oryginalnego przycisku tak, aby kliknięcie go tworzyło kolejny przycisk w jego zawartości i tak dalej aż do momentu, w którym przycisk ma rozmiary mniejsze niż 50x50. W takiej sytuacji powinien jedynie zmieniać kolor na czerwony.
 - Do interfejsu graficznego projektu ilustrującego mechanizm drag&drop dodaj trzecią kontrolkę 
ListBox i podepnij jej zdarzenia w taki sposób, aby można było do niej i z niej przenosić elementy z pozostałych dwóch kontrolek.
 - W tym samym projekcie zmień sposób inicjacji procesu drag&drop w taki sposób, aby rozpoczynać go dopiero po przesunięciu myszy na odległość większą od progu ustalonego we własnościach 
System.Windows.SystemParameters.MinimumHorizontalDragDistance i MinimumVerticalDragDistance. To oznacza, że w metodzie związanej ze zdarzeniem PreviewMouseLeftButtonDown należy jedynie przełączyć flagę sygnalizującą możliwość rozpoczęcia procesu przenoszenia, a rzeczywiście uruchomić go dopiero w metodzie związanej ze zdarzeniem MouseMove po spełnieniu warunku odległości od miejsca "złapania" elementu.
 - W tym samym projekcie dodaj możliwość przenoszenia wielu elementów.
 - Zdefiniuj gradient liniowy dla przycisku, który zmienia kolory zgodnie z kolejnością kolorów tęczy.
 - Zdefiniuj styl, w którym elementy interfejsu (uwzględnij zarówno te dziedziczące po klasie 
Control, jak i pozostałe) kolorowane są na pomarańczowo z żółtymi etykietami i powiększane są stopniowo (animacja) po najechaniu kursorem myszy.
 - Zbuduj własną kontrolkę na bazie przycisku, która działa jak stoper tj. wyświetla liczbę minut, sekund i milisekund, a po kliknięciu uruchamia odliczanie. Kolejne kliknięcie wstrzymuje odliczanie, a jeszcze jedno resetuje odliczany czas. Następne kliknięcie rozpoczyna cykl od nowa.
 - Przygotuj aplikację WPF, która pozwoli na granie z komputerem w kółko i krzyżyk. Do zbudowania planszy wykorzystaj przyciski, których styl i animacje są zmodyfikowane. Istnieje algorytm wygrywający, ale można użyć także algorytmu MinMax (zob. wiele źródeł w sieci zarówno po polsku, jak i po angielsku; angielska nazwa gry to noughts and crosses lub częściej Tic-Tac-Toe). Zadbaj, aby stan gry był automatycznie wznawiany po zamknięciu i ponownym uruchomieniu aplikacji, a także żeby była możliwość rozpoczęcia gry od nowa z wyborem gracza wykonującego pierwszy ruch. Postaraj się, żeby zawartość okna aplikacji adaptowała się do zmiany rozmiaru okna.
 
Bardzo podobne zadania, ale realizowane "w duchu" MVVM, będą w drugiej części.