Ekli Özelliklere Genel Bakış

Ekli özellik, XAML tarafından tanımlanan bir kavramdır. Ekli özellik, herhangi bir bağımlılık nesnesinde ayarlanabilen bir genel özellik türü olarak kullanılmak üzere tasarlanmıştır. Windows Presentation Foundation'da (WPF), ekli özellikler genellikle geleneksel "sarmalayıcı" özelliğine sahip olmayan özel bir bağımlılık özelliği biçimi olarak tanımlanır.

Önkoşullar

Bu makalede, Windows Presentation Foundation (WPF) sınıflarında var olan bağımlılık özelliklerinin tüketicisi açısından bağımlılık özelliklerini anladığınız ve Bağımlılık Özelliklerine Genel Bakış'ı okuduğunuz varsayılır. Bu makaledeki örnekleri izlemek için XAML'yi de anlamanız ve WPF uygulamalarının nasıl yazılması gerektiğini bilmeniz gerekir.

Ekli Özellikleri Neden Kullanmalısınız?

Ekli özelliğin bir amacı, farklı alt öğelerin bir üst öğede tanımlanan bir özellik için benzersiz değerler belirtmesine izin vermektir. Bu senaryonun belirli bir uygulaması, alt öğelerin üst öğeye kullanıcı arabiriminde (UI) nasıl sunulacaklarını bildirmesini sağlamaktır. Bir örnek özelliğidir DockPanel.Dock . DockPanel.Dock özelliği ekli özellik olarak oluşturulur çünkü kendisi yerine DockPanel içinde DockPanel bulunan öğelerde ayarlanacak şekilde tasarlanmıştır. DockPanel sınıfı adlı DockPropertystatik DependencyProperty alanı tanımlar ve ardından ve SetDock yöntemlerini ekli özellik için genel erişimciler olarak sağlarGetDock.

XAML'de Ekli Özellikler

XAML'de AttachedPropertyProvider söz dizimini kullanarak ekli özellikleri ayarlarsınız.Propertyname

Aşağıda, XAML'de nasıl ayarlayabileceğinize DockPanel.Dock ilişkin bir örnek verilmiştir:

<DockPanel>
    <TextBox DockPanel.Dock="Top">Enter text</TextBox>
</DockPanel>

Kullanım, statik bir özelliğe benzer; adla belirtilen herhangi bir örneğe başvurmak yerine her zaman ekli özelliğin sahibi olan ve kaydeden türe DockPanel başvurursunuz.

Ayrıca, XAML'deki ekli bir özellik işaretlemede ayarladığınız bir öznitelik olduğundan, yalnızca küme işleminin herhangi bir ilgisi vardır. Stillerdeki tetikleyiciler gibi değerleri karşılaştırmak için bazı dolaylı mekanizmalar olsa da XAML'de bir özelliği doğrudan alamazsınız (ayrıntılar için bkz . Stil oluşturma ve Şablon Oluşturma).

WPF'de İliştirilmiş Özellik Uygulaması

Windows Presentation Foundation'da (WPF), WPF türlerindeki kullanıcı arabirimiyle ilgili ekli özelliklerin çoğu bağımlılık özellikleri olarak uygulanır. Ekli özellikler bir XAML kavramıyken bağımlılık özellikleri bir WPF kavramıdır. WPF ekli özellikleri bağımlılık özellikleri olduğundan, özellik meta verileri gibi bağımlılık özelliği kavramlarını ve bu özellik meta verilerindeki varsayılan değerleri destekler.

Sahip Olan Tür Tarafından Eklenen Özellikler Nasıl Kullanılır?

Ekli özellikler herhangi bir nesne üzerinde ayarlanabilir olsa da, bu otomatik olarak özelliğin ayarlanmasının somut bir sonuç oluşturacağı veya değerin başka bir nesne tarafından kullanılacağı anlamına gelmez. Genel olarak, ekli özellikler, çok çeşitli olası sınıf hiyerarşilerinden veya mantıksal ilişkilerden gelen nesnelerin ekli özelliği tanımlayan türe ortak bilgileri bildirebilmesi için tasarlanmıştır. Ekli özelliği tanımlayan tür genellikle şu modellerden birini izler:

  • Ekli özelliği tanımlayan tür, ekli özellik için değerleri ayarlayacak öğelerin üst öğesi olacak şekilde tasarlanmıştır. Daha sonra türü, iç mantık aracılığıyla alt nesnelerini bazı nesne ağacı yapısına karşı yineler, değerleri alır ve bu değerler üzerinde bir şekilde hareket eder.

  • Ekli özelliği tanımlayan tür, çeşitli olası üst öğeler ve con çadır modu ls için alt öğe olarak kullanılır.

  • Ekli özelliği tanımlayan tür bir hizmeti temsil eder. Diğer türler, ekli özellik için değerleri ayarlar. Ardından, özelliği ayarlayan öğe hizmet bağlamında değerlendirildiğinde, ekli özellik değerleri hizmet sınıfının iç mantığı aracılığıyla elde edilir.

Üst Tanımlı İliştirilmiş Özellik Örneği

WPF'nin ekli bir özelliği tanımladığı en tipik senaryo, bir üst öğenin bir alt öğe koleksiyonunu desteklemesi ve ayrıca her alt öğe için davranışın ayrıntılarının tek tek bildirildiği bir davranış uygulamasıdır.

DockPanelDockPanel.Dock ekli özelliği tanımlar ve DockPanel işleme mantığının (özellikle MeasureOverride ve ArrangeOverride) parçası olarak sınıf düzeyinde koda sahiptir. Bir DockPanel örnek her zaman anlık alt öğelerinden herhangi birinin için DockPanel.Dockbir değer ayarlayıp ayarlamadığını denetler. Bu durumda, bu değerler söz konusu alt öğeye uygulanan işleme mantığı için giriş haline gelir. İç içe DockPanel yerleştirilmiş örneklerin her biri kendi anlık alt öğe koleksiyonlarını işler, ancak bu davranış, değerlerin nasıl DockPanel işlendiğine DockPanel.Dock özgüdür. Teorik olarak, öğeleri anında üst öğe dışında etkileyen ekli özelliklere sahip olmak mümkündür. DockPanel.Dock Ekli özellik üzerinde işlem yapmak için üst öğe olmayan DockPanel bir öğede ayarlanırsa, hiçbir hata veya özel durum tetiklenmez. Bu basitçe genel özellik değerinin ayarlandığı, ancak bilgileri tüketebilecek geçerli DockPanel üst öğeye sahip olmadığı anlamına gelir.

Kodda Ekli Özellikler

WPF'deki ekli özellikler, kolay erişim/ayar erişimi için tipik CLR "sarmalayıcı" yöntemlerine sahip değildir. Bunun nedeni, özelliğin ayarlandığı örnekler için bağlı özelliğin CLR ad alanının mutlaka bir parçası olmamasıdır. Ancak XAML işlemcisi, XAML ayrıştırıldığında bu değerleri ayarlayabilmelidir. Etkin bir ekli özellik kullanımını desteklemek için, ekli özelliğin sahip türünün Get PropertyName ve SetPropertyName biçiminde ayrılmış erişimci yöntemleri uygulaması gerekir. Bu ayrılmış erişimci yöntemleri, kodda ekli özelliği almak veya ayarlamak için de yararlıdır. Kod açısından bakıldığında, ekli bir özellik, özellik erişimcileri yerine yöntem erişimcileri olan bir yedekleme alanına benzer ve bu yedekleme alanı özel olarak tanımlanması yerine herhangi bir nesnede bulunabilir.

Aşağıdaki örnek, kodda ekli özelliği nasıl ayarlayabileceğinizi gösterir. Bu örnekte sınıfının myCheckBox bir örneğidir CheckBox .

DockPanel myDockPanel = new DockPanel();
CheckBox myCheckBox = new CheckBox();
myCheckBox.Content = "Hello";
myDockPanel.Children.Add(myCheckBox);
DockPanel.SetDock(myCheckBox, Dock.Top);
Dim myDockPanel As New DockPanel()
Dim myCheckBox As New CheckBox()
myCheckBox.Content = "Hello"
myDockPanel.Children.Add(myCheckBox)
DockPanel.SetDock(myCheckBox, Dock.Top)

XAML örneğine benzer şekilde, dördüncü kod satırı tarafından alt öğesi myDockPanel olarak henüz eklenmeseydimyCheckBox, beşinci kod satırı özel durum oluşturmaz, ancak özellik değeri bir DockPanel üst öğeyle etkileşim kurmaz ve bu nedenle hiçbir şey yapmaz. Yalnızca bir DockPanel.Dock üst öğenin varlığıyla birleştirilen bir alt öğe üzerinde ayarlanan bir DockPanel değer, işlenen uygulamada etkili bir davranışa neden olur. (Bu durumda, ekli özelliği ayarlayabilir ve ardından ağaca iliştirebilirsiniz. İsterseniz, ağaca iliştirip ekli özelliği ayarlayabilirsiniz. Her iki eylem sırası da aynı sonucu sağlar.)

Ekli Özellik Meta Verileri

Özelliği kaydederken özelliğin FrameworkPropertyMetadata özelliklerini belirtmek için ayarlanır; örneğin özelliğin işlemeyi, ölçümü vb. etkileyip etkilemediği. Ekli bir özelliğin meta verileri genellikle bağımlılık özelliğinden farklı değildir. Eklenen özellik meta verilerini geçersiz kılmada varsayılan bir değer belirtirseniz, bu değer geçersiz kılma sınıfının örneklerinde örtük ekli özelliğin varsayılan değeri olur. Özellikle, bir ekli özelliğin değeri için bazı işlem sorguları bu özelliğin yöntem erişimcisi aracılığıyla Get sorgular işlerse, meta verileri belirttiğiniz sınıfın bir örneğini belirtirse ve ekli özelliğin değeri aksi takdirde ayarlanmamışsa varsayılan değeriniz bildirilir.

Özellikte özellik değeri devralmayı etkinleştirmek istiyorsanız, ekli olmayan bağımlılık özellikleri yerine ekli özellikleri kullanmanız gerekir. Ayrıntılar için bkz . Özellik Değeri Devralma.

Özel Ekli Özellikler

Ekli Özellik Ne Zaman Oluşturulur?

Tanımlama sınıfı dışındaki sınıflar için bir özellik ayarı mekanizmasının kullanılabilir olmasının bir nedeni olduğunda ekli bir özellik oluşturabilirsiniz. Bunun için en yaygın senaryo düzendir. Var olan düzen özelliklerine örnek olarak DockPanel.Dock, Panel.ZIndexve verilebilir Canvas.Top. Burada etkinleştirilen senaryo, düzen denetimi öğelerine alt öğe olarak var olan öğelerin düzen gereksinimlerini düzen üst öğelerine tek tek ifade edebilmesi ve her birinin üst öğe tarafından ekli özellik olarak tanımlanan bir özellik değeri ayarlamasıdır.

Ekli özellik kullanmak için bir diğer senaryo da sınıfınızın bir hizmeti temsil ettiği ve sınıfların hizmeti daha saydam bir şekilde tümleştirebilmesini istemenizdir.

Diğer bir senaryo da Özellikler penceresi düzenleme gibi Visual Studio WPF Tasarım Aracı desteği almaktır. Daha fazla bilgi için bkz . Denetim Yazmaya Genel Bakış.

Daha önce belirtildiği gibi, özellik değeri devralmayı kullanmak istiyorsanız ekli özellik olarak kaydetmeniz gerekir.

Ekli Özellik Oluşturma

Sınıfınız ekli özelliği diğer türlerde kullanmak üzere kesin olarak tanımlıyorsa, sınıfının öğesinden DependencyObjecttüretmesi gerekmez. Ancak, ekli özelliğinizin de bir bağımlılık özelliği olmasına ilişkin genel WPF modelini izlerseniz öğesinden DependencyObject türetilmesi gerekir.

türünde DependencyPropertybir alan bildirerek ekli özelliğinizi bağımlılık public static readonly özelliği olarak tanımlayın. Yönteminin dönüş değerini RegisterAttached kullanarak bu alanı tanımlarsınız. Tanımlayıcı alanları ve temsil ettikleri özellikleri adlandırmaya yönelik yerleşik WPF desenini izlemek için, alan adının dizesiyle Propertyeklenmiş olan ekli özellik adıyla eşleşmesi gerekir. Ekli özellik sağlayıcısının ayrıca statik GetPropertyName ve SetPropertyName yöntemlerini ekli özellik için erişimci olarak sağlaması gerekir; bunun başarısız olması, özellik sisteminin ekli özelliğinizi kullanamamasına neden olur.

Dekont

Ekli özelliğin get erişimcisini atlarsanız, özelliğindeki veri bağlama Visual Studio ve Visual Studio için Blend gibi tasarım araçlarında çalışmaz.

The Get Accessor

GetPropertyName erişimcisinin imzası şu şekilde olmalıdır:

public static object GetPropertyName(object target)

  • target Nesnesi, uygulamanızda daha belirli bir tür olarak belirtilebilir. Örneğin, DockPanel.GetDock yöntemi parametresini olarak UIElementyazın çünkü eklenen özellik yalnızca örneklerde UIElement ayarlanacak şekilde tasarlanmıştır.

  • Dönüş değeri, uygulamanızda daha belirli bir tür olarak belirtilebilir. Örneğin, GetDock yöntem bunu olarak Dockyazın, çünkü değer yalnızca bu numaralandırmaya ayarlanabilir.

The Set Accessor

SetPropertyName erişimcisinin imzası şu şekilde olmalıdır:

public static void SetPropertyName(object target, object value)

  • target Nesnesi, uygulamanızda daha belirli bir tür olarak belirtilebilir. Örneğin, SetDock ekli özelliğin yalnızca örneklerde UIElement ayarlanması amaçlandığından yöntemi bunu olarak UIElementyazın.

  • value Nesnesi, uygulamanızda daha belirli bir tür olarak belirtilebilir. Örneğin, SetDock yöntem bunu olarak Dockyazın, çünkü değer yalnızca bu numaralandırmaya ayarlanabilir. Bu yöntemin değerinin, işaretlemede ekli özellik kullanımınızda ekli özelliğinizle karşılaştığında XAML yükleyicisinden gelen giriş olduğunu unutmayın. Bu giriş, işaretlemede XAML öznitelik değeri olarak belirtilen değerdir. Bu nedenle, kullandığınız tür için tür dönüştürme, değer seri hale getirici veya işaretleme uzantısı desteği olmalıdır; böylece öznitelik değerinden uygun tür oluşturulabilir (sonuçta yalnızca bir dizedir).

Aşağıdaki örnek, bağımlılık özelliği kaydını (yöntemini kullanarak) yanı sıra GetPropertyName ve SetPropertyName erişimcilerini gösterir.RegisterAttached Örnekte, ekli özellik adı şeklindedir IsBubbleSource. Bu nedenle, erişimciler ve SetIsBubbleSourceolarak adlandırılmalıdırGetIsBubbleSource.

public static readonly DependencyProperty IsBubbleSourceProperty = DependencyProperty.RegisterAttached(
  "IsBubbleSource",
  typeof(Boolean),
  typeof(AquariumObject),
  new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender)
);
public static void SetIsBubbleSource(UIElement element, Boolean value)
{
  element.SetValue(IsBubbleSourceProperty, value);
}
public static Boolean GetIsBubbleSource(UIElement element)
{
  return (Boolean)element.GetValue(IsBubbleSourceProperty);
}
Public Shared ReadOnly IsBubbleSourceProperty As DependencyProperty = DependencyProperty.RegisterAttached("IsBubbleSource", GetType(Boolean), GetType(AquariumObject), New FrameworkPropertyMetadata(False, FrameworkPropertyMetadataOptions.AffectsRender))
Public Shared Sub SetIsBubbleSource(ByVal element As UIElement, ByVal value As Boolean)
    element.SetValue(IsBubbleSourceProperty, value)
End Sub
Public Shared Function GetIsBubbleSource(ByVal element As UIElement) As Boolean
    Return CType(element.GetValue(IsBubbleSourceProperty), Boolean)
End Function

Ekli Özellik Öznitelikleri

WPF, yansıma işlemlerine ve tasarımcılar gibi yansıma ve özellik bilgilerinin tipik kullanıcılarına ekli özellikler hakkında bilgi sağlamaya yönelik çeşitli .NET özniteliklerini tanımlar. Ekli özelliklerin sınırsız kapsam türü olduğundan tasarımcıların, XAML kullanan belirli bir teknoloji uygulamasında tanımlanan tüm ekli özelliklerin genel listesine sahip aşırı kullanıcıları önlemek için bir yönteme ihtiyacı vardır. WPF'nin ekli özellikler için tanımladığı .NET öznitelikleri, belirli bir ekli özelliğin özellikler penceresinde gösterilmesi gereken durumları kapsamak için kullanılabilir. Bu öznitelikleri kendi özel ekli özellikleriniz için de uygulamayı düşünebilirsiniz. .NET özniteliklerinin amacı ve söz dizimi, uygun başvuru sayfalarında açıklanmıştır:

Ekli Özellikler Hakkında Daha Fazla Bilgi Edinme

  • Ekli özellik oluşturma hakkında daha fazla bilgi için bkz . Ekli Özelliği Kaydetme.

  • Bağımlılık özellikleri ve ekli özellikler için daha gelişmiş kullanım senaryoları için bkz . Özel Bağımlılık Özellikleri.

  • Ayrıca, bir özelliği ekli özellik olarak ve bağımlılık özelliği olarak kaydedebilirsiniz, ancak sonra da "sarmalayıcı" uygulamalarını kullanıma sunarsınız. Bu durumda, özellik bu öğede veya XAML ekli özellik söz dizimi aracılığıyla herhangi bir öğede ayarlanabilir. Hem standart hem de ekli kullanımlar için uygun senaryoya sahip bir özellik örneğidir FrameworkElement.FlowDirection.

Ayrıca bkz.