właściwość Cursor można ustawić dla każdego elementu
kursory systemowe dostępne jako statyczne właściwości klasy Cursors:
button1.Cursor = Cursors.Wait;
a w XAMLu:
<Button Cursor="Help">Help</Button>
jeśli ustawienia kursora się nakładają (np. okna i kontrolki na nim umieszczonej) –
wybierana jest właściwość bardziej specyficzna (czyli nad kontrolką jest kursor kontrolki, a nad resztą okna – kursor okna)
przeciwdziała temu:
ForceCursor – aby ojciec nadpisał kursora dzieci
inne rozwiązanie – kursor dla każdego elementu każdego okna aplikacji:
Mouse.OverrideCursor = Cursors.Wait;
własne kursory:
this.Cursor = new Cursor(Path.Combine(applicationDir, "mycursor.ani"));
Expander
Ukrywa swoją zawartość, którą użytkownik może rozwinąć.
IsExpanded – sterujemy rozwinięciem/zwinięciem
ExpandDirection – kierunek rozwijania (domyślne Down lub Up, Left, Right)
<StackPanel>
<Expander Header="pierwsza">...</Expander>
<Expander Header="druga">
<StackPanel>
...
</StackPanel>
</Expander>
<Expander Header="trzecia">...</Expander>
</StackPanel>
Kontrolki tekstowe: TextBox Wprowadzanie kilku linijek tekstu:
AcceptsReturn – ustawione na true pozwala na wprowadzanie Enterów
AcceptsTab – podobnie z Tabami
TextWrapping (ustawiona na Wrap lub WrapWithOverflow) – zawijanie zbyt długich wierszy (WrapWithOverflow pozwala wypływać poza kontrolkę zbyt długim liniom, Wrap zawsze łamie tekst)
<TextBox TextWrapping="Wrap" Margin="3">
AlamakotaAlamakota Alamakota</TextBox>
<TextBox TextWrapping="WrapWithOverflow" Margin="3">
AlamakotaAlamakota Alamakota</TextBox>
Ponadto:
MinLines i MaxLines pozwalają na ustawienie rozmiaru kontrolki aby była w stanie wyświetlić zadeklarowaną liczbę linii
LineCount – pozwala sprawdzić faktyczną liczbę linii
VerticalScrollBarVisibility – ustawiając na Visible lub Auto dodajemy pasek przewijania
IsReadOnly – tekst tylko do odczytu (ale pozwala wybrać go i skopiować w odróżnieniu od etykiety)
Text – zawartość tekstowa
Text Selection:
<TextBox Name="box">Ala ma kota. Ala ma kota</TextBox>
<Button Click="klik">zaznacz</Button>
private void klik(object sender, RoutedEventArgs e) {
box.SelectionStart = 5;
box.SelectionLength = 5;
box.SelectedText = "xxx";
box.Focus();
}
Focus() – przejęcie „fokusa”
<DockPanel>
<Label DockPanel.Dock="Left">Dane</Label>
<Button DockPanel.Dock="Right" Click="Clear">Wyczyść</Button>
<TextBox Name="tekst"/>
</DockPanel>
private void Clear(object sender, RoutedEventArgs e) {
tekst.Text = "";
tekst.Focus();
}
Kontrolka, która aktualnie przyjmuje wejście z klawiatury, ma „focusa”.
właściwość Focusable – czy może przyjąć focusa
Przechodzenie Tabem – na podstawie hierarchii zagnieżdżenia.
o Można to zmienić, wybierając własną sekwencję przez ustawienie właści-wości TabIndex (0 – pierwszy, a potem wraz ze wzrostem).
o IsTabStop – jeśli false, to danego elementu nie zwiedzamy Tabem (ale
na-PasswordBox
Password – pozwala pobrać hasło
(hasło przechowywane jest w pamięci w postaci zaszyfrowanej)
<StackPanel>
<DockPanel>
<Label Margin="3">Hasło</Label>
<PasswordBox Name="hasło" Margin="3"/>
</DockPanel>
<Button HorizontalAlignment="Center" Margin="3" Padding="15,3"
Click="OkClick">OK</Button>
</StackPanel>
private void OkClick(object sender, RoutedEventArgs e) {
MessageBox.Show("Twoje hasło to " + hasło.Password + "!");
}
Range-Based Controls (ScrollBar, Slider, ProgressBar)
Przyjmują pewną wartość z ustalonego zakresu
Value (aktualna wartość) – jej zmiana odpala ValueChanged
Maximum i Minimum – dolny i górny zakres Slider:
Orientation – w poziomie czy w pionie?
TickPlacement – None, TopLeft lub BottomRight
TickFrequency – odległość między tickami
IsSnapToTickEnabled – doklejanie do ticków
<Slider Minimum="1" Value="15" Maximum="100" TickFrequency="10"
TickPlacement="TopLeft"/>
Ticks – kolekcja położeń (jeśli np. mają być nieregularnie rozmieszczone)
IsSelectionRangeEnabled – wybór zakresu na ścieżce (użyteczne np. w media playerach) (przy pomocy SelectionStart i SelectionEnd)
<Slider Margin="5" Value="1.5"/>
<Slider Margin="5" Value="1.5" TickFrequency="1"
TickPlacement="BottomRight"/>
<Slider Margin="5" Value="1.5" Ticks="1,2,3,5,8"
TickPlacement="BottomRight"/>
<Slider Margin="5" Value="1.5" TickFrequency="2.5"
TickPlacement="BottomRight" IsSelectionRangeEnabled="True"
SelectionStart="3" SelectionEnd="7"/>
Inny przykład:
<StackPanel Margin="5">
<Slider Margin="5" Minimum="10" Maximum="50" Value="12"
TickFrequency="5" TickPlacement="BottomRight"
ValueChanged="slide"/>
<Label HorizontalAlignment="Center">
To jest test slidera.
</Label>
</StackPanel>
private void slide(object sender,
RoutedPropertyChangedEventArgs<double> e) {
this.FontSize = e.NewValue;
}
ProgressBar
Nie zapewnia interakcji, a jedynie wyświetla jakąś informację dla użytkownika.
Pozwala też na stan nieokreślony (gdy nie wiemy ile czasu potrwa zdarzenie):
<ProgressBar Value="50" Height="18"/>
<ProgressBar Height="18" IsIndeterminate="True" />
Menu
Mamy dostępne dwie kontrolki: Menu (menu aplikacji) i ContextMenu (menu kontekstowe).
Menu:
o Podlega zwyczajnym regułom rozmieszczania elementów (przeważnie jest na szczycie DockPanela lub w pierwszym wierszu Grida).
o Można dodać dowolną liczbę menu.
o Własność IsMainMenu ustawiona na true powoduje, że menu dostanie focusa po naciśnięciu klawisza Alt lub F10.
ContextMenu:
o Nie jest umieszczane w oknie, lecz ustawiane dla konkretnego elementu.
MenuItem
Menu zbudowane jest z elementów typu MenuItem oraz Separator.
MenuItem to rozwijalne podmenu.
Separator to po prostu pozioma linia, nie reagująca na wejście użytkownika.
Menu możemy (teoretycznie) wypełniać dowolnymi elementami (ale lepiej nie przesadzać).
<Menu DockPanel.Dock="Top">
<MenuItem Header="File">
<MenuItem Header="New"/>
<MenuItem Header="Open"/ >
<MenuItem Header="Save"/>
<Separator></Separator>
<MenuItem Header="Exit"/>
</MenuItem>
<MenuItem Header="Edit">
<MenuItem Header="Undo"/>
<MenuItem Header="Redo"/>
<Separator></Separator>
<MenuItem Header="Cut"/>
<MenuItem Header="Copy"/>
<MenuItem Header="Paste"/>
</MenuItem>
</Menu>
MenuItem reaguje na kliknięcie zdarzeniem Click.
Wyświetla: tekst (Header), ikonę (Icon), znacznik wyboru (IsChecked – wybranie dodatkowo IsCheckable kliknięcie zmienia stan wyboru), skrót klawiaturowy (InputGestureText – to jest tylko tekstu skrótu, nie zapewnia to obsługi).
ToolBar i StatusBar
<ToolBar DockPanel.Dock="Top">
<Button>New</Button>
<Button>Open</Button>
<Button>Save</Button>
<Separator/>
<Button>Cut</Button>
<Button>Copy</Button>
<Button>Paste</Button>
</ToolBar>
<StatusBar DockPanel.Dock="Bottom">
<Label>Ready</Label>
</StatusBar>
Items Controls – kontrolki elementów
Pozwalają na wyświetlanie listy wielu elementów.
ListBox
SelectionMode można ustawić na: Multiple (wybieramy kilka klikając na nich) lub Extended (klikając z Ctrl lub Shift)
<ListBox SelectionMode="Multiple">
<ListBoxItem>jeden</ListBoxItem>
<ListBoxItem>dwa</ListBoxItem>
<ListBoxItem>trzy</ListBoxItem>
<ListBoxItem>cztery</ListBoxItem>
</ListBox>
Na liście można umieszczać też inne elementy:
<ListBox>
<ListBoxItem>
<Image Source="uwaga.png"></Image>
</ListBoxItem>
<ListBoxItem>
<Image Source="error.png"></Image>
</ListBoxItem>
</ListBox>
a nawet:
<ListBox>
<StackPanel Orientation="Horizontal">
<Image Source="uwaga.png" Width="30" Height="30"></Image>
<Label VerticalContentAlignment="Center">uwaga</Label>
</StackPanel>
<StackPanel Orientation="Horizontal">
<Image Source="error.png" Width="30" Height="30"></Image>
<Label VerticalContentAlignment="Center">błąd</Label>
</StackPanel>
</ListBox>
pozwala to stworzyć listę wyboru:
<ListBox SelectionMode="Extended" Name="lista"
SelectionChanged="lst_SelChanged"
CheckBox.Click="lst_SelChanged">
<CheckBox>jeden</CheckBox>
<CheckBox>dwa</CheckBox>
<CheckBox>trzy</CheckBox>
<CheckBox>cztery</CheckBox>
</ListBox>
<Label Name="opis"/>
private void lst_SelChanged(object sender, EventArgs e) { StringBuilder str = new StringBuilder();
foreach (CheckBox item in lista.Items) {
ComboBox
działa podobnie jak ListBox, ale ukazuje jedynie jeden wybrany element
<ComboBox IsEditable="True">
<ComboBoxItem>jeden</ComboBoxItem>
<ComboBoxItem>dwa</ComboBoxItem>
<ComboBoxItem>trzy</ComboBoxItem>
<ComboBoxItem>cztery</ComboBoxItem>
</ComboBox >
Właściwość IsEditable ustawiona na true pozwala użytkownikowi wprowadzić własną wartość.
Programistyczny dostęp do listy elementów:
<DockPanel Margin="3">
<ToolBar DockPanel.Dock="Top">
<Button Click="Dodaj">Dodaj</Button>
<Button Click="Usuń">Usuń</Button>
</ToolBar>
<ListBox Margin="3" Name="lista"/>
</DockPanel>
private void Dodaj(object sender, RoutedEventArgs e) {
lista.Items.Add(new ListBoxItem { Content="nowy element" });
}
private void Usuń(object sender, RoutedEventArgs e) {
if(lista.SelectedIndex >= 0)
lista.Items.RemoveAt(lista.SelectedIndex);
}