Сводная информация о Главе 8. Совместное использование кода и XAML
Примечание.
Эта книга была опубликована весной 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
для создания имитационной игры:
Хотя программе MonkeyTap все же нужен звук. (См. следующую главу.)