This article has been localized into Polish by the community.
Kontrolka Label
Kontrolka Label w swojej najprostszej formie wygląda bardzo podobnie do kontrolki TextBlock, której to używaliśmy w innym artykule. Szybko jednak zauważysz, że zamiast własności Text kontrolka Label posiada własność Content. Powodem tego jest fakt, że kontrolka Label może zawierać bezpośrednio w sobie każdą inną kontrolkę, a nie tylko wyłącznie tekst. Zawartość kontrolki Label może stanowić również zwykły string, co zobaczysz w pierwszym, najbardziej podstawowym przykładzie:
<Window x:Class="WpfTutorialSamples.Basic_controls.LabelControlSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="LabelControlSample" Height="100" Width="200">
<Grid>
<Label Content="This is a Label control." />
</Grid>
</Window>
Kolejną rzeczą, którą możesz zaobserwować jest to, że kontrolka Label domyślnie ma ustawiony padding (wewnętrzny margines), co pozwala na wyrenderowanie tekstu kilka pikseli od lewego-górnego rogu. Tak nie dzieje się jednak w przypadku kontrolki TextBlock, dla której padding musisz określić samodzielnie.
W prostych przypadkach jak ten, gdzie zawartość jest zwykłym stringiem kontrolka Label tak naprawdę utworzy w sobie TextBlock i pokaże string w taki sposób.
Kontrolka Label vs. kontrolka TextBlock
Dlaczego więc w ogóle korzystać z kontrolki Label? Otóż, jest kilka istotnych różnic między kontrolkami Label a TextBlock. TextBlock pokazuje wyłącznie tekst ze stringa, podczas gdy Label umożliwia również:
- Określenie ramki (obwódki)
- Renderowanie innych kontrolek np. obrazków (Image)
- Wykorzystanie szablonu zawartości poprzez własność ContentTemplate
- Wykorzystanie klawiszy dostępu, aby uczynić aktywnymi powiązane kontrolki
Ostatni podpunkt jest tak naprawdę głównym powodem, dla którego wykorzystuje się kontrolkę Label zamiast TextBlock. Kiedy chcesz wyrenderować prosty tekst powinieneś wykorzystać TextBlock, ze względu na to że kontrolka ta jest lżejsza i w większości przypadków wydajniejsza niż Label.
Kontrolka Label i klawisze dostępu (mnemoniki)
Windows i inne systemy operacyjne umożliwiają dostęp do kontrolek dialogowych poprzez przytrzymanie klawisza [Alt] i wciśnięcie litery odpowiadającej kontrolce, do której chcesz uzyskać dostęp. Znak, który należy wcisnąć zostanie wyróżniony w momencie gdy przytrzymasz [Alt]. Kontrolka TextBlock nie wspiera tej funkcjonalności, ale Label tak, tak więc aby zarządzać etykietami wybór kontrolki Label jest z reguły najlepszym z możliwych. Spójrzmy teraz na praktyczny przykład:
<Window x:Class="WpfTutorialSamples.Basic_controls.LabelControlSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="LabelControlSample" Height="180" Width="250">
<StackPanel Margin="10">
<Label Content="_Name:" Target="{Binding ElementName=txtName}" />
<TextBox Name="txtName" />
<Label Content="_Mail:" Target="{Binding ElementName=txtMail}" />
<TextBox Name="txtMail" />
</StackPanel>
</Window>
Screenshot pokazuje nasz przykładowy dialog w momencie gdy przytrzymywany jest klawisz [Alt]. Spróbuj uruchomić dialog i przytrzymaj klawisz [Alt] wciskając [N] lub [M]. Zobaczysz jak aktywność przechodzi z jednej kontrolki TextBox na drugą.
Mamy tu więc kilka nowych rozwiązań. Po pierwsze definiujemy klawisz dostępu umieszczając podkreślnik (_) przed znakiem. Nie musi być to pierwsza litera, podkreślnik możemy wstawić przed dowolnie wybranym znakiem wewnątrz kontrolki Label. Powszechną praktyką jest używanie pierwszego znaku, który nie został dotychczas wykorzystany jako klawisz dostępu dla innej kontrolki.
Wykorzystujemy własność Target aby połączyć Label ze wskazaną kontrolką. Używamy standardowego bindowania WPF aby to uczynić, wykorzystując własność ElementName, wszystko to omówimy w kolejnych rozdziałach niniejszego kursu. Bindowanie działa w oparciu o nazwę kontrolki, tak więc jeśli zmienisz jej nazwę, będziesz musiał pamiętać o poprawie bindowania.
Używanie kontrolek we wnętrzu Label
Jak już wspomniano, kontrolka Label pozwala na umieszczanie w jej wnętrzu innych kontrolek, nie tracąc przy tym pozostałych jej zalet. Sprawdźmy przykład, w którym mamy zarówno obrazek (Image) jak i trochę tekstu wewnątrz kontrolki Label, a także przypisane klawisze dostępu do każdej z etykiet.
<Window x:Class="WpfTutorialSamples.Basic_controls.LabelControlAdvancedSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="LabelControlAdvancedSample" Height="180" Width="250">
<StackPanel Margin="10">
<Label Target="{Binding ElementName=txtName}">
<StackPanel Orientation="Horizontal">
<Image Source="http://cdn1.iconfinder.com/data/icons/fatcow/16/bullet_green.png" />
<AccessText Text="_Name:" />
</StackPanel>
</Label>
<TextBox Name="txtName" />
<Label Target="{Binding ElementName=txtMail}">
<StackPanel Orientation="Horizontal">
<Image Source="http://cdn1.iconfinder.com/data/icons/fatcow/16/bullet_blue.png" />
<AccessText Text="_Mail:" />
</StackPanel>
</Label>
<TextBox Name="txtMail" />
</StackPanel>
</Window>
Jest to rozbudowana wersja poprzedniego przykładu - zamiast prostego tekstu ze stringa, nasza kontrolka Label zawiera w sobie zarówno obrazek (Image) jak i tekst (wewnątrz kontrolki AccessText, która pozwala na używanie klawiszy dostępu dla etykiet). Obie kontrolki umieszczone są wewnątrz kontenera StackPanel, ponieważ Label, podobnie jak każda inna kontrolka dziedzicząca z klasy ContentControl może bezpośrednio posiadać wyłącznie jedną kontrolkę potomną.
Kontrolka Image (obrazek) opisana w kolejnych rozdziałach niniejszego kursu, wykorzystuje zdalny obrazek - to co zobaczyłeś to TYLKO przykład do demonstracji. Nie jest dobrym pomysłem stosować go w taki sposób w codziennych zastosowaniach.
Podsumowanie
W większości sytuacji kontrolka Label (etykieta) stosowana jest do tego na co wskazuje jej nazwa: jako etykieta tekstowa dla innej kontrolki. To jest jej główne zadanie. W większości innych przypadków najprawdopodobniej powinieneś użyć kontrolki TextBlock lub innej renderującej tekst, którą oferuje WPF.