WPF XAML Ad Kapsamları

XAML ad kapsamları, 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ı arabirimi tarafından INameScope tanımlanır ve pratik sınıfı NameScopetarafından da uygulanır.

Yüklenen XAML Uygulamalarında Ad Kapsamları

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, ortak kök öğeler olan öğeler (, ve WindowgibiPage) her zaman bir XAML ad kapsamını denetler. veya gibi FrameworkElementFrameworkContentElement bir öğe işaretlemedeki sayfanın kök öğesiyse, XAML işlemcisi çalışan bir Page XAML ad kapsamı sağlayabilmesi Page için örtük olarak bir kök ekler.

Dekont

WPF derleme eylemleri, XAML işaretlemesindeki hiçbir öğede veya Namex:Name öznitelik tanımlanmasa 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. Herhangi bir derleme eylemi tarafından işaretlemeyle derlenmeyen XAML için, XAML yüklendiğinde XAML ad kapsamı sorunlarıyla ilgili özel durumlar 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ıkları an, WPF XAML ad kapsamının oluşturulduğu ve tanımlandığı zamanı 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 uygulamasını RegisterName çağırmanız gerekir; bu genellikle XAML sayfası köküdür. Ad kayıtlı değilse, eklenen nesneye gibi FindNameyöntemler aracılığıyla ada göre başvurulamaz ve bu adı animasyon hedeflemesi için kullanamazsınız.

Uygulama geliştiricileri için en yaygın senaryo, adları sayfanın geçerli kökündeki XAML ad kapsamına kaydetmek için kullanmanızdır RegisterName . 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ışında bir nesneyi çağırırsanız RegisterName , XAML ad kapsamı tanımlama nesnesini çağırmış RegisterName gibi, ad hala çağıran nesnenin içinde tutulacak XAML ad kapsamına kaydedilir.

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.

Yüklü XAML'den değil program aracılığıyla oluşturulan uygulamalar için, XAML ad kapsamını tanımlayan nesnenin, örneklerinde bir XAML ad kapsamının oluşturulmasını desteklemek için uygulaması veya FrameworkContentElement türetilmiş bir sınıf olması FrameworkElement gerekirINameScope.

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. Parametre olarak ona sahip olacak nesneyi ve parametre olarak dependencyObjectvalue yeni NameScope bir oluşturucu çağrısı belirtin.

için dependencyObjectSetNameScope olarak sağlanan nesne bir uygulama FrameworkElement değilse veya FrameworkContentElementherhangi bir INameScope alt öğe üzerinde çağrısının RegisterName hiçbir etkisi olmaz. Yeni XAML ad kapsamını açıkça oluşturamazsanız çağrısı RegisterName bir özel durum oluşturur.

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

Stiller ve Şablonlar'da XAML Ad 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 inceleyin:

<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, şablonun FindNameikinci parametre olarak uygulandığı denetimi geçirerek öğesinin şablon sürümünü çağırırsınız.

Denetim yazarıysanız ve uygulanan şablondaki belirli bir adlandırılmış öğenin denetimin kendisi tarafından tanımlanan bir davranışın hedefi olduğu bir kural oluşturuyorsanız, denetim uygulama kodunuzdan yöntemini kullanabilirsiniz GetTemplateChild . 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 almanız gerekiyorsa değerini alın TemplatedParentve oradan çağrısı FindName yapın. Olay işleyicisi uygulamasını yazıyorsanız, olayın uygulanan bir şablondaki bir öğeden tetiklendiği şablon içinde çalışmaya bir örnek verilebilir.

FrameworkElement, RegisterName ve UnregisterName yöntemlerine sahiptirFindName. 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 bir XAML ad kapsamına sahip olmaması dışında FrameworkContentElement benzer davranışlara sahiptir. 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 Kapsamı Uygulamaları

Aşağıdaki sınıflar doğrudan uygulanır INameScope :

ResourceDictionary XAML adlarını veya ad kapsamlarını kullanmaz; bunun yerine anahtarları kullanır çünkü bu bir sözlük uygulamasıdır. Bunu uygulayan ResourceDictionaryINameScope tek neden, gerçek bir XAML ad kapsamı ile anahtarların nasıl ResourceDictionary işlendiğini netleştirmeye yardımcı olan kullanıcı koduna özel durumlar oluşturabilmesi ve ayrıca XAML ad kapsamlarının bir üst öğeler tarafından uygulanmadığından ResourceDictionary emin olmaktır.

FrameworkTemplate ve Style açık arabirim tanımları aracılığıyla uygulayın INameScope . Açık uygulamalar, bu XAML ad kapsamlarının arabirim üzerinden INameScope erişildiğinde geleneksel olarak davranmasına olanak sağlar. Bu, XAML ad kapsamlarının WPF iç işlemleri tarafından nasıl iletildiğidir. Ancak açık arabirim tanımları ve Style'nin geleneksel API yüzeyinin FrameworkTemplate bir parçası değildir, çünkü yöntemleri üzerinde ve Style doğrudan nadiren çağırmanız INameScope gerekir ve bunun yerine gibi GetTemplateChilddiğer API'leri FrameworkTemplate kullanırsınız.

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

Ayrıca bkz.