Ö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.
Ö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.
Öğ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 AllowDrop UIElement bağımlılık özelliğini özellik değeri devralmayı etkinleştiren ve varsayılan değeri olarak ayarlayan özellik meta verileriyle false
kaydeder. 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 true
ayarlandığı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 canvas2
eklenir. Benzer şekilde, label2
alt koleksiyonuna stackPanel2
eklenir. AllowDrop üzerindeki canvas2
bağımlılık özelliği olarak true
ayarlandığı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 AllowDrop FlowDirectionvarsayı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 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, 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 FrameworkPropertyMetadata
olarak 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 false
olan Inherits
adlı IsTransparent
bir 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 Brush
geniş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
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 her belirttiğinizde Inherits , kullanarak RegisterAttachedözelliklerinizi kaydedin.
Ayrıca bkz.
.NET Desktop feedback