Выделенный код и XAML
Обновлен: Ноябрь 2007
Выделенный код — это термин, который используется для описания кода, соединяемого с кодом, созданным обработчиком XAML при компиляции страницы XAML в приложение. В данном разделе описываются требования для выделенного кода, а также альтернативный механизм встроенного кода для кода в XAML.
В этом разделе содержатся следующие подразделы.
- Необходимые компоненты
- Требования для выделенного кода, обработчика событий и разделяемого класса
- x:Code
- Ограничения встроенного кода
- Связанные разделы
Необходимые компоненты
Для понимания данного раздела необходимо ознакомиться с Общие сведения о XAML и иметь базовые знания о CLR и объектно-ориентированном программировании.
Требования для выделенного кода, обработчика событий и разделяемого класса
Разделяемый класс должен быть производным от типа класса, который был использован в качестве корневого элемента. В определении разделяемого класса с выделенном коде можно оставить наследование пустым, но скомпилированный результат будет считать корень страницы базовым классом для разделяемого класса, даже если он не задан (так как разметочная половина разделяемого класса установила в качестве базы корень страницы).
Создаваемые обработчики событий должны быть методами экземпляра, определенными разделяемым классом в пространстве имен CLR, идентифицированным по x:Class. Нельзя уточнить имя обработчика событий, чтобы указать обработчику XAML искать этот обработчик в другой области действия класса. Кроме того, нельзя использовать статические методы в качестве обработчика событий.
Обработчик должен соответствовать делегату для соответствующего события.
Специально для языка Microsoft Visual Basic .NET можно использовать ключевое слово (конкретно для этого языка) Handles, чтобы связать обработчики с экземплярами и событиями в объявлении обработчика, вместо присоединения обработчиков с атрибутами в XAML. Однако этот метод имеет некоторые ограничения, поскольку Handles не поддерживает все специфические возможности системы событий WPF, например, определенные сценарии маршрутизации событий или вложенные события. Дополнительные сведения см. в разделе Обработка событий в Visual Basic и WPF.
x:Code
x:Code является элементом директивы, определенным в XAML. Элемент директивы x:Code может содержать встроенный программный код. Код, определенный встроенным образом, может взаимодействовать с XAML на той же странице. В следующем примере продемонстрирован встроенный код C#. Обратите внимание, что код находится внутри элемента x:Code и код должен быть заключен в <CDATA[... ]]>, чтобы избежать содержимого для XML, так что обработчик XAML (интерпретирующий либо схему XAML, либо схему WPF) не будет пытаться интерпретировать содержимое политерально, как XML.
<Page
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
x:Class="MyNamespace.MyCanvasCodeInline"
>
<Button Name="button1" Click="Clicked">Click Me!</Button>
<x:Code><![CDATA[
void Clicked(object sender, RoutedEventArgs e)
{
button1.Content = "Hello World";
}
]]></x:Code>
</Page>
Ограничения встроенного кода
Следует избегать или ограничивать использование встроенного кода в приложении, основанном на XAML. В терминах архитектуры и философии кодирования обеспечение разделения между разметкой и выделенным кодом лучше разделяет роли конструктора и разработчика. На более техническом уровне код, написанный для встроенного кода, может быть неудобным в плане записи, поскольку разработчик всегда пишет в сгенерированном разделяемом классе страницы XAML и может использовать только сопоставления пространства имен XML по умолчанию. Поскольку нельзя добавить операторы using, следует полностью определять множество производимых вызовов API-интерфейс. Сопоставления WPF по умолчанию включают большинство, но не все пространства имен CLR, присутствующие в сборках WPF; понадобится полностью определять вызовы API-интерфейсы, содержащихся в других пространствах имен CLR. Также нельзя определить несколько классов во встроенном коде, и все сущности кода должны существовать в качестве членов или переменных внутри созданного разделяемого класса. Другие зависимые от конкретного языка программирования возможности, такие как макросы или #ifdef применительно к глобальным переменным или переменным построения, также недоступны. Дополнительные сведения см. в разделе x:Code — элемент директивы XAML.