Načítání XAML a vlastnosti závislostí (WPF .NET)
Implementace Windows Presentation Foundation (WPF) procesoru XAML (Extensible Application Markup Language) je ze své podstaty si vědomá závislostních vlastností. Procesor XAML používá metody systému vlastností WPF k načtení atributů vlastností XAML a zpracování závislostí a zcela obchází obálky vlastností závislostí pomocí metod systému vlastností WPF, jako jsou GetValue a SetValue. Pokud tedy do obalovače vlastností vaší vlastní závislé vlastnosti přidáte vlastní logiku, nebude ji procesor XAML volat, pokud se hodnota vlastnosti nastavuje v jazyce XAML.
Požadavky
Článek předpokládá základní znalost vlastností závislostí a že jste si přečetli přehled vlastností závislostí. Pokud chcete postupovat podle příkladů v tomto článku, pomůže vám to, pokud znáte jazyk XAML (Extensible Application Markup Language) a víte, jak psát aplikace WPF.
Výkon zavaděče WPF XAML
Je méně náročné na výpočetní výkon, když procesor WPF XAML přímo volá SetValue, aby nastavil hodnotu vlastnosti závislosti, než použít obálku této vlastnosti.
Pokud by procesor XAML použil obálku vlastnosti, vyžadovalo by to odvození celého objektového modelu podpůrného kódu pouze na základě vztahů typu a členů, které jsou uvedeny ve značkovacím jazyce. I když lze typ identifikovat z označení pomocí kombinace xmlns
a atributů sestavení, identifikace členů, určení, které členy lze nastavit jako atribut, a řešení podporovaných typů hodnot vlastností, by vyžadovalo rozsáhlou reflexi pomocí PropertyInfo.
Systém vlastností WPF udržuje tabulku úložišť vlastností závislostí implementovaných v daném DependencyObject odvozeného typu. Procesor XAML používá danou tabulku k odvození identifikátoru vlastnosti pro závislostní vlastnost. Například podle konvence je identifikátor vlastnosti závislosti pro vlastnost s názvem ABC
ABCProperty
. Procesor XAML může efektivně nastavit hodnotu jakékoli vlastnosti závislosti voláním metody SetValue
na jeho obsahující typ pomocí identifikátoru vlastnosti závislosti.
Další informace o obalech vlastností závislostí naleznete v tématu Vlastní vlastnosti závislostí.
Důsledky pro vlastní vlastnosti závislostí
Procesor WPF XAML obchází obálky vlastností a přímo volá SetValue pro nastavení hodnoty vlastnosti závislosti. Proto se vyhněte vložení jakékoli další logiky do set
přístupové metody vaší vlastní závislé vlastnosti, protože tato logika se nespustí při nastavování hodnoty vlastnosti v XAML. Přístupový prvek set
by měl obsahovat pouze volání SetValue
.
Podobně aspekty procesoru WPF XAML, které získávají hodnoty vlastností, obcházejí obálku vlastnosti a přímo volají GetValue. Proto také nepoužívejte žádnou další logiku do get
přistupovacího objektu vlastní vlastnosti závislosti, protože tato logika se nespustí při čtení hodnoty vlastnosti v XAML. Přístupový prvek get
by měl obsahovat pouze volání GetValue
.
Vlastnost závislosti s příkladem obalu
Následující příklad ukazuje doporučenou definici vlastnosti závislostí s obálkami vlastností. Identifikátor vlastnosti závislosti je uložen jako pole public static readonly
a get
a set
přístupové objekty neobsahují žádný kód nad rámec nezbytných metod systému vlastností WPF, které vrací hodnotu vlastnosti závislosti. Pokud máte kód, který se musí spustit, když se změní hodnota vlastnosti závislosti, zvažte vložení tohoto kódu do PropertyChangedCallback vlastnosti závislosti. Další informace najdete v tématu zpětná volání změněná vlastnostmi.
// Register a dependency property with the specified property name,
// property type, owner type, and property metadata. Store the dependency
// property identifier as a public static readonly member of the class.
public static readonly DependencyProperty AquariumGraphicProperty =
DependencyProperty.Register(
name: "AquariumGraphic",
propertyType: typeof(Uri),
ownerType: typeof(Aquarium),
typeMetadata: new FrameworkPropertyMetadata(
defaultValue: new Uri("http://www.contoso.com/aquarium-graphic.jpg"),
flags: FrameworkPropertyMetadataOptions.AffectsRender,
propertyChangedCallback: new PropertyChangedCallback(OnUriChanged))
);
// Property wrapper with get & set accessors.
public Uri AquariumGraphic
{
get => (Uri)GetValue(AquariumGraphicProperty);
set => SetValue(AquariumGraphicProperty, value);
}
// Property-changed callback.
private static void OnUriChanged(DependencyObject dependencyObject,
DependencyPropertyChangedEventArgs e)
{
// Some custom logic that runs on effective property value change.
Uri newValue = (Uri)dependencyObject.GetValue(AquariumGraphicProperty);
Debug.WriteLine($"OnUriChanged: {newValue}");
}
' Register a dependency property with the specified property name,
' property type, owner type, and property metadata. Store the dependency
' property identifier as a public static readonly member of the class.
Public Shared ReadOnly AquariumGraphicProperty As DependencyProperty =
DependencyProperty.Register(
name:="AquariumGraphic",
propertyType:=GetType(Uri),
ownerType:=GetType(Aquarium),
typeMetadata:=New FrameworkPropertyMetadata(
defaultValue:=New Uri("http://www.contoso.com/aquarium-graphic.jpg"),
flags:=FrameworkPropertyMetadataOptions.AffectsRender,
propertyChangedCallback:=New PropertyChangedCallback(AddressOf OnUriChanged)))
' Property wrapper with get & set accessors.
Public Property AquariumGraphic As Uri
Get
Return CType(GetValue(AquariumGraphicProperty), Uri)
End Get
Set
SetValue(AquariumGraphicProperty, Value)
End Set
End Property
' Property-changed callback.
Private Shared Sub OnUriChanged(dependencyObject As DependencyObject,
e As DependencyPropertyChangedEventArgs)
' Some custom logic that runs on effective property value change.
Dim newValue As Uri = CType(dependencyObject.GetValue(AquariumGraphicProperty), Uri)
Debug.WriteLine($"OnUriChanged: {newValue}")
End Sub
Viz také
- Přehled vlastností závislostí
- XAML v WPF
- vlastní závislostní vlastnosti
- metadata vlastnosti závislosti
- závislostní vlastnosti typu kolekce
- zabezpečení vlastností závislostí
- Vzory bezpečného konstruktoru pro DependencyObjects
.NET Desktop feedback