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

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. Bu hizmetler genellikle 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 bağımlılık özelliğinin özelliklerini açıklar. Bu, XAML'de ve kodda mevcut bağımlılık özelliklerinin nasıl kullanılacağını içerir. 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.

Ön koşullar

Bu konu, .NET tür sistemi ve nesne odaklı programlama hakkında bazı temel bilgilere sahip olduğunuzu varsayar. Bu konudaki örnekleri takip etmek için XAML'yi de anlamanız ve WPF uygulamalarının nasıl yazılması gerektiğini bilmeniz gerekir. Daha fazla bilgi için bkz . İzlenecek yol: İlk WPF masaüstü uygulamam.

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

WPF'de özellikler genellikle standart .NET özellikleri olarak sunulur. Temel düzeyde, bu özelliklerle doğrudan etkileşim kurabilirsiniz ve bunların bağımlılık özelliği olarak uygulandığını asla bilemezsiniz. Ancak, bu özelliklerden yararlanabilmeniz için WPF özellik sisteminin bazı veya tüm özelliklerini tanımanız gerekir.

Bağımlılık özelliklerinin amacı, bir özelliğin değerini diğer girişlerin değerine göre hesaplamanın bir yolunu sağlamaktır. Bu diğer girişler temalar ve kullanıcı tercihi gibi sistem özelliklerini, veri bağlama ve animasyonlar/görsel taslaklar gibi tam zamanında özellik belirleme mekanizmalarını, kaynaklar ve stiller gibi çok kullanımlı şablonları veya öğe ağacındaki diğer öğelerle üst-alt ilişki aracılığıyla bilinen değerleri içerebilir. Ayrıca, bağımsız doğrulama, varsayılan değerler, diğer özelliklerde yapılan değişiklikleri izleyen geri çağırmalar ve potansiyel çalışma zamanı bilgilerine göre özellik değerlerini zorlamak için bir sistem sağlamak için bir bağımlılık özelliği uygulanabilir. 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ği meta verilerini geçersiz kılarak var olan bir özelliğin bazı belirli özelliklerini de değiştirebilir.

SDK başvurusunda, söz konusu özelliğin yönetilen başvuru sayfasında Bağımlılık Özelliği Bilgileri bölümünün bulunmasıyla hangi özelliğin bağımlılık özelliği olduğunu belirleyebilirsiniz. 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 ve ayrıca bu özellik için ayarlanan 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, özelliği özel bir alanla yedeklemenin standart desenine alternatif bir uygulama 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ürdür DependencyObject. DependencyObject bir bağımlılık özelliğini kaydedebilen ve sahip olabilecek temel sınıfı tanımlar.

Bağımlılık özellikleriyle kullanılan terminoloji aşağıda listeleniyor:

  • Bağımlılık özelliği: tarafından desteklenen bir DependencyPropertyözellik.

  • Bağımlılık özelliği tanımlayıcısı: Bağımlılık DependencyProperty özelliği kaydedilirken dönüş değeri olarak alınan ve ardından bir sınıfın statik üyesi olarak depolanan örnek. Bu tanımlayıcı, WPF özellik sistemiyle etkileşim kuran API'lerin birçoğu için parametre olarak kullanılır.

  • CLR "sarmalayıcı": Özelliği için gerçek get ve set uygulamaları. Bu uygulamalar, ve SetValue çağrılarında GetValue kullanarak bağımlılık özelliği tanımlayıcısını birleştirir, böylece WPF özellik sistemini kullanarak özelliğin yedeklemesini sağlar.

Aşağıdaki örnek bağımlılık özelliğini tanımlar IsSpinning ve tanımlayıcının DependencyProperty geri döndüğü özellikle ilişkisini gösterir.

public static readonly DependencyProperty IsSpinningProperty =
    DependencyProperty.Register(
    "IsSpinning", typeof(Boolean),
    typeof(MyCode)
    );
public bool IsSpinning
{
    get { return (bool)GetValue(IsSpinningProperty); }
    set { SetValue(IsSpinningProperty, value); }
}
Public Shared ReadOnly IsSpinningProperty As DependencyProperty =
    DependencyProperty.Register("IsSpinning",
                                GetType(Boolean),
                                GetType(MyCode))

Public Property IsSpinning() As Boolean
    Get
        Return CBool(GetValue(IsSpinningProperty))
    End Get
    Set(ByVal 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ı olarak belirtir. Bu örnekte, bir XAML özniteliği için basit dize değerinin, oluşturulan kodda WPF XAML ayrıştırıcısı tarafından bir WPF türüne ( Colorbir , yoluyla ) dönüştürüldüğü bir SolidColorBrushdurum gösterilmektedir.

<Button Background="Red" Content="Button!"/>

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. Özellik ayarı için XAML söz dizimi hakkında daha fazla bilgi için bkz . WPF'de XAML ve Ayrıntılı XAML Söz Dizimi.

Öznitelik dışı söz dizimi örneği olarak, aşağıdaki XAML örneğinde başka bir düğme arka planı gösterilmektedir. Bu kez, basit bir düz renk ayarlamak yerine arka plan, bu görüntüyü temsil eden bir öğe ve iç içe öğenin özniteliği olarak belirtilen görüntünün kaynağıyla bir görüntüye ayarlanır. Bu, özellik öğesi söz diziminin bir örneğidir.

<Button Content="Button!">
  <Button.Background>
    <ImageBrush ImageSource="wavy.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 küme uygulamasına yapılan bir çağrıdır.

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

Özellik değeri almak da temelde get "sarmalayıcı" uygulamasına yönelik bir çağrıdır:

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

Ayrıca özellik sistemi API'lerini GetValue ve SetValue doğrudan çağırabilirsiniz. Mevcut özellikleri kullanıyorsanız (sarmalayıcılar daha kullanışlı ve geliştirici araçları için özelliğin daha iyi kullanıma sunulmasını sağlıyorsa) bu genellikle gerekli değildir, ancak API'leri doğrudan çağırmak belirli senaryolar için uygundur.

Ö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

Bağımlılık özelliği, bir alan tarafından yedeklenen özelliğin aksine bir özelliğin işlevselliğini genişleten işlevsellik sağlar. Bu tür işlevler genellikle aşağıdaki belirli özelliklerden birini temsil eder veya destekler:

Kaynaklar

Bir kaynağa başvurarak bağımlılık özelliği değeri ayarlanabilir. Kaynaklar genellikle bir sayfa kök öğesinin Resources veya uygulamanın özellik değeri olarak belirtilir (bu konumlar kaynağa en uygun erişimi etkinleştirir). Aşağıdaki örnekte bir kaynağın nasıl tanımlanacağı gösterilmektedir SolidColorBrush .

<DockPanel.Resources>
  <SolidColorBrush x:Key="MyBrush" Color="Gold"/>
</DockPanel.Resources>

Kaynak tanımlandıktan sonra kaynağa başvurabilir ve bunu kullanarak bir özellik değeri sağlayabilirsiniz:

<Button Background="{DynamicResource MyBrush}" Content="I am gold" />

Bu kaynağa DynamicResource biçimlendirme uzantısı olarak başvurulur (WPF XAML'de statik veya dinamik bir kaynak başvurusu kullanabilirsiniz). Dinamik kaynak başvurusu kullanmak için bağımlılık özelliğine ayarlı olmanız gerekir, bu nedenle bu özellikle WPF özellik sistemi tarafından etkinleştirilen dinamik kaynak başvurusu kullanımıdır. Daha fazla bilgi için bkz . XAML Kaynakları.

Dekont

Kaynaklar yerel değer olarak değerlendirilir ve başka bir yerel değer ayarlarsanız kaynak başvurularını ortadan kaldırırsınız. 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 diziminde veya koddaki Binding nesnede çalışır. Veri bağlama ile, son özellik değeri belirlemesi çalışma zamanına kadar ertelenerek değerin bir veri kaynağından alınması gerekir.

Aşağıdaki örnek, XAML'de Content bildirilen bağlamayı kullanarak için Buttonözelliğini ayarlar. Bağlama devralınan bir veri bağlamı ve bir XmlDataProvider veri kaynağı kullanır (gösterilmez). Bağlamanın kendisi, veri kaynağı içinde istenen kaynak özelliğini XPath belirtir.

<Button Content="{Binding XPath=Team/@TeamName}"/>

Dekont

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ğerinde değişiklik DependencyObject bildirimleri oluşturma amacıyla 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 kullanmaya yönelik en önemli senaryolardan ikisidir. Stiller özellikle uygulama kullanıcı arabirimini (UI) 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 gerçek zamanlı değerini temel alan bir özellik değerini değiştiren "tetikleyiciler" içerdiğinden özellik sistemiyle etkileşim kurar.

Aşağıdaki örnek basit bir stil oluşturur (sözlük içinde Resources tanımlanır, gösterilmez), ardından bu stili doğrudan özelliğine StyleButtonuygular. 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}">I am green!</Button>

Daha fazla bilgi için bkz . Stil oluşturma ve Şablon Oluşturma.

Animasyonlar

Bağımlılık özellikleri animasyonlu olabilir. Animasyon uygulandığında ve çalıştırıldığında, animasyonlu değer özelliğin sahip olduğu herhangi bir değerden (yerel değer gibi) daha yüksek bir önceliğe sahip olarak çalışır.

Aşağıdaki örnek, bir Button özellik üzerindeki öğesine Background animasyon uygular (teknik olarak , Background olarak boş SolidColorBrushBackgroundbir değer belirtmek için özellik öğesi söz dizimi kullanılarak animasyonludur ve bunun ColorSolidColorBrush özelliği doğrudan animasyonlu olan özelliktir).

<Button>I am animated
  <Button.Background>
    <SolidColorBrush x:Name="AnimBrush"/>
  </Button.Background>
  <Button.Triggers>
    <EventTrigger RoutedEvent="Button.Loaded">
      <BeginStoryboard>
        <Storyboard>
          <ColorAnimation
            Storyboard.TargetName="AnimBrush" 
            Storyboard.TargetProperty="(SolidColorBrush.Color)"
            From="Red" To="Green" Duration="0:0:5" 
            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şlangıçta bağımlılık özelliğini kaydeden sınıftan türetdiğinizde bu özelliğin 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ınılması tanımlayıcıya DependencyProperty bağlıdır. Meta verilerin geçersiz kılınması, özelliğin yeniden kullanılmasını gerektirmez. Meta veri değişikliği özellik sistemi tarafından yerel olarak işlenir; her sınıf, tür temelinde temel sınıflardan devralınan tüm özellikler için tek tek meta verileri barındırır.

Aşağıdaki örnek bir bağımlılık özelliği DefaultStyleKeyiçin meta verileri geçersiz kılar. Bu özel bağımlılık özelliği meta verilerini geçersiz kılma, temalardan varsayılan stilleri kullanabilen denetimler oluşturan bir uygulama deseninin 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

Özellik meta verilerini geçersiz kılma veya alma hakkında daha fazla bilgi için bkz . Bağımlılık Özelliği Meta Verileri.

Özellik değeri devralma

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

Dekont

Devralma için hesaplama süresinin bazı performans etkileri olduğundan, ö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 belirli bir senaryo özellik değeri devralma uygun olduğunu öneren özellikler için etkinleştirilir. SDK başvurusunda bu bağımlılık özelliğinin Bağımlılık Özellik Bilgileri bölümüne bakarak bir bağımlılık özelliğinin devralınıp devralmadığını belirleyebilirsiniz.

Aşağıdaki örnek bir bağlamayı gösterir ve önceki bağlama örneğinde gösterilmeyen bağlamanın kaynağını belirten özelliğini ayarlar DataContext . Alt nesnelerdeki sonraki bağlamaların kaynağı belirtmesi gerekmez, üst StackPanel nesnede devralınan DataContext değeri kullanabilirler. (Alternatif olarak, alt nesne bunun yerine kendi veya içinde bir SourceBindingöğesini doğrudan belirtmeyi DataContext ve devralınan değeri bağlamalarının veri bağlamı için kasıtlı olarak kullanmamayı seçebilir.)

<StackPanel Canvas.Top="50" DataContext="{Binding Source={StaticResource XmlTeamsSource}}">
  <Button Content="{Binding XPath=Team/@TeamName}"/>
</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 bir denetim, Visual Studio desteği için uygun WPF Tasarım Aracı alır. Bir örnek, Özellikler penceresiyle 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

Bir bağımlılık özelliğinin değerini aldığınızda, WPF özellik sistemine katılan diğer özellik tabanlı girişlerden herhangi biri aracılığıyla bu özellikte ayarlanmış bir değer elde edebilirsiniz. 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.

Aşağıdaki örneği inceleyin. Örnek, tüm düğmelere ve özelliklerine Background uygulanan bir stil içerir, ancak ardından yerel olarak ayarlanmış Background bir değere sahip bir düğme de belirtir.

Dekont

SDK belgelerinde bağımlılık özellikleri tartışılırken ara sıra "yerel değer" veya "yerel olarak değer ayarla" terimleri kullanılır. Yerel olarak ayarlanan değer, doğrudan koddaki bir nesne örneğinde veya XAML'deki bir öğede öznitelik olarak ayarlanan bir özellik değeridir.

İlke olarak, ilk düğme için özellik iki kez ayarlanır, ancak yalnızca bir değer geçerlidir: en yüksek önceliğe sahip değer. Yerel olarak ayarlanmış bir değer en yüksek önceliğe sahiptir (çalışan bir animasyon hariç, ancak bu örnekte animasyon uygulanmaz) ve bu nedenle ilk düğmedeki arka plan için stil ayarlayıcı değeri yerine yerel olarak ayarlanan değer kullanılır. İkinci düğmenin yerel değeri yoktur (ve stil ayarlayıcısından daha yüksek önceliğe sahip başka bir değer yoktur) ve bu nedenle bu düğmedeki arka plan stil ayarlayıcıdan gelir.

<StackPanel>
  <StackPanel.Resources>
    <Style x:Key="{x:Type Button}" TargetType="{x:Type Button}">
     <Setter Property="Background" Value="Red"/>
    </Style>
  </StackPanel.Resources>
  <Button Background="Green">I am NOT red!</Button>
  <Button>I am styled red</Button>
</StackPanel>

Bağımlılık özelliği önceliği neden var?

Normalde, stillerin her zaman uygulanmasını ve tek bir öğenin yerel olarak ayarlanmış değerini bile gizlemesini istemezsiniz (aksi takdirde, stilleri veya öğeleri genel olarak kullanmak zor olabilir). Bu nedenle, stillerden gelen değerler yerel olarak ayarlanmış bir değerden daha düşük bir emsalde çalışır. Bağımlılık özelliklerinin daha kapsamlı bir listesi ve bağımlılık özelliği etkin değerinin nereden gelebileceği için bkz . Bağımlılık Özelliği Değeri Önceliği.

Dekont

BAĞıMLıLıK özellikleri olmayan WPF öğelerinde tanımlanan bir dizi özellik vardır. Ve büyük olarak, özellikler yalnızca özellik sisteminin etkinleştirdiği senaryolardan en az birini desteklemesi gerektiğinde bağımlılık özellikleri olarak uygulandı: veri bağlama, stil oluşturma, animasyon, varsayılan değer desteği, devralma, ekli özellikler veya geçersizleştirme.

Bağımlılık özellikleri hakkında daha fazla bilgi edinme

  • 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ı (CLR) özelliğiyle 1:1 yazışması yoktur ve mutlaka bir bağımlılık özelliği değildir. Ekli özelliğin tipik amacı, üst öğe ve alt öğe sınıf üyeleri listelerinin bir parçası olarak bu özelliğe sahip olmasa bile alt öğelerin özellik değerlerini üst öğeye raporlamasına izin vermektir. Birincil senaryolardan biri, alt öğelerin üst öğeye kullanıcı arabiriminde nasıl sunulması gerektiğini bildirmesini sağlamaktır; örneğin, bkz. Dock veya Left. Ayrıntılar için bkz . Ekli Özelliklere Genel Bakış.

  • Bileşen geliştiricileri veya uygulama geliştiricileri, veri bağlama veya stil desteği gibi özellikleri etkinleştirmek ya da geçersiz kılınma ve değer zorlama desteği için kendi bağımlılık özelliklerini oluşturmak isteyebilir. Ayrıntılar için bkz . Özel Bağımlılık Özellikleri.

  • Bağımlılık özelliklerini genel özellikler, erişilebilir veya bir örneğe erişimi olan herhangi bir arayan tarafından en azından bulunabilir olarak düşünün. Daha fazla bilgi için bkz . Bağımlılık Özelliği Güvenliği.

Ayrıca bkz.