XAML yükleme ve bağımlılık özellikleri (WPF .NET)

Genişletilebilir Uygulama Biçimlendirme Dili (XAML) işlemcisinin Windows Presentation Foundation (WPF) uygulaması doğal olarak bağımlılık özelliğine duyarlıdır. Bu nedenle, XAML işlemcisi XAML'yi yüklemek ve bağımlılık özelliği özniteliklerini işlemek için WPF özellik sistemi yöntemlerini kullanır ve ve SetValuegibi GetValue WPF özellik sistemi yöntemlerini kullanarak bağımlılık özelliği sarmalayıcılarını tamamen atlar. Bu nedenle, özel bağımlılık özelliğinizin özellik sarmalayıcısına özel mantık eklerseniz, XAML'de bir özellik değeri ayarlandığında XAML işlemcisi tarafından çağrılmaz.

Önkoşullar

Makalede bağımlılık özellikleri hakkında temel bilgiler edindiğiniz ve Bağımlılık özelliklerine genel bakış makalesini okuduğunuz varsayılır. Bu makaledeki örnekleri takip etmek için Genişletilebilir Uygulama biçimlendirme dili (XAML) hakkında bilgi sahibi olmanız ve WPF uygulamalarının nasıl yazabileceğinizi bilmeniz yardımcı olur.

WPF XAML yükleyici performansı

WPF XAML işlemcisinin bağımlılık özelliğinin özellik sarmalayıcısını kullanmak yerine bağımlılık özelliğinin değerini ayarlamak için doğrudan çağırması SetValue işlem açısından daha ucuzdur.

XAML işlemcisi özellik sarmalayıcısını kullandıysa, yalnızca işaretlemede belirtilen tür ve üye ilişkilerine göre yedekleme kodunun tüm nesne modelinin çıkarılması gerekir. Tür, ve derleme özniteliklerinin xmlns birleşimi kullanılarak işaretlemeden tanımlansa da, üyeleri tanımlamak, hangi üyelerin öznitelik olarak ayarlanabileceğini belirlemek ve desteklenen özellik değeri türlerini çözümlemek, kullanılarak PropertyInfokapsamlı yansıma gerektirir.

WPF özellik sistemi, belirli DependencyObject bir türetilmiş türe uygulanan bağımlılık özelliklerinin depolama tablosunu tutar. XAML işlemcisi, bağımlılık özelliği için bağımlılık özelliği tanımlayıcısını çıkarsamak için bu tabloyu kullanır. Örneğin, kurala göre adlı ABC bir bağımlılık özelliğinin bağımlılık özelliği tanımlayıcısı şeklindedir ABCProperty. XAML işlemcisi, bağımlılık özelliği tanımlayıcısını kullanarak yöntemini içeren türünde çağırarak SetValue herhangi bir bağımlılık özelliğinin değerini verimli bir şekilde ayarlayabilir.

Bağımlılık özelliği sarmalayıcıları hakkında daha fazla bilgi için bkz . Özel bağımlılık özellikleri.

Özel bağımlılık özelliklerinin etkileri

WPF XAML işlemcisi özellik sarmalayıcılarını atlar ve bağımlılık özellik değeri ayarlamak için doğrudan çağırır SetValue . Bu nedenle, XAML'de set bir özellik değeri ayarlandığında bu mantık çalışmayacağından, özel bağımlılık özelliğinizin erişimcisine ek mantık koymaktan kaçının. Erişimci set yalnızca bir SetValue çağrı içermelidir.

Benzer şekilde, özellik değerlerini alan WPF XAML işlemcisinin özellikleri, özellik sarmalayıcısını atlar ve doğrudan çağırır GetValue. Bu nedenle, XAML'de get bir özellik değeri okunduğunda bu mantık çalışmayacağından, özel bağımlılık özelliğinizin erişimcisine ek mantık koymaktan da kaçının. Erişimci get yalnızca bir GetValue çağrı içermelidir.

Sarmalayıcı örneğiyle bağımlılık özelliği

Aşağıdaki örnekte, özellik sarmalayıcıları ile önerilen bağımlılık özellik tanımı gösterilmektedir. Bağımlılık özelliği tanımlayıcısı bir public static readonly alan olarak depolanır ve get ve set erişimcileri bağımlılık özelliği değerini destekleyen gerekli WPF özellik sistemi yöntemlerinin ötesinde kod içermez. Bağımlılık özelliğinizin değeri değiştiğinde çalışması gereken kodunuz varsa, bu kodu bağımlılık özelliğiniz için içine yerleştirmeyi PropertyChangedCallback göz önünde bulundurun. Daha fazla bilgi için bkz . Özellik değiştirme geri çağırmaları.

// 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

Ayrıca bkz.