Aracılığıyla paylaş


WPF XAML İsim Kapsamları

XAML ad alanları, XAML'de tanımlanan nesneleri tanımlayan bir kavramdır. Bir XAML ad kapsamındaki adlar, nesnenin XAML tanımlı adları ile bir nesne ağacındaki örnek eşdeğerleri arasında ilişki kurmak için kullanılabilir. Genellikle, WPF yönetilen kodunda XAML ad kapsamları, bir XAML uygulaması için tek tek XAML sayfa kökleri yüklenirken oluşturulur. Programlama nesnesi olarak XAML ad kapsamları, INameScope arabirimi tarafından tanımlanır ve NameScope uygulanabilir sınıf tarafından da uygulanır.

Yüklenen XAML Uygulamalarında İsim Alanları

Daha geniş bir programlama veya bilgisayar bilimi bağlamında, programlama kavramları genellikle bir nesneye erişmek için kullanılabilecek benzersiz bir tanımlayıcı veya ad ilkesini içerir. Tanımlayıcıları veya adları kullanan sistemler için namescope, bir işlemin veya tekniğin bu ada sahip bir nesne istenirse arayacağı sınırları veya adları tanımlamanın benzersizliğinin zorunlu kılındığı sınırları tanımlar. Bu genel ilkeler XAML ad kapsamları için geçerlidir. WPF'de, sayfa yüklendiğinde XAML sayfasının kök öğesinde XAML ad kapsamları oluşturulur. Sayfa kökünden başlayarak XAML sayfasında belirtilen her ad ilgili bir XAML ad kapsamına eklenir.

WPF XAML'de, Page ve Window gibi ortak kök öğeler her zaman bir XAML ad kapsamını denetler. Eğer FrameworkElement veya FrameworkContentElement gibi bir öğe, işaretlemedeki sayfanın kök öğesi ise, XAML işlemcisi, çalışan bir XAML ad kapsamı sağlayabilmek için Page öğesini örtük olarak ekler.

Uyarı

WPF derleme eylemleri, XAML işaretlemesindeki hiçbir öğede Name veya x:Name öznitelikleri tanımlanmamış olsa bile XAML üretimi için bir XAML ad kapsamı oluşturur.

Herhangi bir XAML adskopunda aynı adı iki kez kullanmaya çalışırsanız, bir özel durum oluşturulur. Arka planda kod içeren ve derlenmiş bir uygulamanın parçası olan WPF XAML için, ilk işaretleme derlemesi sırasında sayfa için oluşturulan sınıf oluşturulurken WPF derleme eylemleri tarafından derleme zamanında özel durum oluşturulur. İşaretleme derlemesiyle herhangi bir derleme eylemi tarafından derlenmeyen XAML için, XAML yüklendiğinde XAML ad alanı sorunlarıyla ilgili istisnalar ortaya çıkabilir. XAML tasarımcıları tasarım zamanında XAML ad kapsamı sorunlarını da öngörebilir.

Çalışma Zamanı Nesne Ağaçlarına Nesne Ekleme

XAML'nin ayrıştırıldığı o an, WPF XAML ad kapsamının oluşturulduğu ve tanımlandığı anı temsil eder. Bir nesne ağacına, o ağacı oluşturan XAML ayrıştırıldıktan sonra belirli bir noktada nesne eklerseniz, yeni nesnedeki bir Name veya x:Name değeri XAML ad kapsamındaki bilgileri otomatik olarak güncelleştirmez. XAML yüklendikten sonra WPF XAML ad kapsamına bir nesnenin adını eklemek için, XAML ad kapsamını tanımlayan nesnede uygun yöntemi RegisterName çağırmanız gerekir. Bu nesne genellikle XAML sayfasının köküdür. Ad kayıtlı değilse, eklenen nesneye FindName gibi yöntemler aracılığıyla ada göre başvurulamaz ve bu adı animasyon hedefleme için kullanamazsınız.

Uygulama geliştiricileri için en yaygın senaryo, sayfanın geçerli kökündeki XAML ad kapsamına adları kaydetmek için RegisterName kullanmanızdır. RegisterName , animasyonlar için nesneleri hedefleyen görsel taslaklar için önemli bir senaryonun parçasıdır. Daha fazla bilgi için bkz . Görsel Taslaklara Genel Bakış.

XAML ad kapsamını tanımlayan nesne dışındaki bir nesne üzerinde RegisterName çağrısı yaparsanız, ad yine de çağıran nesnenin içinde bulunduğu XAML ad kapsamına kaydedilir. Bu, sanki XAML ad kapsamını tanımlayan nesne üzerinde RegisterName çağrısı yapmış gibi gerçekleşir.

Kodda XAML Ad Kapsamları

Kodda XAML ad kapsamları oluşturabilir ve kullanabilirsiniz. WPF için XAML işlemcisi XAML'nin kendisini işlerken bu API'leri ve kavramları kullandığından, API'ler ve XAML ad kapsamı oluşturma işlemindeki kavramlar saf kod kullanımı için bile aynıdır. Kavramlar ve API temel olarak, genellikle kısmen veya tamamen XAML'de tanımlanan bir nesne ağacında nesneleri ada göre bulabilmek amacıyla mevcuttur.

Program aracılığıyla oluşturulan ve yüklü XAML'den oluşturulmayan uygulamalar için, XAML ad kapsamını tanımlayan nesnenin örneklerinde bir XAML ad kapsamının oluşturulmasını desteklemek amacıyla INameScope arabirimini uygulaması veya FrameworkElement ya da FrameworkContentElement türetilmiş bir sınıf olması gerekir.

Ayrıca, bir XAML işlemcisi tarafından yüklenmeyen ve işlenmemiş herhangi bir öğe için nesnenin XAML ad kapsamı varsayılan olarak oluşturulmaz veya başlatılmaz. Adları daha sonra kaydetmek istediğiniz herhangi bir nesne için açıkça yeni bir XAML ad kapsamı oluşturmanız gerekir. Bir XAML ad kapsamı oluşturmak için statik SetNameScope yöntemini çağırırsınız. dependencyObject parametresi olarak ona sahip olacak nesneyi ve NameScope parametresi olarak yeni bir value oluşturucu çağrısını belirtin.

tr-TR: Eğer dependencyObject için sağlanan nesne bir SetNameScope uygulaması, INameScope veya FrameworkElement değilse, FrameworkContentElement çağrısının herhangi bir alt öğe üzerinde hiçbir etkisi olmaz. Yeni XAML ad kapsamını açıkça oluşturamazsanız, RegisterName çağrısı bir özel duruma neden olur.

Kodda XAML ad kapsamı API'lerini kullanma örneği için bkz. Ad Kapsamı Tanımlama.

Stiller ve Şablonlarda XAML İsim Kapsamları

WPF'deki stiller ve şablonlar, içeriği basit bir şekilde yeniden kullanma ve yeniden uygulama olanağı sağlar. Ancak, stiller ve şablonlar şablon düzeyinde tanımlanan XAML adlarıyla öğeler de içerebilir. Aynı şablon sayfada birden çok kez kullanılabilir. Bu nedenle, stil ve şablonların her ikisi de nesne ağacında stilin veya şablonun uygulandığı konumdan bağımsız olarak kendi XAML ad kapsamlarını tanımlar.

Aşağıdaki örneği göz önünde bulundurun:

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  >
  <Page.Resources>
    <ControlTemplate x:Key="MyButtonTemplate" TargetType="{x:Type Button}">
      <Border BorderBrush="Red" Name="TheBorder" BorderThickness="2">
        <ContentPresenter/>
      </Border>      
    </ControlTemplate>
  </Page.Resources>
  <StackPanel>
    <Button Template="{StaticResource MyButtonTemplate}">My first button</Button>
    <Button Template="{StaticResource MyButtonTemplate}">My second button</Button>
  </StackPanel>
</Page>

Burada, aynı şablon iki farklı düğmeye uygulanır. Şablonların ayrı XAML ad kapsamları yoksa, TheBorder şablonda kullanılan ad XAML ad kapsamlarında ad çakışmasına neden olabilir. Şablonun her örneğinin kendi XAML ad kapsamı vardır, bu nedenle bu örnekte her bir örneğin XAML ad kapsamı tam olarak bir ad içerir.

Stiller ayrıca kendi XAML ad kapsamlarını da tanımlar, böylece görsel taslakların bazı bölümlerine belirli adlar atanabilir. Bu adlar, şablon denetim özelleştirmesinin bir parçası olarak yeniden tanımlansa bile söz konusu adın öğelerini hedefleyecek denetime özgü davranışları etkinleştirir.

Ayrı XAML ad kapsamları nedeniyle, bir şablonda adlandırılmış öğeleri bulmak, sayfada şablonlanmamış adlandırılmış öğe bulmaktan daha zordur. Önce, şablonun uygulandığı denetimin Template özellik değerini alarak uygulanan şablonu belirlemeniz gerekir. Ardından, şablon sürümünü çağırdıktan sonra, şablonun uygulandığı denetimi ikinci parametre olarak geçirirsiniz.

Kontrol yazarı iseniz ve uygulanan şablondaki belirli bir adı olan öğenin kontrol tarafından tanımlanan bir davranışın hedefi olduğu bir uygulama oluşturuyorsanız, kontrol uygulama kodunuzdan GetTemplateChild yöntemini kullanabilirsiniz. GetTemplateChild Yöntemi korunur, bu nedenle yalnızca denetim yazarı buna erişebilir.

Bir şablonun içinden çalışıyorsanız ve şablonun uygulandığı XAML ad kapsamına ulaşmanız gerekiyorsa, TemplatedParent değerini alın ve oradan FindName çağrısını yapın. Bir şablon içinde çalışmaya bir örnek, olay işleyicisi uygulamasını yazarken, olayın uygulanan bir şablondaki bir öğeden tetikleneceği durumu olabilir.

FrameworkElement, FindName ve RegisterName yöntemlerine sahiptirUnregisterName. Bu yöntemleri çağırdığınız nesne bir XAML ad kapsamına sahipse, yöntemler ilgili XAML ad kapsamının yöntemlerini çağırır. Aksi takdirde, üst öğe bir XAML ad kapsamına sahip olup olmadığını görmek için denetlenür ve bu işlem bir XAML ad kapsamı bulunana kadar özyinelemeli olarak devam eder (XAML işlemci davranışı nedeniyle, kökte bir XAML ad kapsamı olması garanti edilir). FrameworkContentElement benzer davranışlara sahiptir, ancak FrameworkContentElement asla bir XAML ad kapsamına sahip olmayacaktır. Yöntemler üzerinde FrameworkContentElement bulunur, böylece çağrılar sonunda bir FrameworkElement üst öğeye iletilebilir.

SetNameScope yeni bir XAML ad kapsamını var olan bir nesneyle eşlemek için kullanılır. XAML ad kapsamını sıfırlamak veya temizlemek için birden çok kez çağrı SetNameScope yapabilirsiniz, ancak bu yaygın bir kullanım değildir. Ayrıca genellikle GetNameScope koddan kullanılmaz.

XAML Ad Alanı Uygulamaları

Aşağıdaki sınıflar INameScope öğesini doğrudan uygular:

ResourceDictionary XAML adlarını veya ad kapsamlarını kullanmaz; bunun yerine anahtarları kullanır çünkü bu bir sözlük uygulamasıdır. ResourceDictionary'in INameScope'i uygulamasının tek nedeni, gerçek bir XAML ad kapsamı ile ResourceDictionary'ün anahtarları nasıl işlediğini netleştirmeye ve kullanıcı kodunda özel durumlar oluşturarak bu ayrımı sağlamaya yardımcı olmaktır. Ayrıca, XAML ad kapsamlarının üst öğeler tarafından ResourceDictionary'ye uygulanmadığından emin olmaktır.

FrameworkTemplate ve Style, açık arabirim tanımları aracılığıyla INameScope'yi uygular. Belirgin uygulamalar, bu XAML ad kapsamlarının INameScope arabirimi üzerinden erişildiğinde standart bir şekilde davranmasını sağlar. Bu, XAML ad kapsamlarının WPF iç süreçleri tarafından nasıl iletişim kurduğudur. Ancak açık arabirim tanımları, FrameworkTemplate ve Style'nin geleneksel API yüzeyinin bir parçası değildir, çünkü INameScope ve FrameworkTemplate üzerindeki Style yöntemlerini doğrudan çağırmanız nadiren gerekir ve bunun yerine GetTemplateChild gibi diğer API'leri kullanırsınız.

Aşağıdaki sınıflar, System.Windows.NameScope yardımcı sınıfını kullanarak ve NameScope.NameScope ekli özelliği aracılığıyla XAML ad kapsamı uygulamasına bağlanarak, kendi XAML ad kapsamlarını tanımlar:

Ayrıca bakınız