Code-Behind и XAML в WPF
Code-behind — это термин, используемый для описания кода, связанного с объектами, определёнными в разметке, когда страница XAML компилируется на основе разметки. В этом разделе описываются требования к "code-behind", а также альтернативный механизм "inline code" для кода в XAML.
В этом разделе содержатся следующие разделы:
Необходимые условия
В этом разделе предполагается, что вы прочитали XAML в WPF и имеют некоторые базовые знания о среде CLR и объектно-ориентированном программировании.
Code-Behind и язык XAML
Язык XAML включает функции уровня языка, которые позволяют связать файлы кода с файлами разметки на стороне файла разметки. В частности, язык XAML определяет функции языка директивы x:Class, директивы x:Subclassи директиву x:ClassModifier. Именно как следует создавать код, а также как интегрировать разметку и код, не является частью того, что указывает язык 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
для глобальных переменных или переменных сборки, также недоступны. Дополнительные сведения см. в разделе о встроенном типе XAML x:Code .
См. также
.NET Desktop feedback