Код программной части и XAML в WPF
Выделенный код – это термин, используемый для описания кода, который объединяется с объектами, определенными разметкой, когда страница XAML является страницей с компилированной разметкой. В данном разделе описываются требования для выделенного кода, а также альтернативный механизм встроенного кода для кода в XAML.
В этом разделе содержатся следующие подразделы.
Предварительные требования
Выделенный код и язык XAML
Требования для выделенного кода, обработчика событий и разделяемого класса в WPF
x:Code
Ограничения встроенного кода
Предварительные требования
Для понимания данного раздела необходимо ознакомиться с Общие сведения о языке XAML (WPF) и иметь базовые знания о CLR и объектно-ориентированном программировании.
Выделенный код и язык XAML
Язык XAML включает функции на уровне языка, которые делают возможным сопоставление файлов кода с файлами разметки, со стороны файла разметки. В частности, язык XAML задает функции языка Директива x:Class, Директива x:Subclass и Директива x:ClassModifier. То, как код должен создаваться, и как следует объединять код и разметку, не является тем, что задает язык XAML. Определение, каким образом следует объединять код, как использовать язык XAML в приложениях и программных моделях, а также действия построения и другая поддержка, которая все это требует, оставлены платформам, таким как WPF.
Требования для выделенного кода, обработчика событий и разделяемого класса в WPF
Разделяемый класс должен быть производным от типа, который возвращает корневой элемент.
Следует отметить, что при использовании поведения действий построения компилированной разметки, установленного по умолчанию, можно оставить наследование пустым в определении разделяемого класса на стороне выделенного кода. Компилированный результат будет предполагать, что резервный тип корня страницы будет базовым для разделяемого класса, даже если он не указан. Однако полагаться на это поведение не рекомендуется.
Обработчики событий, прописанные в выделенном коде, должны быть методами экземпляров, и не могут быть статическими методами. Эти методы должны быть определены разделяемым классом в пространстве имен среды CLR, идентифицированным по x:Class. Нельзя уточнить имя обработчика событий, чтобы указать процессору XAML искать этот обработчик для события, написанного в другой области класса.
Обработчик должен соответствовать делегату для соответствующего события в системе резервного типа.
Специально для языка Microsoft Visual Basic можно использовать ключевое слово (конкретно для этого языка) 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 и может использовать только сопоставления пространства имен XML по умолчанию. Поскольку нельзя добавить операторы using, следует полностью определять множество производимых вызовов API. Сопоставления WPF по умолчанию включают большинство, но не все пространства имен CLR, присутствующие в сборках WPF; понадобится указывать полные имена в вызовах типов и элементов, содержащихся в других пространствах имен среды CLR. Также во встроенном коде нельзя определить что-либо за пределами разделяемого класса, и все сущности пользовательского кода должны существовать в качестве членов или переменных внутри созданного разделяемого класса. Другие зависимые от конкретного языка программирования возможности, такие как макросы или #ifdef применительно к глобальным переменным или переменным построения, также недоступны. Дополнительные сведения см. в разделе Встроенный тип XAML x:Code.