TOC

This article has been localized into Russian by the community.

Основные элементы управления:

Элемент Label

Элемент Label в своей самой простой форме выглядит практически также, как TextBlock, о котором речь шла в другой главе. Вы быстро заметите, что вместо свойства Text, Label имеет свойство Content. Смысл этого заключается в том, что Label может содержать в себе любой другой элемент, а не только текст. "Контент", как известно, может быть строкой. Рассмотрим базовый и очень простой пример:

<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>

Другое отличие, которое вы наверняка заметили, – это то, что Label по умолчанию содержит небольшие отступы, позволяющие отобразить текст на несколько пикселей дальше от левого верхнего угла. В случае с TextBlock ситуация выглядит немного иначе, ведь там эти отступы вы должны определить самостоятельно.

В простом случае, таком как рассмотренный выше, где контент это простая строка, Label фактически создаст TextBlock, для того, чтобы отобразить строку.

Label vs. TextBlock

Так для чего же нам нужен Label? Существует несколько важных различий между Label и TextBlock. TextBlock позволяет отображать только текстовые строки, в то время как Label позволяет Вам:

  • Стилизировать границы
  • Отображать другие элементы, например: изображения
  • Использовать шаблонный контент, с помощью свойства ContentTemplate
  • Использовать клавиши доступа для фокусирования на связанных элементах управления

Именно последний пункт является главной причиной для того, чтобы выбрать Label вместо TextBlock. Всякий раз, когда Вы хотите отобразить обыкновенный текст, следует использовать TextBlock, так как в большинстве случаев он будет менее ресурсоемким, чем Label.

Label и клавиши доступа

В Windows, как и в других операционных системах, распространен механизм, в котором Вы получаете доступ к элементу управления в даилоговом окне путем удержания клавиши [Alt] и нажатия на символ, соответствующий элементу управления, к которому Вы хотите получить доступ. При этом, фокус будет перенесен на элемент, символ которого был нажат при удержании [Alt]. TextBlock не поддерживает этот функционал, но Label - поддерживает. Поэтому для этикет элемент Label является обычно отличным выбором. Давайте взглянем на пример работы этого механизма:

<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>

На скриншоте показан наш пример диалогового окна при нажатой клавише [Alt]. Запустите этот пример, и, удерживая [Alt], нажмите N либо M. Вы увидите, как перемещается фокус между двумя текстовыми полями.

Итак, здесь мы можем наблюдать несколько новых концептов. Во-первых, мы определяем клавишу доступа с помощью символа подчеркивания '_' перед символом. Это не обязательно должен быть первый символ, а может быть любой в свойстве Content. Наиболее распространенным решением считается использование первого символа, который не использован в качестве клавиши доступа в другом элементе управления.

Мы использовали свойство Target для подключения Label к выбранному элементу, с помощью стандартного механизма связывания в WPF, (свойство ElementName). Эти свойства мы позже еще опишем в рамках руководства. Связывание осуществляется на основании названия элемента, так что, при его изменении Вы должны помнить о том, что необходимо модифицировать связывание для этого элемента

Использование элементов управления в качестве содержимого Label

Как было уже упомянуто, элемент Label может содержать в себе другие элементы, сохраняя свои преимущества. Давайте рассмотрим пример, в котором внутри Label у нас будут находится изображение и некоторый текст, и, при этом, будут доступны клавиши доступа для каждого Label:

<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>

Это была лишь расширенная версия предыдущего примера - вместо простой текстовой строки, Label теперь содержит в себе изображение с текстом (внутри элемента AccessText, который позволяет использовать клавиши доступа для Label). Оба этих элемента находятся внутри горизонального контейнера StackPanel, так как Label, будучи наследником элемента ContentControl, может содержать внутри себя лишь один дочерний элемент.

Элемент Image, который будет подробно описан позже, использует изображение из Интернета - такой подход не является наилучшим для реальных приложений и использован здесь лишь в целях демонстрации.

Итог

В большинстве ситуаций, элемент Label реализует именно то, о чем говорит его название - является ни чем иным, как подписью для другого элемента управления. Это его главная цель. В других случаях, вероятно, Вам стоит использовать TextBlock или любой другой из существующих в WPF контейнеров.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!