Обзор контрола ListView¶
ListViewControl
- это расширенный контрол для отображения списка элементов в одном или нескольких столбцах. Контрол поддерживает различные макеты расположения элементов, сортировку, группировку, фильтрацию и выбор элементов.
Вы можете использовать ListView для эмуляции пользовательского интерфейса правой панели проводника Microsoft Windows.
ListView поддерживает шаблон проектирования MVVM для отображения элементов. Контрол извлекает элементы из связанного источника объекта и отображает их с использованием указанного шаблона элемента. Вам нужно определить шаблон, чтобы рисовать элементы так, как вы хотите. Например, шаблон может указывать ListView рисовать элементы в виде значков, значков с текстом или просто текста.
Начало работы¶
Предоставляйте элементы в ListView¶
Используйте свойство ListViewControl.ItemsSource
, чтобы привязать контрол к коллекции объектов, которые будут отображаться как элементы ListView.
Шаблон элемента¶
Чтобы отобразить элементы определенным образом, укажите шаблон элемента со свойством ListViewControl.ItemTemplate
. ListView не отображает свои элементы без этого шаблона.
ItemTemplate's DataContext: Объект элемента из коллекции ListViewControl.ItemsSource
.
Пример¶
В следующем примере ListView заполняется элементами из коллекции SvgIconsBrowserViewModel.Categories и определяется шаблон для отображения элементов. Смотрите полный код этого примера в модуле SVG Icons Browser.
Класс SvgIconCategoryViewModel в приведенном ниже коде инкапсулирует элементы в коллекции связанных элементов. Шаблон элемента ListView состоит из флажка, за которым следует текстовое поле. Флажок и текстовые поля привязаны к свойствам SvgIconCategoryViewModel.IsChecked и SvgIconCategoryViewModel.DisplayName соответственно.
<mxlv:ListViewControl ItemLayoutMode="Stack" ItemHeight="28" ItemsSource="{Binding Categories}" >
<mxlv:ListViewControl.ItemTemplate>
<DataTemplate DataType="vm:SvgIconCategoryViewModel">
<Grid ColumnDefinitions="Auto, *">
<CheckBox IsChecked="{Binding IsChecked}" Margin="0,0,4,0" VerticalAlignment="Center"/>
<TextBlock Grid.Column="1" Text="{Binding DisplayName}" VerticalAlignment="Center"/>
</Grid>
</DataTemplate>
</mxlv:ListViewControl.ItemTemplate>
</mxlv:ListViewControl>
public partial class SvgIconsBrowserViewModel : PageViewModelBase
{
[ObservableProperty] private List<SvgIconCategoryViewModel> categories;
//...
}
public partial class SvgIconCategoryViewModel : ObservableObject, IComparable<SvgIconCategoryViewModel>, IComparable
{
[ObservableProperty] private bool isChecked;
[ObservableProperty] private string name;
[ObservableProperty] private string displayName;
[ObservableProperty] private bool isExpanded;
//...
}
Расположение элементов¶
Контрол ListView поддерживает два режима расположения элементов: Wrap
(по умолчанию) и Stack
. Используйте свойство ListViewControl.ItemLayoutMode
, чтобы выбрать требуемый макет.
Wrap Размещение¶
Установите для свойства ListViewControl.ItemLayoutMode
значение ListViewItemLayoutMode.Wrap
, чтобы разместить элементы поперек, а затем вниз. Элементы автоматически переносятся по правому краю контрола, создавая несколько линий.
Все элементы имеют один размер. Размер элемента по умолчанию вычисляется на основе данных первого элемента в соответствии с указанным шаблоном (ListViewControl.ItemTemplate
).
Вы можете использовать свойства ListViewControl.ItemWidth
и ListViewControl.ItemHeight
, чтобы указать пользовательский размер элемента для ListView.
Stack Размещение¶
Установите для свойства ListViewControl.ItemLayoutMode
значение ListViewItemLayoutMode.Stack
, чтобы разместить элементы в вертикальном списке. Элементы растягиваются, подгоняя их по ширине к LayoutView.
В режиме размещения Stack
вы можете использовать свойство ListViewControl.ItemHeight
для указания пользовательской высоты элемента.
Сортировка элементов¶
Вы можете отсортировать элементы ListView по одному или нескольким свойствам элемента в порядке возрастания или убывания. Чтобы отсортировать элементы, добавьте объект(ы) ListViewSortInfo
в коллекцию ListViewControl.SortInfo
. Эта коллекция также используется для определения "группировки" элемента .
Объект ListViewSortInfo
содержит следующие свойства для настройки свойств сортировки:
ListViewSortInfo.FieldName
— Указывает свойство элемента, по которому сортируются элементы ListView.ListViewSortInfo.SortDirection
— Указывает порядок, в котором сортируются элементы ListView. Порядок сортировки по умолчанию - по возрастанию.
Пример - Сортировка элементов¶
В следующем примере элементы сортируются по их свойствам ShipCountry и Date. Контрол сначала сортирует элементы по свойству ShipCountry в порядке возрастания, объединяя их в подмножества с одной и той же страной доставки. Затем контрол сортирует элементы в пределах каждого подмножества элементов по свойству Date в порядке убывания.
<mxlv:ListViewControl Name="listViewControl1" ItemsSource="{Binding Items}" >
<mxlv:ListViewControl.SortInfo>
<mxlv:ListViewSortInfo FieldName="ShipCountry" SortDirection="Ascending" />
<mxlv:ListViewSortInfo FieldName="Date" SortDirection="Descending"/>
</mxlv:ListViewControl.SortInfo>
</mxlv:ListViewControl>
public partial class MainWindowViewModel : ViewModelBase
{
[ObservableProperty]
private List<ItemViewModel> items;
//...
}
public partial class ItemViewModel : ObservableObject
{
[ObservableProperty] private int invoiceId;
[ObservableProperty] private string shipCountry;
[ObservableProperty] private DateTime date;
//...
}
Групповые элементы¶
Группировка позволяет объединять элементы с одинаковыми значениями в одни и те же распахиваемые группы.
Например, если объект элемента содержит свойство ShipCountry, вы можете сгруппировать его по этому свойству, чтобы получить следующий результат:
Каждой группе элементов предшествует группирующая строка. В строках группы отображаются имена и значения свойств группы. Пользователь может нажать кнопку сворачивания/развертывания группирующей строки, чтобы скрыть/показать содержимое группы.
Обратите внимание, что при группировании по свойству группирующей строки автоматически сортируются по свойству group. В коде вы можете выбирать между порядком возрастания и убывания строк группы при применении группировки.
Чтобы сгруппировать по свойству элемента или свойствам, выполните следующие действия:
-
Добавьте объект(ы)
ListViewSortInfo
в начало коллекцииListViewControl.SortInfo
. УстановитеListViewSortInfo.FieldName
в свойство элемента, по которому следует группировать элементы. При необходимости используйтеListViewSortInfo.SortDirection
, чтобы выбрать между порядком сортировки по возрастанию и убыванию, в котором будут размещены группирующие строки. -
Установите для свойства
ListViewControl.GroupCount
значение количества уровней группы (group properties).ListViewControl.GroupCount
указывает, сколько объектовListViewSortInfo
, начиная с начала коллекцииListViewControl.SortInfo
, используется для группировки данных. Если вы группируете по одному свойству элемента, установите дляListViewControl.GroupCount
значение 1. Чтобы сгруппировать по двум свойствам, установите дляListViewControl.GroupCount
значение 2 и так далее.
Коллекция ListViewControl.SortInfo
может содержать больше элементов, чем ListViewControl.GroupCount
. Первые элементы, номер которых указан GroupCount
, используются для группировки элементов ListView. Остальные элементы используются для сортировки элементов ListView.
Пример - Группировка элементов¶
Предположим, что объект элемента содержит свойство ShipCountry. Чтобы сгруппировать по этому свойству, объект ListViewSortInfo
, который ссылается на свойство ShipCountry, необходимо поместить в начало коллекции ListViewControl.SortInfo
. Свойству ListViewControl.GroupCount
должно быть присвоено значение 1
.
<mxlv:ListViewControl Name="lv" ItemsSource="{Binding Items}" ItemHeight="40" ItemWidth="40"
ItemLayoutMode="Wrap"
GroupCount="1">
<mxlv:ListViewControl.SortInfo>
<mxlv:ListViewSortInfo FieldName="ShipCountry" SortDirection="Ascending" />
</mxlv:ListViewControl.SortInfo>
</mxlv:ListViewControl>
public partial class MainWindowViewModel : ViewModelBase
{
[ObservableProperty]
private List<ItemViewModel> items;
}
public partial class ItemViewModel : ObservableObject
{
[ObservableProperty] private int invoiceId;
[ObservableProperty] private string shipCountry;
[ObservableProperty] private DateTime date;
[ObservableProperty] private IImage flag;
//...
}
Пользовательский шаблон группирующей строки¶
Если шаблон групповой строки по умолчанию не соответствует вашим потребностям, вы можете использовать свойство ListViewControl.GroupTemplate
, чтобы указать пользовательский шаблон данных для отрисовки групповых строк.
GroupTemplate's DataContext: Объект Eremex.AvaloniaUI.Controls.ListView.Data.ListViewGroupData
Объект ListViewGroupData
, хранящийся в DataContext шаблона, предоставляет следующие свойства, которые помогут вам получить информацию о строках группы и настроить шаблон группирующей строки:
ListViewGroupData.FieldName
— имя свойства группы.ListViewGroupData.GroupValue
— Значение свойства group.ListViewGroupData.GroupValueDisplayText
— Текстовое представление значения свойства group. Вы можете предоставить пользовательский текст для отображения значения группы, обработав событиеListViewControl.CustomGroupValueDisplayText
.ListViewGroupData.IsExpanded
— Указывает, будет ли группа развернута или свернута.ListViewGroupData.Level
— Групповой уровень группы. Для строк группы на корневом уровне свойствоListViewGroupData.Level
возвращает значение0
. Для групповых строк на втором уровне свойствоListViewGroupData.Level
возвращает значение1
и так далее.
Для пользовательского шаблона может потребоваться другая высота группирующей строки. Вы можете задать высоту строки пользовательской группы с помощью свойства ListViewControl.GroupHeight
.
Пример - Пользовательский шаблон группирующей строки¶
В следующем примере определяется пользовательский шаблон для группирующих строк с использованием свойства ListViewControl.GroupTemplate
. Шаблон состоит из текстового блока, который отображает значение группы, и контрола с картинкой, который отображает картинку SVG, связанную со строкой группы.
В примере предполагается, что проект содержит картинки brazil-flag.svg и china-flag.svg в папке Assets. Все картинки должны иметь свойство Build Action, установленное в значение AvaloniaResource. Для чтения картинок из файлов в приведенном ниже коде используется вспомогательный класс Eremex.AvaloniaUI.Controls.Utils.ImageLoader
.
xmlns:mxlv="https://schemas.eremexcontrols.net/avalonia/listview"
xmlns:mxlvd="using:Eremex.AvaloniaUI.Controls.ListView.Data"
xmlns:vm="using:ListView_example.ViewModels"
<mxlv:ListViewControl Name="listViewControl1" ItemsSource="{Binding Items}"
ItemHeight="70" ItemWidth="100"
GroupCount="1"
GroupHeight="40">
<mxlv:ListViewControl.SortInfo>
<mxlv:ListViewSortInfo FieldName="ShipCountry" SortDirection="Ascending" />
</mxlv:ListViewControl.SortInfo>
<mxlv:ListViewControl.GroupTemplate>
<DataTemplate DataType="mxlvd:ListViewGroupData">
<StackPanel Orientation="Horizontal" >
<Image Height="20"
Source="{Binding GroupValue, Converter={vm:CountryNameToFlagConverter}}}"
Margin="0,0,5,0" VerticalAlignment="Center"/>
<TextBlock Text="{Binding GroupValueDisplayText}" VerticalAlignment="Center"/>
</StackPanel>
</DataTemplate>
</mxlv:ListViewControl.GroupTemplate>
using Eremex.AvaloniaUI.Controls.Utils;
namespace ListView_example.ViewModels;
public class CountryNameToFlagConverter : MarkupExtension, IValueConverter
{
public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
{
if (value == null)
return null;
string countryName = ((string)value).ToLower();
return ImageLoader.LoadSvgImage(Assembly.GetExecutingAssembly(), $"Assets/{countryName}-flag.svg");
}
public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
}
Текст пользовательского группового значения¶
Строки группы отображают текстовое представление значений группы по умолчанию. Вы можете обработать событие ListViewControl.CustomGroupValueDisplayText
, чтобы переопределить текст отображения значений группы. Это событие срабатывает повторно для каждой группирующей строки.
Определение строк группы¶
Элементы ListView и строки групп могут быть идентифицированы с помощью indexes. Строкам группы присваиваются отрицательные индексы, в то время как элементы имеют неотрицательные индексы. Помимо индексов, вы можете идентифицировать групповые строки по групповым значениям.
Смотрите следующий раздел для получения более подробной информации: Идентификация и получение элементов и группировка строк .
API, связанный с группировкой¶
ListViewControl.GroupHeight
— определяет высоту группирующей строки.ListViewControl.GroupLevelIndent
— Указывает отступ перед строками вложенной группы (на втором и более низких уровнях).ListViewControl.AutoExpandAllGroups
— Позволяет отключить автоматическое распахивание строк группы при загрузке контрола.ListViewControl.CollapseAllGroups
— Сворачивает все группирующие строки.ListViewControl.CollapseGroup
— Сворачивает определенную строку группы.ListViewControl.ExpandAllGroups
— Расширяет все группирующие строки.ListViewControl.ExpandGroup
— Расширяет строку определенной группы.ListViewControl.IsGroupExpanded
— Возвращает, распахнута ли определенная группа.
Смотрите также: Методы для перехода по строкам группы и их дочерним элементам .
Фильтровать элементы¶
Обработайте событие ListViewControl.FilterItem
, чтобы динамически настроить видимость определенных элементов ListView. Это событие срабатывает повторно для каждого элемента в коллекции ListViewControl.ItemsSource
. Чтобы скрыть определенный элемент, установите для параметра события e.Visible
значение false
.
Если правила фильтрации элементов динамически изменяются в вашем приложении, вам может потребоваться принудительно повторно активировать механизм фильтрации элементов и, следовательно, событие ListViewControl.FilterItem
. Чтобы сделать это, вызовите метод ListViewControl.RefreshData
.
Пример¶
Следующий пример из модуля SVG Icons Browser скрывает элементы в соответствии с определенным условием.
private void ListViewControl_OnFilterItem(object sender, ListViewFilterEventArgs e)
{
((SvgIconsBrowserViewModel)DataContext)?.OnCustomFilter(e);
}
public partial class SvgIconsBrowserViewModel : PageViewModelBase
{
public void OnCustomFilter(ListViewFilterEventArgs e)
{
SvgIconViewModel vm = (SvgIconViewModel)e.Item;
e.Visible = vm.Category.IsChecked && (string.IsNullOrEmpty(SearchText) || vm.Name.Contains(SearchText, StringComparison.OrdinalIgnoreCase));
}
}
Идентифицируйте и получайте элементы и группируйте строки¶
ListView присваивает indexes элементам ListView и строкам групп, чтобы разрешить их идентификацию.
- Индексы отражают порядок расположения элементов и группируют строки.
- Элементы нумеруются с использованием неотрицательных индексов, начинающихся с нуля. Самый верхний элемент имеет индекс 0, второй элемент имеет индекс 1 и так далее.
- Строки групп нумеруются с использованием отрицательных индексов. Верхняя группирующая строка имеет индекс -1, вторая группирующая строка имеет индекс -2 и так далее.
- Индексы используются для идентификации как видимых, так и скрытых (внутри свернутых групп) элементов.
- Когда порядок расположения элементов изменяется (например, при сортировке или группировке данных), элементам присваиваются новые индексы в соответствии с их новыми позициями.
- Индексы не присваиваются элементам, которые скрыты из-за фильтрации данных.
Когда элементы не сгруппированы, индексы соответствуют видимым индексам:
Когда элементы сгруппированы, индексы и видимые индексы не совпадают:
Специальные указатели¶
ListView резервирует следующий предопределенный индекс для идентификации недопустимых элементов:
- Константа
ListViewControl.InvalidItemIndex
— идентифицирует элемент, который не существует в контроле ListView. Это значение может быть возвращено методами ListView, используемыми для получения индексов элементов.
Например, элементы на корневом уровне не имеют родителей. Если вы попытаетесь получить родительский элемент корневого элемента с помощью метода ListViewControl.GetParentItemIndex
, этот метод вернет константу ListViewControl.InvalidItemIndex
.
Исходные элементы и индексы исходных элементов¶
Каждый элемент ListView соответствует определенному бизнес-объекту в привязанном источнике объекта (ListViewControl.ItemsSource
). Позиция элемента в источнике объекта называется source item index.
Вы можете использовать следующие методы для получения нижележащего исходного элемента и индекса исходного элемента.
ListViewControl.GetSourceItemIndexByItemIndex
ListViewControl.GetSourceItemIndexByVisibleItemIndex
Чтобы выполнить обратное преобразование индексов, ознакомьтесь со следующими методами:
ListViewControl.GetItemIndexBySourceItemIndex
ListViewControl.GetVisibleItemIndexBySourceItemIndex
Индексы исходных элементов начинаются с нуля. Когда вы сортируете, группируете или фильтруете элементы, индексы их исходных элементов не изменяются.
Строки группы не имеют соответствующих элементов в источнике объекта, поэтому к ним нельзя обратиться с помощью исходных элементов и индексов исходных элементов.
Связанный API¶
ListView предоставляет элементы API для извлечения элементов по индексам и преобразования между индексами элементов, индексами видимых элементов и индексами исходных элементов. В следующем списке обобщена эта информация:
ListViewControl.FocusedItemIndex
— Указывает индекс сфокусированной строки элемента/группы. Это свойство позволяет вам сфокусировать определенный элемент или строку группы.ListViewControl.GetItemIndexBySourceItemIndex
— Возвращает индекс элемента по индексу исходного элемента.ListViewControl.GetItemIndexByVisibleItemIndex
— Возвращает индекс элемента по видимому индексу элемента.ListViewControl.GetSourceItemIndexByItemIndex
— Возвращает индекс исходного элемента для элемента с указанным индексом.ListViewControl.GetSourceItemIndexByVisibleItemIndex
— Возвращает индекс исходного элемента для элемента с указанным видимым индексом.ListViewControl.GetVisibleItemIndexByItemIndex
— Возвращает видимый индекс элемента по индексу элемента.ListViewControl.GetVisibleItemIndexBySourceItemIndex
— Возвращает видимый индекс элемента по индексу исходного элемента.
Методы прохождения по строкам групп и их дочерним элементам¶
ListViewControl.GetGroupChildItemIndex(int childIndex)
— Возвращает индекс определенной строки корневой группы. ПараметрchildIndex
определяет порядок строк целевой корневой группы, начинающийся с нуля, среди ее одноуровневых элементов. Этот параметр принимает значения от0
доGetGroupChildrenCount() - 1
.ListViewControl.GetGroupChildItemIndex(int itemIndex, int childIndex)
— Возвращает индекс дочернего элемента или строки вложенной группы. ПараметрitemIndex
определяет индекс строки родительской группы. ПараметрchildIndex
определяет порядок, начинающийся с нуля, для целевого дочернего элемента или группирующей строки среди его одноуровневых элементов. Этот параметр принимает значения от0
доGetGroupChildrenCount(itemIndex) - 1
.ListViewControl.GetGroupChildrenCount()
— Эта перегрузка без параметров возвращает количество строк группы на корневом уровне.-
ListViewControl.GetGroupChildrenCount(int itemIndex)
— Возвращает количество непосредственных дочерних элементов в строке определенной группы. Строка родительской группы определяется по ее индексу. -
ListViewControl.GetGroupIndex
— Возвращает индекс группирующей строки по имени поля строки и значению группы. ListViewControl.GetGroupValue
— Возвращает значение группирующей строки по индексу строки.ListViewControl.GetParentItemIndex
— Возвращает индекс строки родительской группы для вложенного элемента или группирующей строки.
Обратите
The methods above are not in effect if items are not grouped.
Фокус на элементе¶
Когда пользователь переходит к определенному элементу или строке группы с помощью клавиатуры или щелчка мыши, ListView перемещает фокус на этот элемент/строку группы.
Вы можете использовать следующие свойства, чтобы получить/установить сфокусированную строку элемента/группы в коде:
-
ListViewControl.FocusedItem
— Получает или устанавливает бизнес-объект из коллекцииListViewControl.ItemsSource
, который соответствует сфокусированному элементу ListView. Чтобы переместить фокус на определенный элемент, вы можете присвоить объекту из коллекцииItemsSource
свойствоFocusedItem
.Записка
The
FocusedItem
property returnsnull
if a group row is focused. You cannot use this property to focus a group row. -
ListViewControl.FocusedItemIndex
— Получает или устанавливает индекс строки сфокусированного элемента/группы. Вы можете использовать свойствоFocusedItemIndex
, чтобы переместить фокус на элемент или строку группы.
Следующий код фокусируется на строке группы, в поле ShipCountry которой задано значение "Индия".
int groupRowindex = listViewControl1.GetGroupIndex("ShipCountry", "India");
if(groupRowindex != ListViewControl.InvalidItemIndex)
listViewControl1.FocusedItemIndex = groupRowindex;
Пример - Реакция на фокусировку элемента¶
Следующий пример связывает свойство ListViewControl.FocusedItem
со свойством MainWindowViewModel.FocusedItem. Вы можете реагировать на изменения в сфокусированном элементе в настройщике свойств MainWindowViewModel.FocusedItem.
xmlns:mxlv="https://schemas.eremexcontrols.net/avalonia/listview"
<mxlv:ListViewControl Name="listViewControl1" ItemsSource="{Binding Items}"
FocusedItem="{Binding FocusedItem, Mode=TwoWay}">
</mxlv:ListViewControl>
public partial class MainWindowViewModel : ViewModelBase
{
ItemViewModel focusedItem;
ItemViewModel FocusedItem {
get {
return focusedItem;
}
set
{
if (value != focusedItem)
{
focusedItem = value;
// Perform actions when the focused item changes.
}
}
}
}
public partial class ItemViewModel : ObservableObject
{
//...
}
Выбор нескольких элементов¶
ListView позволяет выбирать несколько элементов и группировать строки. Чтобы включить этот режим выбора, установите для свойства ListViewControl.SelectionMode
значение Multiple
. Выбранные элементы и строки групп имеют выделенный фон.
- Щелчок по элементу позволяет выбрать этот элемент и отменить выбор ранее выбранных элементов.
- Щелчок мышью с Ctrl по элементу переключает выбранное состояние элемента.
- Щелчок правой кнопкой мыши по элементу выбирает диапазон элементов (между ранее сфокусированным элементом и щелкнутым элементом).
Когда пользователь выбирает элемент, этот элемент также фокусируется (свойства ListViewControl.FocusedItem
и ListViewControl.FocusedItemIndex
обновляются).
Последующий щелчок CTRL по этому элементу отменяет его выделение, но сохраняет фокус.
Используйте следующие элементы API для получения выбранных элементов и группирования строк:
-
ListViewControl.SelectedItems
— Коллекция бизнес-объектов из источникаListViewControl.ItemsSource
, которые соответствуют выбранным элементам ListView. КоллекцияSelectedItems
не содержит выбранных строк группы, поскольку группирующие строки не соответствуют ни одному бизнес-объекту в источникеListViewControl.ItemsSource
. -
ListViewControl.GetSelectedIndices
— Этот метод возвращает массив индексов выбранных в данный момент элементов и групповых строк. Индексы элементов неотрицательны, в то время как индексы строк группы отрицательны. Смотрите следующий раздел для получения более подробной информации: Идентификация и получение элементов и группировка строк .
Следующие свойства и методы позволяют вам выбирать элементы и группировать строки в коде:
ListViewControl.SelectedItems
— Вы можете назначить свою коллекцию бизнес-объектов из источникаListViewControl.ItemsSource
свойствуSelectedItems
, чтобы выбрать соответствующие элементы ListView.ListViewControl.SelectAll
— Выбирает все элементы и группирующие строки, если таковые имеются.ListViewControl.SetSelected
— Выбирает или отменяет выбор определенного элемента или группирующей строки.ListViewControl.ToggleSelected
— Переключает выбранное состояние для элемента или группирующей строки.
Чтобы отреагировать на изменения в выделении, вы можете обработать событие ListViewControl.SelectionChanged
.
Связанный API¶
ListViewControl.ClearSelection
— Очищает выделение.ListViewControl.GetIsSelected
— Возвращает, выбран ли элемент.
* Эта страница была создана автоматически с помощью сервиса машинного перевода Яндекс Переводчик.