Bağımlılık özelliklerine genel bakış (WPF .NET)
Windows Presentation Foundation (WPF), bir türün özelliğinin işlevselliğini genişletmek için kullanılabilecek bir hizmet kümesi sağlar. Toplu olarak, bu hizmetler WPF özellik sistemi olarak adlandırılır. WPF özellik sistemi tarafından yedeklenen bir özellik, bağımlılık özelliği olarak bilinir. Bu genel bakış, WPF özellik sistemini ve XAML'de ve kodda var olan bağımlılık özelliklerinin nasıl kullanılacağı da dahil olmak üzere bir bağımlılık özelliğinin özelliklerini açıklar. Bu genel bakış ayrıca bağımlılık özelliklerinin bağımlılık özelliği meta verileri gibi özel yönlerini ve özel bir sınıfta kendi bağımlılık özelliğinizi nasıl oluşturacağınız hakkında bilgi sağlar.
Önkoşullar
Bu makalede .NET türü sistemi ve nesne odaklı programlama hakkında temel bilgiler varsayılmaktadır. Bu makaledeki örnekleri takip etmek için XAML'nin anlaşılmasına ve WPF uygulamalarının nasıl yazılıp yazılamında bilgi edinmeye yardımcı olur. Daha fazla bilgi için bkz . Öğretici: .NET ile yeni bir WPF uygulaması oluşturma.
Bağımlılık özellikleri ve CLR özellikleri
WPF özellikleri genellikle standart .NET özellikleri olarak sunulur. Bu özelliklerle temel düzeyde etkileşim kurabilirsiniz ve bunların bağımlılık özelliği olarak uygulandığını asla bilemeyebilirsiniz. Ancak WPF özellik sisteminin bazı veya tüm özellikleri hakkında bilgi sahibi olmak, bu özelliklerden yararlanmanıza yardımcı olur.
Bağımlılık özelliklerinin amacı, aşağıdakiler gibi diğer girişlerin değerine göre bir özelliğin değerini hesaplamak için bir yol sağlamaktır:
- Temalar ve kullanıcı tercihi gibi sistem özellikleri.
- Veri bağlama ve animasyonlar/görsel taslaklar gibi tam zamanında özellik belirleme mekanizmaları.
- Kaynaklar ve stiller gibi çok kullanımlı şablonlar.
- Öğe ağacındaki diğer öğelerle üst-alt ilişkiler aracılığıyla bilinen değerler.
Ayrıca, bağımlılık özelliği şunları sağlayabilir:
- Bağımsız doğrulama.
- Varsayılan değerler.
- Diğer özelliklere yapılan değişiklikleri izleyen geri çağırmalar.
- Çalışma zamanı bilgilerine göre özellik değerlerini zorlamayı sağlayan bir sistem.
Türetilmiş sınıflar, mevcut özelliklerin gerçek uygulamasını geçersiz kılma veya yeni özellikler oluşturma yerine bağımlılık özelliğinin meta verilerini geçersiz kılarak var olan bir özelliğin bazı özelliklerini değiştirebilir.
SDK başvurusunda, bu özelliğin yönetilen başvuru sayfasında Bağımlılık Özelliği Bilgileri bölümünün bulunmasıyla bir bağımlılık özelliğini tanımlayabilirsiniz. Bağımlılık Özelliği Bilgileri bölümü, bu bağımlılık özelliğinin DependencyProperty tanımlayıcı alanına bir bağlantı içerir. Ayrıca bu özellik için meta veri seçeneklerinin listesini, sınıf başına geçersiz kılma bilgilerini ve diğer ayrıntıları içerir.
Bağımlılık özellikleri clr özelliklerini geri
Bağımlılık özellikleri ve WPF özellik sistemi, bir özelliği özel alanla yedeklemenin standart desenine alternatif olarak bir özelliği destekleyen bir tür sağlayarak özellik işlevselliğini genişletir. Bu türün adı şeklindedir DependencyProperty. WPF özellik sistemini tanımlayan diğer önemli tür, DependencyObjectbağımlılık özelliğini kaydedebilen ve sahip olabilecek temel sınıfı tanımlayan türüdür.
Yaygın olarak kullanılan bazı terimler şunlardır:
Tarafından yedeklenen DependencyPropertybir özellik olan dependency özelliği.
Bağımlılık özelliği kaydedilirken dönüş değeri olarak alınan ve ardından bir sınıfın statik üyesi olarak depolanan bir örnek olan bağımlılık özelliği tanımlayıcısı
DependencyProperty
. WPF özellik sistemiyle etkileşim kuran API'lerin çoğu bağımlılık özelliği tanımlayıcısını parametre olarak kullanır.özelliği için ve
set
uygulamaları olanget
CLR "sarmalayıcı". Bu uygulamalar, ve SetValue çağrılarında kullanarak bağımlılık özelliği tanımlayıcısını GetValue içerir. Bu şekilde, WPF özellik sistemi özelliği için yedekleme sağlar.
Aşağıdaki örnek, tanımlayıcının IsSpinning
arka yaptığı özellikle ilişkisini DependencyProperty
göstermek için bağımlılık özelliğini tanımlar.
public static readonly DependencyProperty IsSpinningProperty = DependencyProperty.Register(
"IsSpinning", typeof(bool),
typeof(MainWindow)
);
public bool IsSpinning
{
get => (bool)GetValue(IsSpinningProperty);
set => SetValue(IsSpinningProperty, value);
}
Public Shared ReadOnly IsSpinningProperty As DependencyProperty =
DependencyProperty.Register("IsSpinning", GetType(Boolean), GetType(MainWindow))
Public Property IsSpinning As Boolean
Get
Return GetValue(IsSpinningProperty)
End Get
Set(value As Boolean)
SetValue(IsSpinningProperty, value)
End Set
End Property
Özelliğin ve onun yedekleme DependencyProperty alanının adlandırma kuralı önemlidir. Alanın adı her zaman özelliğin adıdır ve sonek Property
eklenir. Bu kural ve bunun nedenleri hakkında daha fazla bilgi için bkz . Özel bağımlılık özellikleri.
Özellik değerlerini ayarlama
Özellikleri kodda veya XAML'de ayarlayabilirsiniz.
XAML'de özellik değerlerini ayarlama
Aşağıdaki XAML örneği, bir düğmenin arka plan rengini kırmızıya ayarlar. XAML özniteliğinin dize değeri, WPF XAML ayrıştırıcısı tarafından bir WPF türüne dönüştürülür. Oluşturulan kodda WPF türü, yoluyla bir Colorşeklindedir SolidColorBrush.
<Button Content="I am red" Background="Red"/>
XAML, özellikleri ayarlamak için çeşitli söz dizimi formlarını destekler. Belirli bir özellik için kullanılacak söz dizimi, bir özelliğin kullandığı değer türüne ve tür dönüştürücüsü varlığı gibi diğer faktörlere bağlıdır. Özellikleri ayarlamaya yönelik XAML söz dizimi hakkında daha fazla bilgi için bkz . WPF'de XAML ve XAML söz dizimi Ayrıntılı.
Aşağıdaki XAML örneğinde, öznitelik söz dizimi yerine özellik öğesi söz dizimi kullanan başka bir düğme arka planı gösterilmektedir. XAML, basit bir düz renk ayarlamak yerine düğme Background
özelliğini bir görüntüye ayarlar. Bir öğe bu görüntüyü temsil eder ve iç içe öğenin özniteliği görüntünün kaynağını belirtir.
<Button Content="I have an image background">
<Button.Background>
<ImageBrush ImageSource="stripes.jpg"/>
</Button.Background>
</Button>
Kodda özellikleri ayarlama
Kodda bağımlılık özelliği değerlerinin ayarlanması genellikle CLR "sarmalayıcı" tarafından kullanıma sunulan uygulamaya yapılan bir çağrıdır set
:
Button myButton = new();
myButton.Width = 200.0;
Dim myButton As New Button With {
.Width = 200.0
}
Özellik değeri almak temelde "sarmalayıcı" uygulamasına yapılan get
bir çağrıdır:
double whatWidth = myButton.Width;
Dim whatWidth As Double = myButton.Width
Ayrıca özellik sistemi API'lerini GetValue ve SetValue doğrudan çağırabilirsiniz. API'leri doğrudan çağırmak bazı senaryolar için uygundur, ancak genellikle mevcut özellikleri kullanırken uygun değildir. Sarmalayıcılar genellikle daha kullanışlı olur ve geliştirici araçları için özelliğin daha iyi kullanıma sunulmasını sağlar.
Özellikler XAML'de de ayarlanabilir ve daha sonra kodda arka planda kod aracılığıyla erişilebilir. Ayrıntılar için bkz . WPF'de arka planda kod ve XAML.
Bağımlılık özelliği tarafından sağlanan özellik işlevselliği
Bir alan tarafından yedeklenen bir özelliğin aksine, bağımlılık özelliği özelliğin işlevselliğini genişletir. Eklenen işlevler genellikle şu özelliklerden birini temsil eder veya destekler:
Kaynaklar
Bir kaynağa başvurarak bağımlılık özelliği değeri ayarlayabilirsiniz. Kaynaklar genellikle bir sayfa kök öğesinin Resources
veya uygulamanın özellik değeri olarak belirtilir, çünkü bu konumlar kaynağa uygun erişim sunar. Bu örnekte bir SolidColorBrush kaynak tanımlayacağız:
<StackPanel.Resources>
<SolidColorBrush x:Key="MyBrush" Color="Gold"/>
</StackPanel.Resources>
Kaynak tanımlandığına göre artık kaynağa başvurarak özelliği için Background
bir değer sağlayabiliriz:
<Button Background="{DynamicResource MyBrush}" Content="I am gold" />
WPF XAML'de statik veya dinamik bir kaynak başvurusu kullanabilirsiniz. Bu kaynağa DynamicResource adıyla başvurulur. Dinamik kaynak başvurusu yalnızca bağımlılık özelliğini ayarlamak için kullanılabilir, bu nedenle wpf özellik sistemi tarafından etkinleştirilen dinamik kaynak başvurusu kullanımıdır. Daha fazla bilgi için bkz . XAML kaynakları.
Not
Kaynaklar yerel değer olarak değerlendirilir ve başka bir yerel değer ayarlarsanız kaynak başvurularını ortadan kaldırabilirsiniz. Daha fazla bilgi için bkz . Bağımlılık özelliği değeri önceliği.
Veri bağlama
Bağımlılık özelliği, veri bağlama aracılığıyla bir değere başvurabilir. Veri bağlama, XAML'de belirli bir işaretleme uzantısı söz diziminde veya koddaki Binding nesnede çalışır. Veri bağlama ile, son özellik değerinin belirlenmesi çalışma zamanına kadar ertelenerek değerin bir veri kaynağından alınması gerekir.
Aşağıdaki örnek, XAML'de bildirilen bir Buttonbağlama kullanarak için özelliğini ayarlarContent. Bağlama devralınan bir veri bağlamı ve bir XmlDataProvider veri kaynağı kullanır (gösterilmez). Bağlamanın kendisi tarafından XPathveri kaynağı içindeki kaynak özelliğini belirtir.
<Button Content="{Binding Source={StaticResource TestData}, XPath=test[1]/@text}"/>
Not
Bağlamalar yerel bir değer olarak değerlendirilir, yani başka bir yerel değer ayarlarsanız bağlamayı ortadan kaldırırsınız. Ayrıntılar için bkz . Bağımlılık özelliği değeri önceliği.
Bağımlılık özellikleri veya DependencyObject sınıfı, veri bağlama işlemleri için kaynak özellik değerindeki DependencyObject
değişikliklerin bildirimini yerel olarak desteklemezINotifyPropertyChanged. Veri bağlama hedefinde değişiklik bildirebilen veri bağlamada kullanılacak özellikler oluşturma hakkında daha fazla bilgi için bkz . Veri bağlamaya genel bakış.
Stiller
Stiller ve şablonlar bağımlılık özelliklerini kullanmak için cazip nedenlerdir. Stiller özellikle uygulama kullanıcı arabirimini tanımlayan özellikleri ayarlamak için kullanışlıdır. Stiller genellikle XAML'de kaynak olarak tanımlanır. Stiller genellikle belirli özellikler için "ayarlayıcılar" ve başka bir özelliğin çalışma zamanı değerine göre bir özellik değerini değiştiren "tetikleyiciler" içerdiğinden özellik sistemiyle etkileşim kurar.
Aşağıdaki örnek, bir sözlük içinde tanımlanacak (gösterilmeyen) basit bir Resources stil oluşturur. Ardından bu stil doğrudan özelliğine Style Buttonuygulanır. Stil içindeki ayarlayıcı, stillenmiş Button
bir özelliği yeşil olarak ayarlarBackground.
<Style x:Key="GreenButtonStyle">
<Setter Property="Control.Background" Value="Green"/>
</Style>
<Button Style="{StaticResource GreenButtonStyle}" Content="I am green"/>
Daha fazla bilgi için bkz . Stil oluşturma ve şablon oluşturma.
Animasyonlar
Bağımlılık özellikleri animasyonlu olabilir. Uygulanan animasyon çalıştırıldığında, animasyonlu değer yerel değer de dahil olmak üzere diğer tüm özellik değerlerinden daha yüksek önceliğe sahiptir.
Aşağıdaki örnek, özelliğine Background animasyon ekler Button. Teknik olarak, özellik öğesinin söz dizimi boş SolidColorBrush değerini olarak Background
ayarlar ve Color özelliğinin SolidColorBrush
animasyonu oluşturulur.
<Button Content="I am animated">
<Button.Background>
<SolidColorBrush x:Name="AnimBrush"/>
</Button.Background>
<Button.Triggers>
<EventTrigger RoutedEvent="FrameworkElement.Loaded">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetName="AnimBrush"
Storyboard.TargetProperty="(SolidColorBrush.Color)"
From="Blue" To="White" Duration="0:0:1"
AutoReverse="True" RepeatBehavior="Forever" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
Özellikleri animasyonlandırma hakkında daha fazla bilgi için bkz . Animasyona genel bakış ve Görsel Taslaklara genel bakış.
Meta veri geçersiz kılmaları
Bağımlılık özelliğini ilk kaydeden sınıftan türetdiğinizde meta verilerini geçersiz kılarak bağımlılık özelliğinin belirli davranışlarını değiştirebilirsiniz. Meta verilerin geçersiz kılınması tanımlayıcıya DependencyProperty dayanır ve özelliğin yeniden eklenmesini gerektirmez. Meta veri değişikliği özellik sistemi tarafından yerel olarak işlenir. Her sınıf, tür bazında temel sınıflardan devralınan tüm özellikler için tek tek meta verileri barındırır.
Aşağıdaki örnek bir DefaultStyleKey bağımlılık özelliği için meta verileri geçersiz kılar. Bu özel bağımlılık özelliği için meta verileri geçersiz kılma, temalardan varsayılan stilleri kullanabilen denetimler oluşturmaya yönelik bir uygulama düzeninin parçasıdır.
public class SpinnerControl : ItemsControl
{
static SpinnerControl() => DefaultStyleKeyProperty.OverrideMetadata(
typeof(SpinnerControl),
new FrameworkPropertyMetadata(typeof(SpinnerControl))
);
}
Public Class SpinnerControl
Inherits ItemsControl
Shared Sub New()
DefaultStyleKeyProperty.OverrideMetadata(GetType(SpinnerControl), New FrameworkPropertyMetadata(GetType(SpinnerControl)))
End Sub
End Class
Bağımlılık özellikleri için meta verileri geçersiz kılma veya bunlara erişme hakkında daha fazla bilgi için bkz . Bağımlılık özelliği için meta verileri geçersiz kılma.
Özellik değeri devralma
Öğe, bağımlılık özelliğinin değerini nesne ağacındaki üst öğesinden devralabilir.
Not
Devralma için hesaplama süresi performansı etkilediğinden, özellik değeri devralma davranışı tüm bağımlılık özellikleri için genel olarak etkinleştirilmez. Özellik değeri devralma genellikle yalnızca uygulanabilirlik önerisinde bulunan senaryolarda etkinleştirilir. SDK başvurusunda bu bağımlılık özelliğinin Bağımlılık Özelliği Bilgileri bölümüne bakarak bir bağımlılık özelliğinin devralınıp devralmadığını de kontrol edebilirsiniz.
Aşağıdaki örnekte bağlamanın kaynağını belirtmek için özelliğini içeren DataContext bir bağlama gösterilmektedir. Bu nedenle, alt nesnelerdeki bağlamaların kaynağı belirtmesi gerekmez ve üst StackPanel nesneden devralınan DataContext
değeri kullanabilir. Alternatif olarak, bir alt nesne içinde kendi DataContext
veya öğesini Source Bindingdoğrudan belirtebilir ve devralınan değeri kullanamaz.
<StackPanel Canvas.Top="50" DataContext="{Binding Source={StaticResource TestData}}">
<Button Content="{Binding XPath=test[2]/@text}"/>
</StackPanel>
Daha fazla bilgi için bkz . Özellik değeri devralma.
WPF tasarımcısı tümleştirmesi
Bağımlılık özellikleri olarak uygulanan özelliklere sahip özel denetimler, Visual Studio için WPF Tasarımcısı ile iyi tümleşir. Bir örnek, Özellikler penceresinde doğrudan ve bağlı bağımlılık özelliklerini düzenleyebilme özelliğidir. Daha fazla bilgi için bkz . Denetim yazmaya genel bakış.
Bağımlılık özelliği değer önceliği
WPF özellik sistemindeki özellik tabanlı girişlerden herhangi biri bağımlılık özelliğinin değerini ayarlayabilir. Bağımlılık özelliği değeri önceliği , özelliklerin değerlerini nasıl elde ettiğiyle ilgili çeşitli senaryoların tahmin edilebilir bir şekilde etkileşime girebilmesi için vardır.
Not
SDK belgeleri bazen bağımlılık özelliklerini tartışırken "yerel değer" veya "yerel olarak değer ayarla" terimini kullanır. Yerel olarak ayarlanan değer, doğrudan koddaki bir nesne örneğinde veya XAML'de öğe özniteliği olarak ayarlanan bir özellik değeridir.
Sonraki örnek, herhangi bir düğmenin Background özelliğine uygulanan ancak yerel olarak ayarlanmış Background
bir özelliğe sahip tek düğmeyi belirten bir stil içerir. Teknik olarak, bu düğmenin Background
özelliği iki kez ayarlanmıştır, ancak yalnızca bir değer geçerlidir; en yüksek önceliğe sahip olan değer. Yerel olarak ayarlanmış bir değer, burada mevcut olmayan çalışan bir animasyon dışında en yüksek önceliğe sahiptir. Bu nedenle, ikinci düğme, stil ayarlayıcı değeri yerine özelliği için Background
yerel olarak ayarlanan değeri kullanır. İlk düğmenin yerel değeri veya stil ayarlayıcısından daha yüksek önceliğe sahip başka bir değeri yoktur ve bu nedenle özelliği için Background
stil ayarlayıcısı değerini kullanır.
<StackPanel>
<StackPanel.Resources>
<Style x:Key="{x:Type Button}" TargetType="{x:Type Button}">
<Setter Property="Background" Value="Orange"/>
</Style>
</StackPanel.Resources>
<Button>I am styled orange</Button>
<Button Background="Pink">I am locally set to pink (not styled orange)</Button>
</StackPanel>
Bağımlılık özelliği önceliği neden var?
Yerel olarak ayarlanan değerler, öğe özelliklerinin yerel denetimini destekleyen stil ayarlayıcısı değerlerine göre önceliklidir. Ayrıntılar için bkz . Bağımlılık özelliği değeri önceliği.
Not
WPF öğelerinde tanımlanan bir dizi özellik bağımlılık özellikleri değildir, çünkü bağımlılık özellikleri genellikle yalnızca WPF özellik sisteminin bir özelliği gerektiğinde uygulanırdı. Bu özellikler arasında veri bağlama, stil oluşturma, animasyon, varsayılan değer desteği, devralma, ekli özellikler ve geçersizleştirme yer alır.
Bağımlılık özellikleri hakkında daha fazla bilgi edinme
Bileşen geliştiricileri veya uygulama geliştiricileri, veri bağlama veya stil desteği ya da geçersizleştirme ve değer zorlama desteği gibi özellikler eklemek için kendi bağımlılık özelliklerini oluşturmak isteyebilir. Daha fazla bilgi için bkz . Özel bağımlılık özellikleri.
Bağımlılık özelliklerini, bir örneğe erişimi olan herhangi bir arayan tarafından erişilebilen veya bulunabilen genel özellikler olarak düşünün. Daha fazla bilgi için bkz . Bağımlılık özelliği güvenliği.
Ekli özellik, XAML'de özel bir söz dizimini destekleyen bir özellik türüdür. Ekli bir özelliğin genellikle ortak dil çalışma zamanı özelliğiyle 1:1 yazışması yoktur ve mutlaka bağımlılık özelliği değildir. Ekli özelliğin temel amacı, üst öğe ve alt öğe sınıf üyeleri listelerinin bir parçası olarak bu özelliği içermese bile alt öğelerin özellik değerlerini üst öğeye raporlamasına izin vermektir. Birincil senaryolardan biri, bir alt öğenin üst öğeleri kullanıcı arabiriminde nasıl sunacaklarını bildirmesini sağlamaktır. Örnekler için bkz Dock . ve Left. Daha fazla bilgi için bkz . Ekli özelliklere genel bakış.
Ayrıca bkz.
.NET Desktop feedback