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

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

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

Предварительные требования

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

Code-Behind и язык XAML

Язык XAML включает функции уровня языка, позволяющие связывать файлы кода с файлами разметки с стороны файла разметки. В частности, язык XAML определяет директивуLanguage Features X:Class, директиву x:Subclassи директиву КС:классмодифиер. Точно то, как должен быть создан код и как интегрировать разметку и код, не является частью того, что указывает язык XAML. Она остается в таких платформах, как WPF, для определения способа интеграции кода, использования XAML в моделях приложения и программирования, а также действий сборки или другой поддержки, которые требуются для всех этих платформ.

Код программной части, обработчик событий и требования к разделяемому классу в 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 глобальные переменные или переменные сборки, также недоступны. Дополнительные сведения см. в разделе Тип данных, встроенный в x:Code.

См. также