Сводная информация о Главе 8. Совместное использование кода и XAML

Download Sample Скачайте пример

Примечание.

Эта книга была опубликована весной 2016 года и с тех пор не обновлялась. Многое в этой книге остается ценным, но некоторые материалы устарели, а некоторые разделы перестали быть полностью верными или полными.

В этой главе более подробно рассматривается XAML и, в частности, взаимодействие кода и XAML.

Передача аргументов

В общем случае класс, созданный в XAML, должен иметь открытый конструктор без параметров. Результирующий объект инициализируется с помощью параметров свойств. Однако существует два других способа создания и инициализации объектов.

Хотя это методы общего назначения, они используются преимущественно в связи с моделями MVVM View.

Конструкторы с аргументами

В примере ParameteredConstructorDemo показано, как использовать тег x:Arguments для указания аргументов конструктора. Эти аргументы должны быть разделены тегами элементов, указывающими тип аргумента. Для базовых типов данных .NET доступны такие теги:

  • x:Object
  • x:Boolean
  • x:Byte
  • x:Int16
  • x:Int32
  • x:Int64
  • x:Single
  • x:Double
  • x:Decimal
  • x:Char
  • x:String
  • x:TimeSpan
  • x:Array
  • x:DateTime

Можно ли вызывать методы из XAML?

В примере FactoryMethodDemo показано, как использовать элемент x:FactoryMethod, чтобы указать фабричный метод, который вызывается для создания объекта. Такой фабричный метод должен быть открытым и статическим и должен создавать объект типа, в котором он определен. (Например, Color.FromRgb метод квалифифисируется, так как он является общедоступным и статическим и возвращает значение типа Color.) Аргументы метода фабрики указываются в x:Arguments тегах.

Атрибут x:Name

Атрибут x:Name позволяет присвоить объекту, созданному в XAML, имя. Правила для этих имен такие же, как и для имен переменных в C#. После возврата вызова InitializeComponent в конструкторе файл кода программной части может ссылаться на эти имена для доступа к соответствующему элементу XAML. Фактически имена преобразуются синтаксическим анализатором XAML в закрытые поля в созданном разделяемом классе.

В примере XamlClock демонстрируется использование x:Name, чтобы файл кода программной части оставался в состоянии обновлять два элемента Label, определенных в XAML, текущими датой и временем.

Одно и то же имя нельзя использовать для нескольких элементов на одной странице. Эта проблема особенно важна, если для создания параллельно именованных объектов для каждой платформы используется OnPlatform. В примере PlatformSpecificLabele демонстрируется более удобный способ сделать что-то вроде этого.

Пользовательские представления на основе XAML

Существует несколько способов избежать повторения разметки в XAML. Одним из распространенных способов является создание нового класса на основе XAML, производного от ContentView. Этот метод показан в примере ColorViewList. Класс ColorView является производным от ContentView и служит для вывода определенного цвета и его имени, в то время как класс ColorViewListPage является производным от ContentPage и как обычно и явно создает 17 экземпляров ColorView.

Для доступа к классу ColorView в XAML требуется другое объявление пространства имен XML, обычно именуемое local для классов в той же сборке.

События и обработчики

События можно назначить обработчикам событий в XAML, но сам обработчик событий должен быть реализован в файле кода программной части. В примере XamlKeypad демонстрируется создание пользовательского интерфейса с клавиатурой на языке XAML и реализация обработчиков Clicked в файле кода программной части.

Жесты при касаниях

Любой объект View может получать данные от сенсорного устройства и создавать события из этих входных данных. Класс View определяет свойство коллекции GestureRecognizers, которое может содержать один или несколько экземпляров классов, производных от GestureRecognizer.

TapGestureRecognizer создает события Tapped. Программа MonkeyTap демонстрирует присоединение TapGestureRecognizer объектов к четырем элементам BoxView для создания имитационной игры:

Triple screenshot of monkey tap

Хотя программе MonkeyTap все же нужен звук. (См. следующую главу.)