M.in.:
- Wstawianie kontrolek: button, layer itp.(już jest)
- Bindowanie danych(jeszcze nie dodane)
- Edycja danych podczas pracy programu(jeszcze nie dodane)
W więc do dzieła:)
Na początku przedstawię ogólną zadadę działania aplikacji WPF:
Na żółto przedstawiłem formę która uruchamia się jako pierwsza, następnie po wczytaniu zasobów uruchamia okno o nazwie MainWindow.xaml.
Klikając dwa razy na MainWindow.xaml zobaczymy pustą formę wyglądu naszej aplikacji:
Poniżej znajduje się okno z kodem XAML - gdzie możemy ręcznie edytować właściwości naszej formy:
Pierwszą rzecz którą dodamy niech będzie kontrolka button:
w Toolbox klikamy na element Button a następnie klikamy w naszej formie na miejsce gdzie chcemy umiścić naszą kontrolkę(oczywiście zawsze możemy zmienić jej pozycje już z widoku naszej formy):
Tutaj macie ułożenie mojego okna w XAML,wraz z kontrolką z następnego przykładu w razie problemów z ułożeniem swoich komponentów(skopiować i podmienić w okienku z kodem XAML):
<Window x:Class="TestWPF.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="226,160,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
<Label Content="Label" Height="47" HorizontalAlignment="Left" Margin="200,103,0,0" Name="label1" VerticalAlignment="Top" Width="138" />
<TextBox Height="23" HorizontalAlignment="Left" Margin="200,189,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" />
</Grid>
</Window>
1. Wywołanie funkcji Click: zrobimy tak aby po naciśnięciu buttona, wyświetlił się napis TEST, w tym celu musimy dodać wywołanie odpowiedniej funkcji w naszym kodzie dla naciśnięcia button robimy to w ten sposób:
1) klikamy prawym przyciskiem myszy na naszej kontrolce button i wybieramy Properties :
spowoduje to utworzenie się nowej funkcji w pliku .cs naszej formy:
Teraz wystarczy w podanej metodzie odnieść się do naszej kontrolki label wpisując odpowiednią instrukcje zmieniającą właściwość Content naszego komponentu:
Wciskamy F5 i patrzymy na efekt naszego działania, teraz po kliknięciu na button, kontrolka label zmieni swój tekst na "TEST".
2. Wprowadzanie tekstu: Ten przykład będzie natomiast modyfikacją powyższych czynności, ponieważ zamiast zdefiniowanego z góry przez nas tekstu, użytkownik będzie mógł wyświetlić swój wpisany tekst do kontrolki typu TextBox:
nim jednak do tego dojdzie należy dodać ją z Toolboxa do naszej formy:
Teraz modyfikujemy funkcję button1_Click na poniższą(oprócz tego dodajemy zmienną typu string na początku naszej klasy):
powoduje ona że po wpisaniu(lub nie) przez nas tekstu pojawia się on w label.
Edytując trochę kod funkcji możemy się ustrzec, przypadku w którym, użytkownik nie wpisze nic do textbox`a. Zrobić możemy to w ten sposób:
dzięki temu jeśli użytkownik zapomni wpisać tekstu, odpowiednia informacja w label powiadomi go o tym:)
3. Czas na kwadraty: zmienimy teraz funkcjonalność naszego kodu tak aby wyświetlał utworzony przez nas kwadrat w różnych miejscach po każdym przyciśnięciu naszego button`a. Odnośnie naszego button`a to zmienimy również jego nazwę na np. taką: "Przemiszczaj":)
W naszej formie możemy zostawić tylko nasz button i label. Bo na razie tylko one będą nam potrzebne
Dodatkowo dodajemy z Toolboxa Rectangle(kwadrat): Całość prezentuje się u mnie w te nsposób:
Oto kod XAML:
<Window x:Class="TestWPF.MainWindow"Teraz wystarczy lekko zmodyfikować kwadrat(by dowiedzieć się na jego temat coś więcej) i przystąpimy do modyfikacji funkcji Click naszego buttona by przemieszczał nasz kwadrat w losowe miejsca.
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="226,160,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
<Label Content="Label" Height="47" HorizontalAlignment="Left" Margin="200,103,0,0" Name="label1" VerticalAlignment="Top" Width="138" />
<Rectangle Height="63"
Width="150"
Margin="188,189,166,0"
Name="rectangle1"
Stroke="Black"
VerticalAlignment="Top"
Stretch="Fill" />
</Grid>
</Window>
Zwiększymy teraz linie graniczne kwadratu. Do wnętrza znacznika <Rectangle dodajemy wyrażenie:
Dzięki temu powiększymy granice naszego kwadratu.
StrokeThickness="4"
Jeśli chcemy zastosować efekt gradianu dający nam taki efekt:
musimy zmienić kod naszego kwadratu na poniższy:
<Rectangle Height="75" Margin="214,189,202,47" StrokeThickness="4">warto porównać sobie budowę tego kwadratu, z tym przed edycją, zwłaszcza na zakończenia znaczników.
<Rectangle.Fill>
<LinearGradientBrush>
<GradientStop Color="Yellow" Offset="0.0" />
<GradientStop Color="Orange" Offset="0.5" />
<GradientStop Color="Red" Offset="1.0" />
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
Więcej na ten temat na stronie:
Rysowanie kwadratu w Canvas
Painting with a Brush
Shapes and Basic Drawing in WPF Overview - czyli rysowanie podstawowych figur
Nam więcej efektów na razie nie jest potrzebne.
Dobra teraz dodajmy do naszego kwadratu jego name, tak byśmy go mogli wywołać z kodu i edytować jego właściwości:
Name="kwadrat"
Thickness[]
dzięki której możemy przechowywać nasze "pseduolosowe" pozycje kwadratu:) Można to wykonać oczywiście uniwersalnie, tak że pozycja kwadratu może być jeszcze bardziej "losowa" jednak to już trochę więcej obliczeń a nie oto nam teraz chodzi. Dodaje tutaj odpowiednie instrukcje byście nie musieli się męczyć z ich przepisaniem:Co do losowych liczb to mam nadzieję że sprawa jest już wam trochę znana, jak nie to myślę że szybko zrozumiecie o co chodzi w tym kodzie analizując go.marginesKwadratu = new Thickness[6];marginesKwadratu[0] = new Thickness(71, 160, 345, 76);marginesKwadratu[1] = new Thickness(344, 43, 72, 193);marginesKwadratu[2] = new Thickness(325, 213, 91, 23);marginesKwadratu[3] = new Thickness(147, 216, 269, 20);marginesKwadratu[4] = new Thickness(251, 75, 165, 161);marginesKwadratu[5] = new Thickness(0, 236, 416, 0);
Co do funkcji Window_Loaded to można ją utworzyć automatycznie wchodząc w Properties MainWindow czyli naszego okna, analogicznie jak do naszego buttona.
Na koniec zmienimy nazwę naszego buttona. Są na to 2 sposoby:
a) zmieniamy jego nazwę w Properties buttona na np:"Losuj pozycje":
b) zmieniamy jego nazwę programowo
Teraz wciskając klawisz F5 i wciskając button o zmienionej nazwie, możecie przetestować działanie aplikacji.