Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A Windows Presentation Foundation (WPF) olyan szolgáltatásokat biztosít, amelyek a típus tulajdonságánakfunkcióinak kibővítésére használhatók. Ezeket a szolgáltatásokat együttesen WPF-tulajdonságrendszernek nevezzük. A WPF tulajdonságrendszer által támogatott tulajdonságot függőségi tulajdonságnak nevezzük. Ez az áttekintés ismerteti a WPF tulajdonságrendszert és a függőségi tulajdonság képességeit, beleértve a meglévő függőségi tulajdonságok használatát az XAML-ben és a kódban. Ez az áttekintés bemutatja a függőségi tulajdonságok speciális aspektusait is, például a függőségi tulajdonság metaadatait, valamint azt, hogyan hozhat létre saját függőségi tulajdonságot egy egyéni osztályban.
Előfeltételek
Ez a cikk a .NET típusú rendszer és az objektumorientált programozás alapszintű ismeretét feltételezi. A cikkben szereplő példák követéséhez segít megérteni az XAML-t, és tudni, hogyan kell WPF-alkalmazásokat írni. További információkért lásd: Oktatóanyag: Új WPF-alkalmazás létrehozása a .NETsegítségével.
Függőségi tulajdonságok és CLR-tulajdonságok
A WPF-tulajdonságok általában standard .NET-tulajdonságokként vannak közzétéve. Lehetséges, hogy alapszinten interakcióba lép ezekkel a tulajdonságokkal, és soha nem is veszi észre, hogy függőségi tulajdonságként vannak implementálva. A WPF tulajdonságrendszer bizonyos vagy összes funkciójának ismerete azonban segít kihasználni ezeket a funkciókat.
A függőségi tulajdonságok célja, hogy módot biztosítson egy tulajdonság értékének kiszámítására más bemenetek értéke alapján, például:
- Rendszertulajdonságok, például témák és felhasználói beállítások.
- Igény szerinti tulajdonságmeghatározási mechanizmusok, például adatkötések, animációk és storyboardok.
- Többszörösen használható sablonok, például erőforrások és stílusok.
- Az elemfa más elemeivel való szülő-gyermek kapcsolatok által ismert értékek.
A függőségi tulajdonság a következőket is megadhatja:
- Önálló ellenőrzés.
- Alapértelmezett értékek.
- Visszahívások, amelyek más tulajdonságok módosításait figyelik.
- Olyan rendszer, amely futásidejű információk alapján kényszerítheti a tulajdonságértékeket.
A származtatott osztályok megváltoztathatják a meglévő tulajdonságok egyes jellemzőit egy függőségi tulajdonság metaadatainak felülírásával ahelyett, hogy felülírják a meglévő tulajdonságok tényleges megvalósítását, vagy új tulajdonságokat hoznak létre.
Az SDK-referenciában a függőségi tulajdonságot az adott tulajdonság felügyelt referenciaoldalán található Függőségi tulajdonság információ szakaszának jelenlétével azonosíthatja. A Függőségi tulajdonság adatai szakasz tartalmaz egy hivatkozást a függőségi tulajdonság DependencyProperty azonosító mezőjére. Emellett tartalmazza a tulajdonság metaadat-beállításainak listáját, az osztályonkénti felülbírálási információkat és egyéb részleteket.
A függőségi tulajdonságok alapját a CLR-tulajdonságok képezik
A függőségi tulajdonságok és a WPF tulajdonságrendszer úgy bővíti ki a tulajdonság funkcióit, hogy egy tulajdonságot háttérbe kötő típust ad meg a tulajdonság magánmezővel való biztonsági mentésének szokásos mintája helyett. Ennek a típusnak a neve DependencyProperty. A WPF tulajdonságrendszert meghatározó másik fontos típus a DependencyObject, amely meghatározza azt az alaposztályt, amely regisztrálhat és birtokolhat egy függőségi tulajdonságot.
Íme néhány gyakran használt terminológia:
Függőség tulajdonság, amely egy DependencyPropertyáltal támogatott tulajdonság.
függőségi tulajdonságazonosító, amely egy
DependencyPropertypéldány, és amelyet egy függőségi tulajdonság regisztrálásakor eredményként kapunk meg, majd az osztály statikus tagjaként tárolunk. A WPF tulajdonságrendszerrel kommunikáló API-k közül sok paraméterként használja a függőségi tulajdonság azonosítóját.CLR "burkoló", amely a tulajdonság
getéssetimplementációja. Ezek a megvalósítások a GetValue és SetValue hívásokban használják a függőségi tulajdonság azonosítót. Ily módon a WPF tulajdonságrendszer biztosítja a tulajdonság háttérrendszerét.
Az alábbi példa a IsSpinning függőségi tulajdonságot határozza meg, amely a DependencyProperty azonosító és a háttértulajdonság közötti kapcsolatot jeleníti meg.
public static readonly DependencyProperty IsSpinningProperty = DependencyProperty.Register(
"IsSpinning", typeof(bool),
typeof(MainWindow)
);
public bool IsSpinning
{
get => (bool)GetValue(IsSpinningProperty);
set => SetValue(IsSpinningProperty, value);
}
Public Shared ReadOnly IsSpinningProperty As DependencyProperty =
DependencyProperty.Register("IsSpinning", GetType(Boolean), GetType(MainWindow))
Public Property IsSpinning As Boolean
Get
Return GetValue(IsSpinningProperty)
End Get
Set(value As Boolean)
SetValue(IsSpinningProperty, value)
End Set
End Property
A tulajdonság elnevezési konvenciója és a háttérbeli DependencyProperty mező fontos. A mező neve mindig a tulajdonság neve, Property utótaggal együtt. A konvencióról és annak okairól további információt egyéni függőségi tulajdonságokcímű témakörben talál.
Tulajdonságértékek beállítása
A tulajdonságokat kódban vagy XAML-ben is beállíthatja.
Tulajdonságértékek beállítása az XAML-ben
Az alábbi XAML-példa pirosra állítja egy gomb háttérszínét. Az XAML attribútum sztringértékét a WPF XAML-elemzője WPF-típussá konvertálja. A létrehozott kódban a WPF-típus egy Color, SolidColorBrusháltal.
<Button Content="I am red" Background="Red"/>
Az XAML számos szintaxisűrlap használatát támogatja a tulajdonságok beállításához. Az adott tulajdonsághoz használandó szintaxis a tulajdonság által használt értéktípustól és egyéb tényezőktől, például a típuskonverter jelenlététől függ. További információ az XAML-szintaxisról a tulajdonságok beállításához: XAML a WPF-ben és az XAML szintaxisa Részletesen
Az alábbi XAML-példa egy másik gombhátteret mutat be, amely tulajdonságelem-szintaxist használ attribútumszintaxis helyett. Az XAML nem egy egyszerű egyszínű színt állít be, hanem a Background tulajdonságot egy képre állítja a gombnál. Az elem ezt a képet jelöli, a beágyazott elem attribútuma pedig a kép forrását határozza meg.
<Button Content="I have an image background">
<Button.Background>
<ImageBrush ImageSource="stripes.jpg"/>
</Button.Background>
</Button>
Tulajdonságok beállítása a kódban
A függőségi tulajdonságértékek kódban való beállítása általában csak a CLR "burkolója" által közzétett set implementáció hívása:
Button myButton = new();
myButton.Width = 200.0;
Dim myButton As New Button With {
.Width = 200.0
}
A tulajdonságértékek lekérése lényegében a get "burkoló" implementációjának hívása:
double whatWidth = myButton.Width;
Dim whatWidth As Double = myButton.Width
A tulajdonságrendszer API-jait közvetlenül is meghívhatja GetValue és SetValue. Az API-k közvetlen meghívása bizonyos helyzetekben megfelelő, de a meglévő tulajdonságok használatakor általában nem. A burkolók általában kényelmesebbek, és jobb expozíciót biztosítanak a tulajdonságnak a fejlesztői eszközök számára.
A tulajdonságok az XAML-ben is beállíthatók, majd később, kód mögötti kóddal érhetők el. Részletekért lásd: Kód mögött és XAML a WPF-ben
Függőségi tulajdonság által biztosított tulajdonságfunkciók
Egy mező által támogatott tulajdonságtól eltérően a függőségi tulajdonság kibővíti a tulajdonság funkcióit. A hozzáadott funkciók gyakran az alábbi funkciók egyikét képviselik vagy támogatják:
Erőforrások
A függőségi tulajdonság értékét erőforrásra való hivatkozással állíthatja be. Az erőforrások általában egy lap gyökérelemének vagy az alkalmazásnak Resources tulajdonságértékeként vannak megadva, mivel ezek a helyek kényelmes hozzáférést biztosítanak az erőforráshoz. Ebben a példában egy SolidColorBrush erőforrást határozunk meg:
<StackPanel.Resources>
<SolidColorBrush x:Key="MyBrush" Color="Gold"/>
</StackPanel.Resources>
Az erőforrás definiálása után hivatkozhatunk az erőforrásra a Background tulajdonság értékének megadásához:
<Button Background="{DynamicResource MyBrush}" Content="I am gold" />
A WPF XAML-ben statikus vagy dinamikus erőforrás-referenciát is használhat. Ezt az erőforrást dynamicResource-ként kell hivatkozni
Megjegyzés:
Az erőforrások helyi értékként lesznek kezelve, ami azt jelenti, hogy ha egy másik helyi értéket állít be, akkor az erőforrás-hivatkozás megszűnik. További információ: Függőségi tulajdonságérték elsőbbsége.
Adatkötés
A függőségi tulajdonság adatkötéssel hivatkozhat egy értékre. Az adatkötés egy adott korrektúrakiterjesztés szintaxisán keresztül működik az XAML-ben, vagy a kód Binding objektumán. Adatkötés esetén a végső tulajdonság értékének meghatározása a futási időpontig halasztva lesz, ekkor az érték egy adatforrásból lesz lekért.
Az alábbi példa egy ContentButton tulajdonságát állítja be egy XAML-ben deklarált kötés használatával. A kötés öröklött adatkörnyezetet és XmlDataProvider adatforrást használ (nem jelenik meg). Maga a kötés határozza meg az adatforráson belüli forrástulajdonságot XPathalapján.
<Button Content="{Binding Source={StaticResource TestData}, XPath=test[1]/@text}"/>
Megjegyzés:
A kötések helyi értékként lesznek kezelve, ami azt jelenti, hogy ha egy másik helyi értéket állít be, a kötést megszünteti. További információért lásd: A függőségi tulajdonság értékének prioritása.
A függőségi tulajdonságok vagy a DependencyObject osztály nem támogatja natív módon INotifyPropertyChanged az adatkötési műveletek DependencyObject forrástulajdonság-értékének változásairól való értesítéshez. Ha többet szeretne tudni arról, hogyan hozhat létre olyan tulajdonságokat az adatkötésben, amelyek adatkötési cél módosításait jelenthetik, tekintse meg az adatkötések áttekintését
Stílusok
A stílusok és sablonok meggyőző érvek a függőségi tulajdonságok használatához. A stílusok különösen hasznosak az alkalmazás felhasználói felületét meghatározó tulajdonságok beállításához. A stílusok általában erőforrásként vannak definiálva az XAML-ben. A stílusok azért használják a tulajdonságrendszert, mert általában egy adott tulajdonsághoz tartozó "beállítókat" és egy másik tulajdonság futásidejű értéke alapján módosító "triggereket" tartalmaznak.
Az alábbi példa egy egyszerű stílust hoz létre, amely egy Resources szótárban lesz definiálva (nem jelenik meg). Ez a stílus ezután közvetlenül a Style tulajdonságra lesz alkalmazva egy Buttonesetén. A stílusban található beállító a Background stílus Button tulajdonságát zöldre állítja.
<Style x:Key="GreenButtonStyle">
<Setter Property="Control.Background" Value="Green"/>
</Style>
<Button Style="{StaticResource GreenButtonStyle}" Content="I am green"/>
További információ: Stílus- és sablonkezelés.
Animációk
A függőségi tulajdonságok animálhatók. Egy alkalmazott animáció futtatásakor az animált érték nagyobb prioritással rendelkezik, mint bármely más tulajdonságérték, beleértve a helyi értéket is.
Az alábbi példa a BackgroundButton tulajdonságát animálja. Technikailag a tulajdonságelem szintaxisa egy üres SolidColorBrush-t állít be Background-nek, és a ColorSolidColorBrush tulajdonsága animálva van.
<Button Content="I am animated">
<Button.Background>
<SolidColorBrush x:Name="AnimBrush"/>
</Button.Background>
<Button.Triggers>
<EventTrigger RoutedEvent="FrameworkElement.Loaded">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetName="AnimBrush"
Storyboard.TargetProperty="(SolidColorBrush.Color)"
From="Blue" To="White" Duration="0:0:1"
AutoReverse="True" RepeatBehavior="Forever" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
A tulajdonságok animálásáról további információt az Animáció áttekintése és a Storyboards áttekintése című témakörben talál.
Metaadatok felülbírálása
A függőségi tulajdonság adott viselkedését úgy módosíthatja, hogy felülbírálja annak metaadatait, amikor a függőségi tulajdonságot eredetileg regisztráló osztályból származik. A metaadatok felülírása a DependencyProperty-azonosítóra támaszkodik, és nem igényli a tulajdonság újbóli megadását. A metaadatok módosítását a tulajdonságrendszer natív módon kezeli. Minden osztály egyedi metaadatokat tárol az alaposztályoktól örökölt összes tulajdonsághoz típusonként.
Az alábbi példa felülírja egy DefaultStyleKey függőségi tulajdonság metaadatait. Az adott függőségi tulajdonság metaadatainak felülírása egy implementációs minta része, amely olyan vezérlőket hoz létre, amelyek a témák alapértelmezett stílusait használhatják.
public class SpinnerControl : ItemsControl
{
static SpinnerControl() => DefaultStyleKeyProperty.OverrideMetadata(
typeof(SpinnerControl),
new FrameworkPropertyMetadata(typeof(SpinnerControl))
);
}
Public Class SpinnerControl
Inherits ItemsControl
Shared Sub New()
DefaultStyleKeyProperty.OverrideMetadata(GetType(SpinnerControl), New FrameworkPropertyMetadata(GetType(SpinnerControl)))
End Sub
End Class
A függőségi tulajdonságok metaadatainak felülbírálásával vagy elérésével kapcsolatos további információkért lásd: Függőségi tulajdonság metaadatainak felülbírálása.
Tulajdonságérték öröklése
Egy elem örökölheti egy függőségi tulajdonság értékét az objektumfában lévő szülőtől.
Megjegyzés:
A tulajdonságérték öröklési viselkedése nincs globálisan engedélyezve minden függőségi tulajdonság esetében, mivel az öröklés számítási ideje hatással van a teljesítményre. A tulajdonságértékek öröklése általában csak olyan forgatókönyvekben engedélyezett, amelyek alkalmazhatóságot javasolnak. A függőségi tulajdonság öröklődését az SDK-referencia függőségtulajdonság-információk szakaszában ellenőrizheti.
Az alábbi példa egy kötést mutat be, amely tartalmazza a DataContext tulajdonságot a kötés forrásának megadásához. A gyermekobjektumok kötéseinek tehát nem kell megadniuk a forrást, és használhatják a szülő DataContext objektum StackPanel örökölt értékét. Vagy egy gyermekobjektum közvetlenül megadhatja saját DataContext vagy a Source értékét a Binding-ben, és nem használja az örökölt értéket.
<StackPanel Canvas.Top="50" DataContext="{Binding Source={StaticResource TestData}}">
<Button Content="{Binding XPath=test[2]/@text}"/>
</StackPanel>
További információ: Tulajdonságérték öröklése.
WPF-tervező integrációja
A függőségi tulajdonságokként implementált tulajdonságokat tartalmazó egyéni vezérlők jól integrálhatók a VISUAL Studio WPF Designerrel. Ilyen például a közvetlen és csatolt függőségi tulajdonságok szerkesztése a Tulajdonságok ablakban. További információ: A szerzői műveletek szabályozása – áttekintés
Függőségi tulajdonság értékének elsőbbsége
A WPF tulajdonságrendszerben lévő tulajdonságalapú bemenetek bármelyike beállíthatja egy függőségi tulajdonság értékét. A függőségi tulajdonság értékének prioritása azért létezik, hogy a tulajdonságok értékének megszerzésére vonatkozó különböző forgatókönyvek kiszámítható módon kapcsolódjanak össze.
Megjegyzés:
Az SDK dokumentációja néha a "helyi érték" vagy a "helyileg beállított érték" kifejezést használja a függőségi tulajdonságok megvitatásakor. A helyileg beállított érték olyan tulajdonságérték, amely közvetlenül egy kódbeli objektumpéldányon vagy az XAML elemattribútumaként van beállítva.
A következő példa egy stílust tartalmaz, amely bármely gomb Background tulajdonságára vonatkozik, de megad egy gombot egy helyileg beállított Background tulajdonsággal. Ennek a gombnak technikailag kétszer van beállítva a Background tulajdonsága, bár csak egy érték érvényes – a legmagasabb prioritású érték. A helyileg beállított érték a legmagasabb prioritással rendelkezik, kivéve a futó animációt, amely itt nem létezik. A második gomb tehát a Background tulajdonság helyileg beállított értékét használja a stíluskészlet értéke helyett. Az első gomb nem rendelkezik helyi értékkel vagy más olyan értékkel, amely nagyobb elsőbbséget élvez a stílusválasztónál, ezért a Background tulajdonság stílusbeállítási értékét használja.
<StackPanel>
<StackPanel.Resources>
<Style x:Key="{x:Type Button}" TargetType="{x:Type Button}">
<Setter Property="Background" Value="Orange"/>
</Style>
</StackPanel.Resources>
<Button>I am styled orange</Button>
<Button Background="Pink">I am locally set to pink (not styled orange)</Button>
</StackPanel>
Miért létezik a függőségi tulajdonság elsőbbsége?
A helyileg beállított értékek elsőbbséget élveznek a stílusbeállítási értékekkel szemben, ami támogatja az elemtulajdonságok helyi szabályozását. További információért lásd: A függőségi tulajdonság értékének prioritása.
Megjegyzés:
A WPF-elemeken definiált számos tulajdonság nem függőségi tulajdonságok, mivel a függőségi tulajdonságok általában csak akkor lettek implementálva, ha a WPF tulajdonságrendszer egyik funkciójára volt szükség. A funkciók közé tartozik az adatkötés, a stílus, az animáció, az alapértelmezett értéktámogatás, az öröklés, a csatolt tulajdonságok és az érvénytelenítés.
További információ a függőségi tulajdonságokról
Előfordulhat, hogy az összetevő-fejlesztők vagy alkalmazásfejlesztők saját függőségi tulajdonságot szeretnének létrehozni, hogy olyan képességeket adjanak hozzá, mint például az adatkötés vagy a stílusok támogatása, vagy az érvénytelenítés és az értékkényszer-támogatás. További információkért lásd: Egyéni függőségi tulajdonságok.
Vegye figyelembe, hogy a függőségi tulajdonságok nyilvános tulajdonságok, amelyeket bármely, egy példányhoz hozzáféréssel rendelkező hívó elérhet vagy felderíthet. További információért lásd: Függőségi tulajdonság biztonsága.
A csatolt tulajdonság olyan tulajdonságtípus, amely támogatja az XAML speciális szintaxisát. A csatolt tulajdonság gyakran nem rendelkezik 1:1 megfeleléssel a közös nyelvi futtatókörnyezet tulajdonsággal, és nem feltétlenül függőségi tulajdonság. A csatolt tulajdonság fő célja, hogy lehetővé tegye a gyermekelemek számára, hogy tulajdonságértékeket jelentsenek egy szülőelemnek, még akkor is, ha a szülőelem és a gyermekelem nem tartalmazza ezt a tulajdonságot az osztálytagok listájának részeként. Az egyik elsődleges forgatókönyv az, hogy egy gyermekelem tájékoztatja a szülőelemeket arról, hogyan jelenítse meg őket a felhasználói felületen. Példák: Dock és Left. További információ: Csatolt tulajdonságok áttekintése.
Lásd még
- egyéni függőségi tulajdonságok
- írásvédett függőségi tulajdonságok
- XAML WPF-
- WPF-architektúra
.NET Desktop feedback