Code-Behind en XAML in WPF
Code-behind is een term die wordt gebruikt om de code te beschrijven die is gekoppeld aan door markeringen gedefinieerde objecten, wanneer een XAML-pagina is gecompileerd. In dit onderwerp worden de vereisten voor code-behind en een alternatief mechanisme voor inlinecode in XAML beschreven.
Dit onderwerp bevat de volgende secties:
Voorwaarden
In dit onderwerp wordt ervan uitgegaan dat u de XAML in WPF hebt gelezen en enige basiskennis hebt van de CLR en objectgeoriënteerde programmering.
Code-Behind en de XAML-taal
De XAML-taal bevat taalfuncties waarmee codebestanden kunnen worden gekoppeld aan opmaakbestanden, vanuit het perspectief van het opmaakbestand. De XAML-taal definieert met name de taalfuncties x:Class Directive, x:Subklasse-richtlijnen x:ClassModifier Directive. Precies hoe de code moet worden geproduceerd en hoe markeringen en code moeten worden geïntegreerd, maakt geen deel uit van wat de XAML-taal aangeeft. Het wordt overgelaten aan frameworks zoals WPF om te bepalen hoe de code moet worden geïntegreerd, hoe u XAML gebruikt in de toepassings- en programmeermodellen, en de buildacties of andere ondersteuning die hiervoor nodig is.
Code-behind, eventhandler en gedeeltelijke klasse vereisten in WPF
De gedeeltelijke klasse moet zijn afgeleid van het type dat het hoofdelement ondersteunt.
Houd er rekening mee dat onder het standaardgedrag van de buildacties voor het compileren van markeringen de afleiding leeg blijft in de gedeeltelijke klassedefinitie aan de code-achterzijde. Bij het gecompileerde resultaat wordt ervan uitgegaan dat het backingtype van de paginahoofd de basis is voor de gedeeltelijke klasse, zelfs als deze niet is opgegeven. Vertrouwen op dit gedrag is echter geen best practice.
De gebeurtenis-handlers die u in de code-behind schrijft, moeten exemplaarmethoden zijn en kunnen geen statische methoden zijn. Deze methoden moeten worden gedefinieerd door de gedeeltelijke klasse binnen de CLR-naamruimte die wordt geïdentificeerd door
x:Class
. U kunt de naam van een gebeurtenis-handler niet kwalificeren om een XAML-processor te laten zoeken naar een gebeurtenis-handler voor gebeurtenis bedrading in een ander klassebereik.De handler moet overeenkomen met de gedelegeerde voor de geschikte gebeurtenis in het back-uptypesysteem.
Voor de Microsoft Visual Basic-taal kunt u het taalspecifieke
Handles
trefwoord gebruiken om handlers te koppelen aan exemplaren en gebeurtenissen in de handlerdeclaratie in plaats van handlers te koppelen aan kenmerken in XAML. Deze techniek heeft echter enkele beperkingen omdat hetHandles
trefwoord niet alle specifieke functies van het WPF-gebeurtenissysteem kan ondersteunen, zoals bepaalde gerouteerde gebeurtenisscenario's of gekoppelde gebeurtenissen. Zie Visual Basic en WPF Event Handlingvoor meer informatie.
x:Code
x:Code is een instructieelement dat is gedefinieerd in XAML. Een x:Code
instructieelement kan inline programmeercode bevatten. De code die inline is gedefinieerd, kan op dezelfde pagina communiceren met de XAML. In het volgende voorbeeld ziet u inline C#-code. U ziet dat de code zich in het x:Code
element bevindt en dat de code moet worden omgeven door <CDATA[
...]]>
om de inhoud voor XML te ontsnappen, zodat een XAML-processor (die het XAML-schema of het WPF-schema interpreteert) de inhoud niet letterlijk als XML probeert te interpreteren.
<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>
Beperkingen voor inline-code
Overweeg het gebruik van inlinecode te voorkomen of te beperken. In termen van architectuur- en coderingfilosofie houdt het onderhouden van een scheiding tussen opmaak en code-achter de ontwerper en ontwikkelaarsrollen daarin veel duidelijker. Op technisch niveau kan de code die u schrijft voor inlinecode onhandig zijn om te schrijven, omdat u altijd in de door XAML gegenereerde gedeeltelijke klasse schrijft en alleen de standaard XML-naamruimtetoewijzingen kunt gebruiken. Omdat u geen using
-instructies kunt toevoegen, moet u veel van de API-aanroepen die u maakt volledig kwalificeren. De standaard WPF-koppelingen bevatten de meeste, maar niet alle CLR-naamruimten die aanwezig zijn in de WPF-assembly's; u moet aanroepen naar typen en leden in de andere CLR-naamruimten volledig kwalificeren. U kunt ook niets anders definiëren dan de gedeeltelijke klasse in de inlinecode en alle gebruikerscode-entiteiten waarnaar u verwijst, moeten bestaan als lid of variabele binnen de gegenereerde gedeeltelijke klasse. Andere taalspecifieke programmeerfuncties, zoals macro's of #ifdef
op basis van globale variabelen of buildvariabelen, zijn ook niet beschikbaar. Zie x:Code Intrinsiek XAML-typevoor meer informatie.
Zie ook
.NET Desktop feedback