Delen via


Overname van eigenschapswaarde

Overname van eigenschapswaarde is een functie van het WPF-eigenschappensysteem (Windows Presentation Foundation). Overname van eigenschapswaarden stelt onderliggende elementen in een structuur met elementen in staat om de waarde van een bepaalde eigenschap van bovenliggende elementen te verkrijgen, waarbij die waarde wordt overgenomen omdat deze overal in het dichtstbijzijnde bovenliggende element is ingesteld. Het bovenliggende element heeft mogelijk ook de waarde verkregen door erfopvolging van eigenschapswaarden, waardoor het systeem mogelijk helemaal doorrecursief teruggaat naar de root van de pagina. Overname van eigenschapswaarden is niet het standaardgedrag van het eigenschappensysteem; een eigenschap moet worden ingesteld met een bepaalde metagegevensinstelling om ervoor te zorgen dat die eigenschap de overname van eigenschapswaarden voor onderliggende elementen initieert.

Overerving van eigenschapswaarde is insluitingsovererving

Overname als een term hier is niet helemaal hetzelfde als overname in de context van typen en algemene objectgeoriënteerde programmering, waarbij afgeleide klassen liddefinities overnemen van hun basisklassen. Deze betekenis van overname is ook actief in WPF: eigenschappen die in verschillende basisklassen zijn gedefinieerd, worden weergegeven als kenmerken voor afgeleide XAML-klassen wanneer ze worden gebruikt als elementen en worden weergegeven als leden voor code. Overname van eigenschapswaarden gaat met name over de wijze waarop eigenschapswaarden kunnen overnemen van het ene element naar het andere op basis van de bovenliggende en onderliggende relaties binnen een structuur met elementen. Deze structuur van elementen is het meest direct zichtbaar wanneer u elementen in andere elementen nest terwijl u toepassingen definieert in XAML-markeringen. Structuren van objecten kunnen ook programmatisch worden gemaakt door objecten toe te voegen aan aangewezen verzamelingen van andere objecten en overname van eigenschapswaarden werkt op dezelfde manier in de voltooide structuur tijdens runtime.

Praktische toepassingen van overname van eigenschapswaarde

De WPF-API's bevatten verschillende eigenschappen waarvoor overname van eigenschappen is ingeschakeld. Normaal gesproken is het scenario voor deze eigenschappen dat ze betrekking hebben op een eigenschap waarbij de eigenschap slechts eenmaal per pagina moet worden ingesteld, maar waarbij die eigenschap ook lid is van een van de basiselementklassen en dus ook zou bestaan op de meeste onderliggende elementen. De eigenschap FlowDirection bepaalt bijvoorbeeld in welke richting de vloeiende inhoud moet worden gepresenteerd en gerangschikt op de pagina. Normaal gesproken wilt u dat het concept van de tekststroom consistent wordt verwerkt in alle onderliggende elementen. Als de stroomrichting om een of andere reden opnieuw is ingesteld in een bepaald niveau van de elementstructuur door de gebruiker of omgevingsactie, moet deze doorgaans overal opnieuw worden ingesteld. Wanneer de eigenschap FlowDirection wordt overgenomen, hoeft de waarde slechts één keer te worden ingesteld of opnieuw ingesteld op het niveau in de elementstructuur die de presentatiebehoeften van elke pagina in de toepassing omvat. Zelfs de oorspronkelijke standaardwaarde wordt op deze manier overgenomen. Met het overnamemodel voor eigenschapswaarden kunnen nog steeds afzonderlijke elementen de waarde opnieuw instellen voor de zeldzame gevallen waarin een combinatie van stroomrichtingen opzettelijk is.

Een aangepaste eigenschap overerfbaar maken

Door de metagegevens van een aangepaste eigenschap te wijzigen, kunt u ook uw eigen aangepaste eigenschappen overnemen. Houd er echter rekening mee dat het toewijzen van een eigenschap als erfbaar enkele prestatieoverwegingen heeft. In gevallen waarin die eigenschap geen vastgestelde lokale waarde heeft of een waarde die is verkregen via stijlen, sjablonen of gegevensbinding, biedt een overgenomen eigenschap de toegewezen eigenschapswaarden aan alle onderliggende elementen in de logische structuur.

Als u een eigenschap wilt laten deelnemen aan de overname van waarden, maakt u een aangepaste gekoppelde eigenschap, zoals beschreven in Een gekoppelde eigenschap registreren. Registreer de eigenschap met metagegevens (FrameworkPropertyMetadata) en specificeer de optie "Erft" in de instellingen voor opties binnen die metagegevens. Zorg er ook voor dat de eigenschap een vastgestelde standaardwaarde heeft, omdat die waarde nu wordt overgenomen. Hoewel u de eigenschap hebt geregistreerd als gekoppeld, wilt u mogelijk ook een eigenschap 'wrapper' maken voor het verkrijgen/instellen van toegang voor het type eigenaar, net zoals voor een 'niet-gekoppelde' afhankelijkheidseigenschap. Nadat u dit hebt gedaan, kan de nalatende eigenschap worden ingesteld met behulp van de directe eigenschap-wrapper voor het eigenaarstype of afgeleide typen, of kan deze worden ingesteld met behulp van de syntaxis van de gekoppelde eigenschap op elke DependencyObject.

Gekoppelde eigenschappen zijn conceptueel vergelijkbaar met globale eigenschappen; u kunt controleren op de waarde op elke DependencyObject en een geldig resultaat krijgen. Het typische scenario voor gekoppelde eigenschappen is het instellen van eigenschapswaarden voor onderliggende elementen en dat scenario is effectiever als de betreffende eigenschap een gekoppelde eigenschap is die altijd impliciet aanwezig is als een gekoppelde eigenschap op elk element (DependencyObject) in de structuur.

Notitie

Hoewel overname van eigenschapswaarden kan werken voor niet-gekoppelde afhankelijkheidseigenschappen, is het overnamegedrag voor een niet-gekoppelde eigenschap via bepaalde elementgrenzen in de runtimestructuur niet gedefinieerd. Gebruik altijd RegisterAttached om eigenschappen te registreren waar u Inherits opgeeft in de metagegevens.

Erf eigenschapswaarden over boomstructuurgrenzen

Eigenschappen worden overgeërfd door een boomstructuur van elementen te traverseren. Deze structuur is vaak parallel aan de logische structuur. Wanneer u echter een WPF-kernobject opneemt in de markering die een elementstructuur definieert, zoals een Brush, hebt u een niet-aaneenlopende logische structuur gemaakt. Een echte logische structuur wordt niet conceptueel uitgebreid via de Brush, omdat de logische structuur een concept op WPF-frameworkniveau is. U kunt dit zien in de resultaten wanneer u de methoden van LogicalTreeHelpergebruikt. Overname van eigenschapswaarden kan deze kloof echter overbruggen in de logische structuur en kan nog steeds overgenomen waarden doorgeven, zolang de overgenomen eigenschap is geregistreerd als een gekoppelde eigenschap en geen opzettelijke overnameblokkeringsgrens (zoals een Frame) wordt aangetroffen.

Zie ook