Özellik değeri devralma (WPF .NET)

Özellik değeri devralma, Windows Presentation Foundation (WPF) özellik sisteminin bir özelliğidir ve bağımlılık özelliklerine uygulanır. Özellik değeri devralma, bir öğe ağacındaki alt öğelerin belirli bir özelliğin değerini en yakın üst öğeden almasını sağlar. Üst öğe özellik değerini özellik değeri devralma yoluyla da edinmiş olabileceğinden, sistem büyük olasılıkla sayfa köküne geri döner.

WPF özellik sistemi varsayılan olarak özellik değeri devralmayı etkinleştirmez ve bağımlılık özelliği meta verilerinde özellikle etkinleştirilmediği sürece değer devralma etkin değildir. Özellik değeri devralma etkinleştirildiğinde bile, alt öğe yalnızca daha yüksek bir öncelik değeri olmadığında bir özellik değerini devralır.

Önemli

.NET 7 ve .NET 6 için Masaüstü Kılavuzu belgeleri yapım aşamasındadır.

Ön koş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.

Öğe ağacı aracılığıyla devralma

Özellik değeri devralma, türetilmiş sınıfların temel sınıf üyelerini devraldığı nesne odaklı programlamada sınıf devralma ile aynı kavram değildir. XAML'de devralınan temel sınıf özellikleri türetilmiş sınıfları temsil eden XAML öğelerinin öznitelikleri olarak gösterilmiş olsa da, bu tür devralma WPF'de de etkindir.

Özellik değeri devralma, bir bağımlılık özelliği değerinin özelliğini içeren bir öğe ağacı içinde üst öğeden alt öğelere yayıldığı mekanizmadır. XAML işaretlemesinde, bir öğe ağacı iç içe öğeler olarak görünür.

Aşağıdaki örnekte XAML'de iç içe öğeler gösterilmektedir. WPF, sınıfındaki AllowDropUIElement bağımlılık özelliğini özellik değeri devralmayı etkinleştiren ve varsayılan değeri olarak ayarlayan özellik meta verileriylefalsekaydeder. bağımlılık AllowDrop özelliği, öğesinden türetildiklerinden UIElement, StackPanelve Label öğelerinde Canvasbulunur. AllowDrop üzerindeki canvas1 bağımlılık özelliği olarak trueayarlandığından, alt stackPanel1 öğe ve label1 öğeler değerleri AllowDrop olarak devralırtrue.

<Canvas x:Name="canvas1" Grid.Column="0" Margin="20" Background="Orange" AllowDrop="True">
    <StackPanel Name="stackPanel1" Margin="20" Background="Green">
        <Label Name="label1" Margin="20" Height="40" Width="40" Background="Blue"/>
    </StackPanel>
</Canvas>

Başka bir öğe nesnesinin alt öğe koleksiyonuna öğe nesneleri ekleyerek program aracılığıyla bir öğe ağacı da oluşturabilirsiniz. Çalışma zamanında, özellik değeri devralma sonuç nesne ağacında çalışır. Aşağıdaki örnekte, stackPanel2 alt koleksiyonuna canvas2eklenir. Benzer şekilde, label2 alt koleksiyonuna stackPanel2eklenir. AllowDrop üzerindeki canvas2 bağımlılık özelliği olarak trueayarlandığından, alt stackPanel2 öğe ve label2 öğeler değerleri AllowDrop olarak devralırtrue.

Canvas canvas2 = new()
{
    AllowDrop = true
};
StackPanel stackPanel2 = new();
Label label2 = new();
canvas2.Children.Add(stackPanel2);
stackPanel2.Children.Add(label2);
Dim canvas2 As New Canvas With {
    .AllowDrop = True
}
Dim stackPanel2 As New StackPanel()
Dim label2 As New Label()
canvas2.Children.Add(stackPanel2)
stackPanel2.Children.Add(label2)

Özellik değeri devralma pratik uygulamaları

Belirli WPF bağımlılık özellikleri ve gibi AllowDropFlowDirectionvarsayılan olarak etkinleştirilmiş değer devralma özelliğine sahiptir. Genellikle, varsayılan olarak değer devralmayı etkinleştiren özellikler, türetilmiş sınıflarda var olmaları için temel UI öğesi sınıflarında uygulanır. Örneğin, AllowDrop temel sınıfta uygulandığından UIElement , bağımlılık özelliği öğesinden UIElementtüretilen her denetimde de bulunur. WPF, bir kullanıcının üst öğede özellik değerini bir kez ayarlamasının ve bu özellik değerinin öğe ağacındaki alt öğelere yayılmasının uygun olduğu bağımlılık özelliklerinde değer devralmayı etkinleştirir.

Özellik değeri devralma modeli, bağımlılık özellik değeri önceliğine göre hem devralınmış hem de doğasız özellik değerleri atar. Bu nedenle, bir üst öğe özellik değeri yalnızca alt öğe özelliği yerel olarak ayarlanmış bir değer veya stiller, şablonlar veya veri bağlama aracılığıyla elde edilen bir değer gibi daha yüksek bir öncelik değerine sahip değilse alt öğeye uygulanır.

dependency özelliği, FlowDirection bir üst öğe içindeki metin ve alt kullanıcı arabirimi öğelerinin düzen yönünü ayarlar. Genellikle, sayfa içindeki metin ve kullanıcı arabirimi öğelerinin akış yönünün tutarlı olmasını beklersiniz. değerinin özellik meta verilerinde değer devralma etkinleştirildiğinden FlowDirection, bir değerin bir sayfa için öğe ağacının en üstünde yalnızca bir kez ayarlanması gerekir. Akış yönlerinin bir karışımının sayfaya yönelik olduğu nadir durumlarda, yerel olarak ayarlanmış bir değer atanarak ağaçtaki bir öğede farklı bir akış yönü ayarlanabilir. Yeni akış yönü daha sonra bu düzeyin altındaki alt öğelere yayılır.

Özel özelliği devralınabilir hale getirme

bir örneğinde FrameworkPropertyMetadataözelliğini etkinleştirerek Inherits ve ardından özel bağımlılık özelliğinizi bu meta veri örneğine kaydederek özel bağımlılık özelliğini devralınabilir hale getirebilirsiniz. Varsayılan olarak, Inherits içinde FrameworkPropertyMetadataolarak false ayarlanır. Bir özellik değerinin devralınabilir hale getirilmesi performansı etkiler, bu nedenle yalnızca bu özellik gerekiyorsa olarak true ayarlanırInherits.

Meta verilerde etkin olan Inherits bir bağımlılık özelliğini kaydettiğinizde, Ekli özelliği kaydetme bölümünde açıklandığı gibi yöntemini kullanınRegisterAttached. Ayrıca, devralınabilir bir değerin var olması için özelliğine varsayılan bir değer atayın. Eklenmemiş bağımlılık özelliğinde olduğu gibi sahip türünde ve set erişimcileriyle bir özellik sarmalayıcısı get da oluşturmak isteyebilirsiniz. Bu şekilde, bir sahipte veya türetilmiş türde özellik sarmalayıcısını kullanarak özellik değerini ayarlayabilirsiniz. Aşağıdaki örnek, etkin ve varsayılan değeri falseolan Inherits adlı IsTransparentbir bağımlılık özelliği oluşturur. Örnek ayrıca ve set erişimcileri ile bir get özellik sarmalayıcı içerir.

public class Canvas_IsTransparentInheritEnabled : Canvas
{
    // Register an attached dependency property with the specified
    // property name, property type, owner type, and property metadata
    // (default value is 'false' and property value inheritance is enabled).
    public static readonly DependencyProperty IsTransparentProperty =
        DependencyProperty.RegisterAttached(
            name: "IsTransparent",
            propertyType: typeof(bool),
            ownerType: typeof(Canvas_IsTransparentInheritEnabled),
            defaultMetadata: new FrameworkPropertyMetadata(
                defaultValue: false,
                flags: FrameworkPropertyMetadataOptions.Inherits));

    // Declare a get accessor method.
    public static bool GetIsTransparent(Canvas element)
    {
        return (bool)element.GetValue(IsTransparentProperty);
    }

    // Declare a set accessor method.
    public static void SetIsTransparent(Canvas element, bool value)
    {
        element.SetValue(IsTransparentProperty, value);
    }

    // For convenience, declare a property wrapper with get/set accessors.
    public bool IsTransparent
    {
        get => (bool)GetValue(IsTransparentProperty);
        set => SetValue(IsTransparentProperty, value);
    }
}
Public Class Canvas_IsTransparentInheritEnabled
    Inherits Canvas

    ' Register an attached dependency property with the specified
    ' property name, property type, owner type, and property metadata
    ' (default value is 'false' and property value inheritance is enabled).
    Public Shared ReadOnly IsTransparentProperty As DependencyProperty =
        DependencyProperty.RegisterAttached(
            name:="IsTransparent",
            propertyType:=GetType(Boolean),
            ownerType:=GetType(Canvas_IsTransparentInheritEnabled),
            defaultMetadata:=New FrameworkPropertyMetadata(
                defaultValue:=False,
                flags:=FrameworkPropertyMetadataOptions.[Inherits]))

    ' Declare a get accessor method.
    Public Shared Function GetIsTransparent(element As Canvas) As Boolean
        Return element.GetValue(IsTransparentProperty)
    End Function

    ' Declare a set accessor method.
    Public Shared Sub SetIsTransparent(element As Canvas, value As Boolean)
        element.SetValue(IsTransparentProperty, value)
    End Sub

    ' For convenience, declare a property wrapper with get/set accessors.
    Public Property IsTransparent As Boolean
        Get
            Return GetValue(IsTransparentProperty)
        End Get
        Set(value As Boolean)
            SetValue(IsTransparentProperty, value)
        End Set
    End Property
End Class

Eklenen özellikler kavramsal olarak genel özelliklere benzer. Herhangi bir DependencyObject değer üzerinde değerini denetleyebilirsiniz ve geçerli bir sonuç elde edebilirsiniz. Ekli özelliklerin tipik senaryosu, alt öğelerde özellik değerleri ayarlamaktır ve söz konusu özellik ağaçtaki her DependencyObject öğede örtük olarak ekli özellik olarak mevcutsa bu senaryo daha etkili olur.

Ağaç sınırları boyunca özellik değerlerini devralma

Özellik devralma, öğe ağacından geçiş yaparak çalışır. Bu ağaç genellikle mantıksal ağaçla paraleldir. Ancak, öğe ağacını tanımlayan işaretlemeye bir WPF çekirdek düzeyi nesnesi Brusheklediğinizde, kesintili bir mantıksal ağaç oluşturmuşsunuzdur. Mantıksal ağaç WPF çerçeve düzeyi kavramı olduğundan, gerçek bir mantıksal ağaç kavramsal olarak aracılığıyla Brushgenişletilmez. Mantıksal ağacın kapsamını analiz etmek ve görüntülemek için yardımcı yöntemlerini LogicalTreeHelper kullanabilirsiniz. Özellik değeri devralma, devralınan değerleri kesintili bir mantıksal ağaç üzerinden geçirebilir, ancak yalnızca devralınabilir özellik ekli bir özellik olarak kaydedildiyse ve devralmayı engelleyen kasıtlı bir sınır yoksa ( gibi).Frame

Dekont

Özellik değeri devralma, eklenmemiş bağımlılık özellikleri için çalışıyor gibi görünse de, çalışma zamanı ağacındaki bazı öğe sınırları aracılığıyla eklenmemiş bir özelliğin devralma davranışı tanımlanmamıştır. Özellik meta verilerinde her belirttiğinizde Inherits , kullanarak RegisterAttachedözelliklerinizi kaydedin.

Ayrıca bkz.