Dela via


Code-Behind och XAML i WPF

Code-behind är en term som används för att beskriva koden som är kopplad till markupdefinierade objekt, när en XAML-sida är markupkompilerad. Det här avsnittet beskriver kraven för bakomliggande kod samt en alternativ infogad kodmekanism för kod i XAML.

Det här avsnittet innehåller följande avsnitt:

Förutsättningar

Det här avsnittet förutsätter att du har läst XAML i WPF och har grundläggande kunskaper om CLR och objektorienterad programmering.

Code-Behind och XAML-språket

XAML-språket innehåller funktioner på språknivå som gör det möjligt att associera kodfiler med markeringsfiler från markeringsfilsidan. Mer specifikt definierar XAML-språket språkfunktionerna x:Class Directive, x:Subclass Directiveoch x:ClassModifier Directive. Exakt hur koden ska skapas och hur du integrerar markering och kod är inte en del av vad XAML-språket anger. Det är upp till ramverk som WPF att avgöra hur koden ska integreras, hur du använder XAML i program- och programmeringsmodellerna samt de byggåtgärder eller annat stöd som allt detta kräver.

Kod bakom, händelsehanterare och partiella klasskrav i WPF

  • Den partiella klassen måste härledas från den typ som stöder rotelementet.

  • Observera att under standardbeteendet för markupkompileringens byggåtgärder kan du lämna härledningen tom i den partiella klassdefinitionen i kodbakgrunden. Det kompilerade resultatet förutsätter att sidrotens bakgrundstyp är grunden för den partiella klassen, även om den inte har angetts. Det är dock inte bästa praxis att förlita sig på det här beteendet.

  • Händelsehanterarna som du skriver i koden bakom måste vara instansmetoder och får inte vara statiska metoder. Dessa metoder måste definieras av den partiella klassen i CLR-namnområdet som identifieras av x:Class. Du kan inte kvalificera namnet på en händelsehanterare för att instruera en XAML-processor att söka efter en händelsehanterare för händelsekopplingar i ett annat klassomfång.

  • Hanteraren måste matcha ombudet för lämplig händelse i backningstypsystemet.

  • Specifikt för Microsoft Visual Basic-språket kan du använda det språkspecifika nyckelordet Handles för att associera hanterare med instanser och händelser i hanterardeklarationen, i stället för att koppla hanterare med attribut i XAML. Den här tekniken har dock vissa begränsningar eftersom nyckelordet Handles inte kan stödja alla specifika funktioner i WPF-händelsesystemet, till exempel vissa routade händelsescenarier eller anslutna händelser. Mer information finns i Visual Basic- och WPF-händelsehantering.

x:Code

x:Code är ett direktivelement som definieras i XAML. Ett x:Code-direktivelement kan innehålla infogad programmeringskod. Koden som definieras inline kan interagera med XAML i samma sida. I följande exempel visas infogad C#-kod. Observera att koden finns i elementet x:Code och att koden måste vara omgiven av <CDATA[...]]> för att undkomma innehållet för XML, så att en XAML-processor (som tolkar antingen XAML-schemat eller WPF-schemat) inte försöker tolka innehållet bokstavligen som 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>

Infogade kodbegränsningar

Du bör överväga att undvika eller begränsa användningen av infogad kod. När det gäller arkitektur och kodningsfilosofi håller upprätthållandet av en separation mellan markup och kod bakom designer- och utvecklarrollerna mycket mer distinkt. På en mer teknisk nivå kan koden som du skriver för infogad kod vara besvärlig att skriva eftersom du alltid skriver till den XAML-genererade partiella klassen och bara kan använda xml-standardmappningar för namnområden. Eftersom du inte kan lägga till using-instruktioner måste du fullt ut kvalificera många av de API-anrop som du gör. Standardmappningarna för WPF innehåller de flesta men inte alla CLR-namnområden som finns i WPF-sammansättningarna. du måste helt kvalificera anrop till typer och medlemmar som ingår i de andra CLR-namnrymderna. Du kan inte heller definiera något utöver den partiella klassen i den infogade koden, och alla användarkodentiteter som du refererar till måste finnas som en medlem eller variabel i den genererade partiella klassen. Andra språkspecifika programmeringsfunktioner, till exempel makron eller #ifdef mot globala variabler eller byggvariabler, är inte heller tillgängliga. Mer information finns i x:Code Intrinsic XAML Type.

Se även