Ö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 false
olarak belirleyen özellik meta verisi ile kaydeder.
AllowDrop
bağımlılık özelliği Canvas, StackPanelve Label öğelerinde bulunur çünkü bunların tümü UIElement
türetilir.
AllowDrop
bağımlılık özelliği, canvas1
üzerinde true
olarak 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, label2
stackPanel2
çocuk koleksiyonuna eklenir.
AllowDrop bağımlılık özelliği canvas2
üzerinde true
olarak 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, AllowDrop
UIElement temel sınıfında uygulandığından, bağımlılık özelliği UIElement
tü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,
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.
Ö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, Inherits
FrameworkPropertyMetadata
iç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 false
olan IsTransparent
adlı 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 Brush
boyunca 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.
.NET Desktop feedback