Aracılığıyla paylaş


Özel Bağımlılık Özellikleri

Bu konu, nedenlerini açıklar, Windows Presentation Foundation (WPF) özel oluşturmak uygulama geliştiricileri ve bileşen yazarları isteyebileceğiniz bağımlılık özelliğive uygulama adımları ve bunun yanı sıra, performans, kullanılabilirlik veya özelliğin çok yönlülük artıran bazı uygulama seçeneği anlatılmaktadır.

Bu konu aşağıdaki bölümleri içerir.

  • Prerequisites
  • Bağımlılık özelliği nedir?
  • Bağımlılık Özellikleri örnekleri
  • Ne zaman bir bağımlılık özelliği uygulamak?
  • Bağımlılık özelliği tanımlamak için Denetim listesi
  • Read-Only Dependency Properties
  • Collection-Type Dependency Properties
  • Bağımlılık özelliği güvenlik konuları
  • Bağımlılık özellikleri ve sınıf Kurucularını
  • İlgili Konular

Prerequisites

Bu konuda bağımlılık özellikleri varolan bağımlılık özellikleri bir tüketici açısından bakıldığında, anladığınızı varsayar WPF sınıfları ve okuma Bağımlılık Özellikleri Genel Bakış konu. In order to follow the examples in this topic, you should also understand Extensible Application Markup Language (XAML) and know how to write WPF applications.

Bağımlılık özelliği nedir?

Ne Aksi durumda olacak etkinleştirebilirsiniz bir common language runtime (CLR) özelliği olarak uygulayarak, stil, veri bağlama, devralma, animasyonlar ve varsayılan değerleri desteklemek için bir bağımlılık özelliği. Bağımlılık özellikleri ile kayıtlı özellikleri, WPF çağırarak özellik sistemi Register yöntemi (ya da RegisterReadOnly), ve tarafından yedeklenmiş bir DependencyProperty tanımlayıcı alan. Bağımlılık özellikleri yalnızca kullanılabilir DependencyObject türleri, ancak DependencyObject oldukça yüksek WPF sınıf hiyerarşisi, böylece çoğunluğu sınıfları bulunan WPF destekleyebilmesi bağımlılık özellikleri. Bağımlılık özellikleri ve bazı terimler ve onları bu konuda tanımlamak için kullanılan kuralları hakkında daha fazla bilgi için SDKbakın Bağımlılık Özellikleri Genel Bakış.

Bağımlılık Özellikleri örnekleri

Üzerinde uygulanan bağımlılık özellikleri örnekleri WPF sınıfları dahil Background özelliği, Width özelliği ve Text diðerlerinin birçok özellik. Bir sınıf tarafından sergilenen her bağımlılık özelliği karşılık gelen bir public static alan türü olan DependencyProperty o aynı sınıf üzerinde sergilenen. Bu bağımlılık özelliği. tanımlayıcısıdır Tanımlayıcı bir kuralı kullanılarak adlandırılır: adı bağımlılık özelliği dize ile Property it. eklenmiş Örneğin, ilgili DependencyProperty tanımlayıcı alan için Background özelliği BackgroundProperty. Tanımlayıcı hakkında bilgi depolayan bağımlılık özelliği , kayıtlı ve tanımlayıcı sonra daha sonra diğer maddelerle ilgili işlemlerinde kullanılan bağımlılık özelliği, arama gibi SetValue.

De belirtildiği gibi Bağımlılık Özellikleri Genel Bakış, tüm bağımlılık özellikleri WPF (çoğu dışında Özellikler eklenmiş) de CLR "kapsayıcı" nedeniyle özellikleri uygulaması. Bu nedenle, kodun alabilir veya çağırarak bağımlılık özellikleri ayarlamak CLR erişimcileri Wrapper, kullandığınız diğer aynı şekilde tanımlamak CLR özellikleri. Kurulan bağımlılık özellikleri tüketici olarak genellikle kullanmak istemediğiniz DependencyObject yöntemleri GetValue ve SetValue, hangi bağlantı noktasına temel özelliği sistem. Bunun yerine, varolan uygulaması CLR özellikleri zaten adlı GetValue ve SetValue içinde get ve set sarıcı uygulamaları tanımlayıcı alanını uygun şekilde kullanarak özelliğinin. Kendinize özel bağımlılık özelliği uyguluyorsanız, benzer şekilde sarıcı tanımlama.

Ne zaman bir bağımlılık özelliği uygulamak?

Ne zaman uygulamadan bir özellik bir sınıf üzerinde sınıfınızın türetildiği sürece DependencyObject, kendi özelliği ile geri seçeneğine sahip bir DependencyProperty tanımlayıcısı ve böylece bir bağımlılık özelliği. yapmanız Bağımlılık özelliği sizin özelliğine sahip her zaman uygun değildir ve senaryo gereksinimlerinize bağlıdır. Bazı durumlarda, bir özel alan sizin özelliğiyle yedekleme tipik tekniği yeterlidir. Ancak, kendi özellik olarak uygulamak bir bağımlılık özelliği birini veya daha fazlasını desteklemek için kendi özelliği istediğiniz zaman WPF yetenekleri:

  • Bir stilde ayarlanabilir kendi özelliğini istediğiniz. For more information, see Stillendirme ve Şablon Oluşturma.

  • İstediğiniz, sizin özelliği veri bağlama işlemini desteklemektedirler. Veri bağlama bağımlılık özellikleri hakkında daha fazla bilgi için bkz: Nasıl Yapılır: İki Denetimin Özelliklerini Bağlama.

  • Dinamik kaynağın başvuru ile ayarlanabilir kendi özelliğini istediğiniz. For more information, see Kaynaklara Genel Bakış.

  • Özellik değeri otomatik olarak bir üst öğe öğe ağacı verileri devralmak istediğiniz. Bu durumda, yaptırmak RegisterAttached yöntemi, bile da oluşturmanız için özellik sarıcı CLR erişim. For more information, see Özellik Değeri Kalıtımı.

  • Animatable kendi özelliğini istediğiniz. For more information, see Animasyona Genel bakış.

  • Özelliğin önceki değeri özelliği sistem, ortam veya kullanıcı ya da okuma ve stilleri kullanarak gerçekleştirilen eylemler tarafından değiştirildiğinde, rapor özellik sisteme istediğiniz. Özellik meta verileri kullanarak, kendi özellik özellik sistemi kendi özellik değeri olarak değiştirildiğini belirler her zaman çağrılacak bir geri çağrı yöntemini belirtebilirsiniz. Özellik değerini zorlama buna ilgili bir kavramdır. For more information, see Bağımlılık Özelliği Geri Çağrıları ve Doğrulama.

  • Tarafından da kullanılan kurulan meta veri kuralları kullanmak istediğiniz WPF Raporlama olup olmadığını bir özellik değerini değiştirmek gerektirir öğesinde için görsel öğeler yeniden oluşturmak için Düzen sistem gibi işlemler Veya türetilmiş sınıfları varsayılan değer gibi metaveri tabanlı özellikleri değiştirmeniz için meta veriler geçersiz kılmaları kullanabilmek istiyorsunuz.

  • Almak için bir özel denetim özelliklerini istediğiniz Visual Studio 2008 WPF Tasarımcısı desteği gibi Özellikler düzenleme penceresinin. For more information, see Denetim Yazımına Genel Bakış.

Bu senaryolar incelediğinizde, ayrıca, senaryonuza varolan meta verilerini geçersiz kılarak elde edebilir olup olmadığını düşünmeniz gerekir bağımlılık özelliği, tamamen yeni bir özellik uygulamak yerine. Meta verilerini geçersiz kılma pratik olup senaryonuza ve bu senaryo varolan uygulama ne kadar yakın benzer bağlıdır WPF bağımlılık özellikleri ve sınıflar. Varolan özellikleri meta verilerini geçersiz kılma hakkında daha fazla bilgi için bkz: Bağımlılık Özelliği Meta Verisi.

Bağımlılık özelliği tanımlamak için Denetim listesi

Bağımlılık özelliği tanımlayan dört ayrı kavramlarını oluşur. Bunlardan bazıları uygulamasında kod tek satır olarak birleştirilmiş sonlandırmak için bu kavramlar mutlaka katı yordam adımları değildir:

  • (İsteğe bağlı) Bağımlılık özelliği için özellik meta verileri oluşturun.

  • Özellik adı, bir sahibi tipini ve özellik değeri türünü belirleyen özellik sisteme kaydedin. Ayrıca meta veri özelliği, kullanılan belirtin.

  • Tanımlayan bir DependencyProperty tanımlayıcı olarak bir public static readonly alan sahibi türü.

  • Tanımlayan bir CLR "kapsayıcı" bağımlılık özelliği adı adıyla eşleşen özellik. Implement CLR "kapsayıcı" özelliğin get ve set erişimcileri it. yedekler bağımlılık özelliği ile bağlanmak için

Özelliği özellik sistemi ile kaydetme

Kendi özelliğini sırayla bir bağımlılık özelliği, o özelliğin özellik sistem tarafından tutulan bir tabloya kayıt ve niteleyicisi olarak sonraki özelliği sistem işlemleri için kullanılan benzersiz bir kimlik vermeniz gerekir. Bu işlemler iç işlemler olması veya arama özelliği sistemi kendi kodunuzu olabilir APIs. Özelliğini kaydetmek için çağrı Register yöntemi (sınıf içinde ancak herhangi bir üye tanımları dışında), kendi sınıfın gövdesi içinde. Tanımlayıcı alanını da tarafından sağlanan Register yöntemini çağırın, dönüş değeri. Nedeni, Register çağrısı yapılır diğer üye dışında tanımları olan oluşturmak ve atamak için bu dönüş değeri kullanıldığı için bir public static readonly türünde alan DependencyProperty , sınıfa bir parçası olarak Bu alan sizin bağımlılık özelliği tanımlayıcısı olur.

Public Shared ReadOnly AquariumGraphicProperty As DependencyProperty = DependencyProperty.Register("AquariumGraphic", GetType(Uri), GetType(AquariumObject), New FrameworkPropertyMetadata(Nothing, FrameworkPropertyMetadataOptions.AffectsRender, New PropertyChangedCallback(AddressOf OnUriChanged)))
public static readonly DependencyProperty AquariumGraphicProperty = DependencyProperty.Register(
  "AquariumGraphic",
  typeof(Uri),
  typeof(AquariumObject),
  new FrameworkPropertyMetadata(null,
      FrameworkPropertyMetadataOptions.AffectsRender, 
      new PropertyChangedCallback(OnUriChanged)
  )
);

Bağımlılık özelliği adı kuralları

Ancak olağanüstü durumlarda izlemelisiniz bağımlılık özellikleri ile ilgili kurulan adlandırma kuralları vardır.

Bağımlılık özelliği temel adı, "aquariumgraphic" olacaktır Bu örnekte olduğu gibi verilir ilk parametresi olarak Register. Bu ad her kayıt türü içinde benzersiz olmalıdır. Temel türleri aracılığıyla devralınan bağımlılık özellikleri zaten kayıt türü bir parçası olarak kabul edilir; devralınan özelliklerin adlarını yeniden kaydettirilemiyor. Ancak, hatta bu bağımlılık özelliği değil devralındığında bağımlılık özelliği sahibi olarak bir sınıf eklemek için bir teknik vardır; ayrıntılı bilgi için bkz: Bağımlılık Özelliği Meta Verisi.

Tanımlayıcı alanını oluşturduğunuzda, onu artı son kaydedildiği şekliyle bu alan özelliği tarafından adı Property. Bu alan sizin bağımlılık özelliği tanımlayıcısıdır ve sonrası için bir giriş olarak kullanılacak olan SetValue ve GetValue çağrıları tarafından herhangi bir kod erişim özelliğine kendi koduna göre herhangi bir harici kod erişim sağlar, özellik sistemi tarafından ve potansiyel tarafından Wrapper kullanılabileceğini XAML işlemciler.

NotNot

Bağımlılık özelliği sınıf gövdesinde tanımlama tipik uygulamasıdır, ancak statik sınıf kurucusunda bir bağımlılık özelliği tanımlamak mümkündür.Birden fazla kod satırı, bağımlılık özelliği başlatmak için gerekiyorsa, bu yaklaşım anlamlı.

"Kapsayıcı" uygulama

Sarıcı uygulamanız çağırmalıdır GetValue , get uygulaması, ve SetValue , set (orijinal çağrı kayıt ve alan burada gösterilen çok yapıldığı) uygulaması.

Dışındaki tüm olağanüstü durumlarda, sizin sarıcı uygulamaları yalnızca gerçekleştirmesi gereken GetValue ve SetValue Eylemler, sırasıyla. Bunun nedeni konusunda ele alınan XAML Yükleme ve Bağımlılık Özellikleri.

Üzerinde sağlanan tüm varolan ortak bağımlılık özellikleri WPF sınıfları kullanmak bu basit sarıcı uygulaması modeli; Özellik meta verisi üzerinden geri aramaları nasıl bağımlılık özellikleri iş bir davranış özelliği sistemin doğası gereği olan veya zorlama veya özellik gibi diğer kavramlar aracılığıyla gerçekleştirilir karmaşıklığın çoğunu değiştirin.


Public Shared ReadOnly AquariumGraphicProperty As DependencyProperty = DependencyProperty.Register("AquariumGraphic", GetType(Uri), GetType(AquariumObject), New FrameworkPropertyMetadata(Nothing, FrameworkPropertyMetadataOptions.AffectsRender, New PropertyChangedCallback(AddressOf OnUriChanged)))
Public Property AquariumGraphic() As Uri
    Get
        Return CType(GetValue(AquariumGraphicProperty), Uri)
    End Get
    Set(ByVal value As Uri)
        SetValue(AquariumGraphicProperty, value)
    End Set
End Property

public static readonly DependencyProperty AquariumGraphicProperty = DependencyProperty.Register(
  "AquariumGraphic",
  typeof(Uri),
  typeof(AquariumObject),
  new FrameworkPropertyMetadata(null,
      FrameworkPropertyMetadataOptions.AffectsRender, 
      new PropertyChangedCallback(OnUriChanged)
  )
);
public Uri AquariumGraphic
{
  get { return (Uri)GetValue(AquariumGraphicProperty); }
  set { SetValue(AquariumGraphicProperty, value); }
}

Kural gereği, sarıcı özelliğin adını seçmiş ve ilk parametresi olarak verilen adı ile aynı yeniden olmalıdır Register çağrısı, kayıtlı özelliği. Kendi özellik kuralı izlemez, bu mutlaka tüm olası kullanımları devre değil, ancak birkaç önemli sorunlarla karşılaşırsınız:

  • Stilleri ve şablonlarını belirli açılardan çalışmaz.

  • Araçlar ve tasarımcıların çoğu düzgün seri hale getirmek için adlandırma kurallarına dayanması gerekir XAML, ya da bir özelliğe düzeyi Tasarımcı ortamı yardım sağlamak amacıyla

  • Geçerli uygulaması WPF XAML loader Wrapper tamamen, atlar ve adlandırma işlerken dayanıröznitelik değerleri. For more information, see XAML Yükleme ve Bağımlılık Özellikleri.

Özellik meta verileri için yeni bir bağımlılık özelliği

Bağımlılık özelliği kaydolduğunuzda, özellik sistemi aracılığıyla kayıt özelliği özellikleri saklayan bir meta verileri oluşturur. Bu özelliklerle birçok özelliği ile basit imzalarını kayıtlıysa, ayarlanan varsayılan sahip Register. Diğer Register meta verileri istediğiniz gibi kayıt belirtmenize izin verözelliği. Bağımlılık özellikleri için verilen en yaygın meta veri özelliği kullanan yeni örneklerine uygulanan varsayılan bir değer vermek var.

Türetilmiþ bir sýnýf oluşturduğunuz varolan bir bağımlılık özelliği FrameworkElement, daha özel meta veri sınıfı kullanın FrameworkPropertyMetadata Bankası yerine PropertyMetadata sınıfa Kurucusu FrameworkPropertyMetadata sınıfının birden fazla imza bileşimi çeşitli meta veri özellikleri belirleyebileceğiniz vardır Yalnızca varsayılan değeri belirtmek istiyorsanız, türünde tek bir parametre imza kullanmak Object. Kendi özellik türüne özgü varsayılan değer olarak bu nesneyi parametre geçmesi (sağlanan varsayılan değeri olarak sağlanan tür olmalıdır propertyType parametresinde Register call).

İçin FrameworkPropertyMetadata, ayrıca belirtebileceğiniz meta veri seçeneği bayrakları özellik. Bu bayraklar ayrı özellikleri özellik meta veriler üzerinde kayıt tamamlandıktan sonra dönüştürülür ve düzeni motoru gibi diğer işlemler için belirli çıkarabilseniz iletişim kurmak için kullanılır.

Uygun meta veri bayrakları ayarlama

  • Özellik (veya kendi değerindeki değişiklikler) etkileyip etkilemediğini user interface (UI), ve Düzen sistem boyutu veya öğenizi bir sayfada göstermek gerekir nasıl özellikle etkileri az aşağıdaki bayraklardan birini ayarlayın: AffectsMeasure, AffectsArrange, AffectsRender.

    • AffectsMeasureBu özellik bir değişiklik değişiklik gerektirdiğini gösterir UI Oluşturma yeri içeren nesne gerekebilir az veya boşluğu üst. Örneğin, bir "Genişlik" özellik, bu bayrağı ayarlanmış olması gerekir.

    • AffectsArrangeBu özellik bir değişiklik değişiklik gerektirdiğini gösterir UI , genelde işleme ayrılmış alanı değişikliği gerektirmez, ancak alanı içinde konumlandırma değişmiş. Örneğin, bir "hizalama" özellik, bu bayrağı ayarlanmış olması gerekir.

    • AffectsRendergösteren diğer bir değişikliği oluştuğunu yerleşimi ve ölçümü etkilemez, ancak başka bir işleme gerek yoktur. Bir örnek, "Arka plan" gibi varolan bir öğenin rengini değiştiren bir özellik olabilir.

    • Bu bayraklar genellikle bir meta veri iletişim kuralı olarak kendi özelliği sistem veya düzeni geri aramalar geçersiz kılma uygulamaları için kullanılır. Örneğin, olabilir bir OnPropertyChanged geri çağrısı InvalidateArrange , örneğin herhangi bir özellik değerini değiştir ve raporlar vardır AffectsArrange olarak true kendi meta verileri.

  • Bazı özellikler içeren üst öğe, yukarıda belirtilen gerekli boyutu değiştiğinde yuvasız yollarla işleme özelliklerini etkileyebilir. Örnek MinOrphanLines özelliği kullanılan akış belge modelinde, burada bu özellikte yapılan değişikliklerin değiştirebilirsiniz genel işleme belgesinin akışı içeren paragraf. Use AffectsParentArrange veya AffectsParentMeasure tanımlama benzer durumlarda kendi özellikleri.

  • Varsayılan olarak, bağımlılık özellikleri veri bağlama işlemini desteklemektedirler. Durumlar için veri bağlama, hiçbir gerçekçi bir senaryo veri bağlama için burada ya da burada büyük nesne veri bağlama performans sorun olarak tanınan kasıtlı getirebilirsiniz.

  • Varsayılan olarak, veri bağlama Mode için bağımlılık özellikleri varsayılan değeri OneWay. Bağlama her zaman değiştirebilirsiniz TwoWay her bağlama örneği; ayrıntılı bilgi için bkz: Nasıl Yapılır: Bağlama Yönünü Belirleme. Ancak kullanma özelliği olmasını seçebilirsiniz bağımlılık özelliği Yazar olarak TwoWay bağlama modu varsayılan. Varolan bir bağımlılık özelliği örneği MenuItem.IsSubmenuOpen; Bu özellik için senaryodur IsSubmenuOpen ayarı mantığı ve katmanlanmış MenuItem etkileşimde varsayılan tema stili. IsSubmenuOpen Özgün ayarına uygun olarak diğer durumu özellikleri ve özelliğinde durumunu korumak için veri bağlama özelliği mantığını kullanıryöntem çağrıları. Bağlayan başka bir örnek özelliği TwoWay Varsayılan olarak TextBox.Text.

  • Ayarlayarak özel bağımlılık özelliği, özellik devralma etkinleştirebilirsiniz Inherits bayrak. Özellik devralma, burada üst öğeleri ve alt öðelerin ortak bir özelliği vardır ve bunu için alt öğeleri üst ayarlarken aynı değere ayarlayın, belirli özellik değeri için anlamlı bir senaryo için yararlıdır. Örnek devralınabilir bir özelliği olan DataContext, için bağlama işlemleri etkinleştirme önemli ana ayrıntı senaryosu veri sunumu. Yaparak DataContext devredilebilir, tüm alt öğeleri bu veri içeriği de devralır. Özellik değeri miras nedeniyle veri içeriği sayfası veya uygulama kök belirtebilir ve tüm olası alt öğeler bağlarında için respecify gerek yoktur. DataContextAyrıca varsayılan değer Devralmada Geçersiz Kılınanlar, ancak bunu her zaman yerel olarak herhangi bir belirli alt öğe ayarlanabilir göstermek için iyi bir örnektir; ayrıntılı bilgi için bkz: Nasıl Yapılır: Hiyerarşik Veriler ile Master-Detail Desenini Kullanma. Özellik değeri devralma maliyet olası bir performans sahip ve bu nedenle kullanılmamalıdır; ayrıntılı bilgi için bkz: Özellik Değeri Kalıtımı.

  • Set Journal bayrağı belirtmek, kendi bağımlılık özelliği algıladı veya kullandığı gezinti günlük kaydı Hizmetleri. Örnek SelectedIndex özelliği; Günlük kaydı geçmiş geçtiğiniz zaman seçim denetiminde seçilen herhangi bir öğeyi kalıcı.

Read-Only Dependency Properties

Salt okunur bir bağımlılık özelliği tanımlayabilirsiniz. Ancak, bunları özelliği sistem kaydı yapılıyor ve tanımlayıcı çözülme yordamı olduğu gibi neden sizin özelliği salt okunur olarak tanımladığınız senaryoları biraz farklı olabilir. For more information, see Salt Okunur Bağımlılık Özellikleri.

Collection-Type Dependency Properties

Koleksiyon türü bağımlılık özellikleri göz önüne almanız gereken bazı ek uygulama sorunları vardır. For details, see Koleksiyon Türü Bağımlılık Özellikleri.

Bağımlılık özelliği güvenlik konuları

Bağımlılık Özellikleri ortak özellikler olarak bildirilmelidir. Bağımlılık özelliği tanımlayıcısı alanları public static alanlar bildirilmelidir. (Korumalı gibi) diğer erişim düzeyleri bildirmek girişiminde bile bağımlılık özelliği her zaman tanımlayıcı özelliği sistem ile birlikte aracılığıyla erişilebilen APIs. Korumalı tanımlayıcısı alanı meta verilerini raporlama ya da değer belirlenmesi nedeniyle potansiyel erişebileceğiniz APIs olan özellik sisteminin bir parçası gibi LocalValueEnumerator. For more information, see Bağımlılık Özelliği Güvenlik.

Bağımlılık özellikleri ve sınıf Kurucularını

Kurucular sınıf (genellikle FxCop gibi kod çözümleme araçları tarafından zorunlu olarak) yönetilen kod programlama genel bir prensipte çağrılmayan sanal yöntemleri vardır. Çünkü Kurucular türetilmiş sınıf kurucusu temel başlatılması çağrılabilir ve yapıcı aracılığıyla sanal bir yöntem girme bir nesne örneği oluşturulamıyor, tamamlanmamış başlatma durumunda ortaya çıkabilecek budur. Ne zaman size türetmek zaten türetildiği herhangi bir sınıftan DependencyObject, özellik sistemi çağırır ve dahili olarak sanal yöntemleri açýklar dikkat etmeniz gereken. Bu sanal yöntemler parçası olan WPF özelliği sistem hizmetleri. Yöntemleri geçersiz kılma değeri belirleme katılmak türetilmiş sınıfları sağlar. Çok özel kurucu yapýdadýr sürece runtime başlatma olası sorunları önlemek için bağımlılık Kurucular, sınıfların içindeki özellik değerleri girmemelisiniz. For details, see DependencyObjects için Güvenli Oluşturucu Desenler.

Ayrıca bkz.

Kavramlar

Bağımlılık Özellikleri Genel Bakış

Bağımlılık Özelliği Meta Verisi

Denetim Yazımına Genel Bakış

Koleksiyon Türü Bağımlılık Özellikleri

Bağımlılık Özelliği Güvenlik

XAML Yükleme ve Bağımlılık Özellikleri

DependencyObjects için Güvenli Oluşturucu Desenler