Aracılığıyla paylaş


Ö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 özellikle bağımlılık özelliğinde meta verietkinleştirilmediği sürece değer devralma etkin değildir. Özellik değeri devralma etkinleştirildiğinde bile, alt öğe ancak daha yüksek bir öncelikli değeri olmadığında bir özellik değerini devralır.

Önkoşullar

Makalenin, bağımlılık özellikleri hakkında temel bilgiye sahip olduğunuzu ve Bağımlılık Özelliklerine Genel Bakışokuduğunuzu varsaydığı kabul edilir. 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 bulunduğu bir öğe ağacında, ü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, AllowDrop bağımlılık özelliğini, UIElement sınıfında, özellik değeri devralma etkinleştiren ve varsayılan değeri falseolarak belirleyen özellik meta verisi ile kaydeder. AllowDrop bağımlılık özelliği Canvas, StackPanelve Label öğelerinde bulunur çünkü bunların tümü UIElementtüretilir. AllowDrop bağımlılık özelliği, canvas1 üzerinde trueolarak ayarlandığından, alt stackPanel1 ve label1 öğeleri, true'i AllowDrop değerleri olarak devralırlar.

<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, canvas2'ün alt koleksiyonu'ye eklenir. Benzer şekilde, label2stackPanel2çocuk koleksiyonuna eklenir. AllowDrop bağımlılık özelliği canvas2 üzerinde trueolarak ayarlandığından, alt öğeler stackPanel2 ve label2, true'i AllowDrop değeri olarak devralır.

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)

Mülk değeri devralmanın pratik uygulamaları

Belirli WPF bağımlılık özellikleri, AllowDrop ve FlowDirectiongibi varsayı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, AllowDropUIElement temel sınıfında uygulandığından, bağımlılık özelliği 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 devredilmemiş özellik değerlerini 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.

FlowDirection bağımlılık özelliği, 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. meta veri özelliğinde değer devralma etkinleştirildiğinden, 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.

Özelleştirilmiş özelliği devralınabilir hale getirme

bir FrameworkPropertyMetadataörneğinde Inherits özelliğini etkinleştirip ö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, InheritsFrameworkPropertyMetadataiçinde false olarak ayarlanır. Özellik değerini devralınabilir hale getirmek performansı etkiler, bu nedenle Inherits yalnızca bu özellik gerekiyorsa true olarak ayarlayın.

Meta verilerde Inherits etkinleştirildiğinde bir bağımlılık özelliği kaydederken, 'de, "Ekli Özellik Kaydetme" bölümü altında açıklandığı şekilde, RegisterAttached yöntemini kullanın. Ayrıca, devralınabilir bir değerin var olması için özelliğine varsayılan bir değer atayın. Ayrıca sahip türü üzerinde get ve set erişimcileri olan bir özellik sarmalayıcı oluşturmak isteyebilirsiniz; aynı eklenmemiş bağımlılık özelliğinde olduğu gibi. Bu yolla, bir sahip sınıfta veya türetilmiş türde özellik sarmalayıcısını kullanarak özellik değerini ayarlayabilirsiniz. Aşağıdaki örnek, Inherits etkin ve varsayılan değeri falseolan IsTransparentadlı bir bağımlılık özelliği oluşturur. Örnek ayrıca get ve set erişimcilerine sahip bir property wrapper 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ğerlerini denetleyebilir ve geçerli bir sonuç alabilirsiniz. Ekli özelliklerin tipik senaryosu, alt öğelerde özellik değerleri ayarlamaktır ve söz konusu özellik ağaçtaki her DependencyObject öğesinde ö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 Brushgibi bir WPF çekirdek düzeyi nesnesi eklediğinizde, kesintili bir mantıksal ağaç oluşturmuşsunuzdur. Mantıksal ağaç WPF çerçeve düzeyi bir kavram olduğundan, gerçek bir mantıksal ağaç kavramsal olarak Brushboyunca genişlemez. Mantıksal bir ağacın kapsamını analiz etmek ve görüntülemek için LogicalTreeHelper yardımcı yöntemlerini kullanabilirsiniz. Özellik değeri devralma, devralınan değerleri devamsız bir mantıksal ağaç üzerinden geçirebilir, ancak yalnızca devralınabilir özellik ekli bir özellik olarak kaydedildiyse ve devralmayı engelleyen bir sınır (örneğin, bir Frame) yoksa.

Not

Ö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 Inherits belirttiğinizde, RegisterAttachedkullanarak özelliklerinizi kaydedin.

Ayrıca bkz.