Aracılığıyla paylaş


Bağımlılık özelliklerine genel bakış

Windows Presentation Foundation (WPF), bir türün özelliğinin işlevselliğinigeniş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ı ve WPF uygulamalarının nasıl yazılacağını bilmek yardımcı olur. Daha fazla bilgi için bkz. Öğreticisi: .NETile yeni bir WPF uygulaması oluşturma.

Bağımlılık özellikleri ve CLR özellikleri

WPF özellikleri genelliklestandart .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ği için 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 destekler.

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ı DependencyProperty. WPF özellik sistemini tanımlayan diğer önemli tür, bir bağımlılık özelliğini kaydedebilen ve sahip olabilecek temel sınıfı tanımlayan DependencyObjecttürüdür.

Yaygın olarak kullanılan bazı terimler şunlardır:

  • .

  • . 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.

  • CLR "sarmalayıcı", özelliği için get ve set uygulamalarıdır. Bu uygulamalar, bağımlılık özelliği tanımlayıcısını GetValue ve SetValue çağrılarında kullanarak içerir. Bu şekilde, WPF özellik sistemi özelliği için yedekleme sağlar.

Aşağıdaki örnek, IsSpinning bağımlılık özelliğini, DependencyProperty tanımlayıcısının arkasında olduğu özellikle ilişkisini göstermek üzere 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 adlandırma kuralı ve bu özelliğin destekleyici DependencyProperty alanı önemlidir. Alanın adı her zaman, sonuna Property eki eklenmiş olarak, özelliğin adıdır. 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ü, bir Color, SolidColorBrushyoluyla bulunur.

<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 set uygulamasına yapılan bir çağrıdır:

Button myButton = new();
myButton.Width = 200.0;
Dim myButton As New Button With {
    .Width = 200.0
}

Özellik değeri almak temelde get "sarmalayıcı" uygulamasına yapılan bir çağrıdır:

double whatWidth = myButton.Width;
Dim whatWidth As Double = myButton.Width

Ayrıca özellik sistemi API'lerini doğrudan GetValue ve SetValue ç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ıdır ve geliştirici araçları için özelliğin daha iyi gösterilmesini sağlar.

Özellikler XAML'de ayarlanabilir ve daha sonra arka plan kodu ile kodda 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 işlevsellik

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 veya uygulamanın Resources özellik değeri olarak belirtilir, çünkü bu konumlar kaynağa kolay erişim sunar. Bu örnekte bir SolidColorBrush kaynağı 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 Background özelliği için 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

Uyarı

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 özellik 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 dizimi veya koddaki Binding nesnesi aracılığıyla çalışır. Veri bağlama ile, son özellik değerinin belirlenmesi çalışma anına kadar ertelenir ve bu zamanda değer, bir veri kaynağından elde edilir.

Aşağıdaki örnek, XAML'de bildirilen bir bağlama kullanarak Contentiçin Button özelliğini ayarlar. Bağlama devralınan bir veri bağlamı ve XmlDataProvider veri kaynağı kullanır (gösterilmez). Bağlama, XPathtarafından veri kaynağı içindeki kaynak özelliğini belirtir.

<Button Content="{Binding Source={StaticResource TestData}, XPath=test[1]/@text}"/>

Uyarı

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 özellik değeri önceliği.

Bağımlılık özellikleri veya DependencyObject sınıfı, veri bağlama işlemleri için INotifyPropertyChanged kaynak özellik değerindeki değişikliklerin bildirilmesi için DependencyObject yerel olarak desteklemez. 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ış

Stil

Stiller ve şablonlar bağımlılık özelliklerini kullanmak için cazip nedenlerdir. Stiller, özellikle uygulama kullanıcı arabirimini belirleyen ö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 Resources sözlüğü içinde tanımlanacak basit bir stil oluşturur (gösterilmez). Ardından bu stil, bir Styleiçin doğrudan Button özelliğine uygulanır. Stil içindeki ayarlayıcı, stillenmiş bir Background için Button özelliğini yeşil olarak ayarlar.

<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 özelliklerine animasyon eklenebilir. 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, bir Background'in Button özelliğini animasyonla canlandırır. Teknik olarak, özellik öğesi söz dizimi boş bir SolidColorBrushBackgroundolarak ayarlar ve Color'in SolidColorBrush özelliği animasyonludur.

<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 Storyboardlara genel bakış

Meta veriyi geçersiz kılma

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ı DependencyProperty tanımlayıcısını kullanı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, 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ğerinin Devralınması

Öğe, bağımlılık özelliğinin değerini nesne ağacındaki üst öğesinden devralabilir.

Uyarı

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ği için 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 DataContext özelliğini içeren bir bağlama gösterilmektedir. Bu nedenle, alt nesnelerdeki bağlamaların kaynağı belirtmesi gerekmez ve üst nesne DataContext'deki StackPanel'dan devralınan değeri kullanabilir. Alternatif olarak, bir alt nesne doğrudan kendi DataContext veya Source'de bir Binding belirtebilir ve devralınan değeri kullanmamayı seçebilir.

<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 kalıtımı.

WPF tasarımcısı entegrasyonu

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, Özellikleri 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ğeri sıralaması

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ğer önceliği, özelliklerin değerlerini nasıl elde ettiğiyle ilgili çeşitli senaryoların tahmin edilebilir bir şekilde etkileşim kurmasını sağlar.

Uyarı

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ış bir Background özelliğine sahip bir 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 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ısı değeri yerine Background özelliği için 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 Background özelliği için stil ayarlayıcı 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 özellik değeri önceliği.

Uyarı

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 öğelere kullanıcı arayüzünde nasıl sunulacağını bildirmesini sağlamaktır. Örnekler için bkz. Dock ve Left. Daha fazla bilgi için bkz. Ekli özelliklere genel bakış.

Ayrıca bakınız