Udostępnij za pośrednictwem


Code-Behind i XAML w WPF

Code-behind to termin używany do opisywania kodu połączonego z obiektami zdefiniowanymi znacznikami, gdy strona XAML jest skompilowana na podstawie znaczników. W tym temacie opisano wymagania dotyczące kodu, a także alternatywny mechanizm kodu wbudowanego dla kodu w języku XAML.

Ten temat zawiera następujące sekcje:

Warunki wstępne

W tym temacie założono, że znasz XAML w WPF i masz podstawową wiedzę na temat środowiska CLR i programowania obiektowego.

Code-Behind i język XAML

Język XAML zawiera funkcje na poziomie języka, które umożliwiają kojarzenie plików kodu z plikami znaczników po stronie znaczników. W szczególności język XAML definiuje funkcje języka x:Class Directive, x:Subclass Directivei x:ClassModifier Directive. Dokładnie sposób tworzenia kodu i sposobu integrowania znaczników i kodu nie jest częścią tego, co określa język XAML. Pozostawiono strukturę, taką jak WPF, aby określić sposób integracji kodu, jak używać języka XAML w modelach aplikacji i programowania, a także akcje kompilacji lub inne wsparcie, których to wymaga.

Wymagania dotyczące Code-behind, programu obsługi zdarzeń i klasy częściowej w WPF

  • Klasa częściowa musi pochodzić z typu, który wspiera element główny.

  • Należy pamiętać, że w ramach domyślnego zachowania działań budowania kompilacji znaczników, można pozostawić puste miejsce w definicji klasy częściowej po stronie kodu za. Skompilowany wynik zakłada, że typ bazowy korzenia strony będzie podstawą dla klasy częściowej, nawet jeśli nie zostanie określony. Jednak poleganie na tym zachowaniu nie jest najlepszym rozwiązaniem.

  • Obsługiwacze zdarzeń pisane w kodzie muszą być metodami instancji i nie mogą być metodami statycznymi. Te metody muszą być zdefiniowane przez częściową klasę w przestrzeni nazw CLR zidentyfikowaną przez x:Class. Nie można zakwalifikować nazwy programu obsługi zdarzeń w celu poinstruowania procesora XAML, aby wyszukał procedurę obsługi zdarzeń w innym zakresie klasy.

  • Procedura obsługi musi odpowiadać delegatowi odpowiedniego zdarzenia w systemie typów kopii zapasowych.

  • W szczególności w języku Microsoft Visual Basic można użyć słowa kluczowego Handles specyficznego dla języka, aby skojarzyć programy obsługi z wystąpieniami i zdarzeniami w deklaracji programu obsługi, zamiast dołączać programy obsługi z atrybutami w języku XAML. Jednak ta technika ma pewne ograniczenia, ponieważ słowo kluczowe Handles nie może obsługiwać wszystkich określonych funkcji systemu zdarzeń WPF, takich jak niektóre scenariusze zdarzeń trasowanych lub dołączone zdarzenia. Aby uzyskać szczegółowe informacje, zobacz Visual Basic i WPF Event Handling.

x:Code

x:Code jest elementem dyrektywy zdefiniowanym w języku XAML. Element dyrektywy x:Code może zawierać wbudowany kod programowania. Kod zdefiniowany w tekście może współdziałać z językiem XAML na tej samej stronie. Poniższy przykład ilustruje wbudowany kod języka C#. Zwróć uwagę, że kod znajduje się wewnątrz elementu x:Code i że kod musi być otoczony przez <CDATA[...]]>, aby uniknąć zawartości kodu XML, tak aby procesor XAML (interpretujący schemat XAML lub schemat WPF) nie próbował interpretować zawartości dosłownie jako 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>

Ograniczenia kodu wbudowanego

Należy rozważyć uniknięcie lub ograniczenie użycia kodu wbudowanego. Jeśli chodzi o architekturę i filozofię kodowania, utrzymanie separacji między znacznikami a logiką działania zapewnia znacznie bardziej odrębne role projektanta i dewelopera. Na bardziej technicznym poziomie kod pisany dla kodu wbudowanego może być niezręczny do zapisu, ponieważ zawsze zapisujesz w klasie częściowej wygenerowanej przez język XAML i może używać tylko domyślnych mapowań przestrzeni nazw XML. Ponieważ nie można dodać instrukcji using, musisz w pełni zakwalifikować wiele wywołań interfejsu API, które wykonasz. Domyślne mapowania WPF obejmują większość, ale nie wszystkie przestrzenie nazw CLR, które znajdują się w zestawach WPF; Konieczne będzie pełne kwalifikowanie wywołań do typów i elementów członkowskich zawartych w innych przestrzeniach nazw CLR. Nie można również zdefiniować żadnych elementów poza klasą częściową w kodzie wbudowanym, a wszystkie jednostki kodu użytkownika, do których się odwołujesz, muszą istnieć jako składowa lub zmienna w wygenerowanej klasie częściowej. Inne funkcje programowania specyficzne dla języka, takie jak makra lub #ifdef względem zmiennych globalnych lub zmiennych kompilacji, również nie są dostępne. Aby uzyskać więcej informacji, zobacz x:Code Wewnętrzny typ XAML.

Zobacz też