Код программной части и XAML в WPF

Термином "Код программной части" обозначается код, соединяемый с созданными в разметке объектами при разметочной компиляции XAML-страницы. В этом разделе описаны требования к коду программной части, а также альтернативный встроенный механизм написания кода для кода в XAML.

Этот раздел состоит из следующих подразделов.

Необходимые компоненты

В этом разделе предполагается, что вы ознакомились со статьей 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="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://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.

См. также