WPF XAML Ad Kapsamları
Xaml ad kapsamları, XAML 'de tanımlanan nesneleri tanımlayan bir kavramdır. XAML namescope 'daki adlar, nesne ağacındaki nesnelerin XAML tanımlı adları ve örnek eşdeğerleri arasında ilişki kurmak için kullanılabilir. Genellikle, bir xaml uygulaması için tek XAML sayfa kökleri yüklenirken WPF yönetilen kodundaki xaml ad kapsamları oluşturulur. Programlama nesnesi arabirim tarafından tanımlandığından INameScope ve ayrıca pratik sınıf tarafından uygulanan xaml ad kapsamları NameScope .
Yüklenen XAML uygulamalarında Namescopes
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ı veya ad kullanan sistemlerde, NameScope bir işlemin veya tekniğin, bu adı bir nesne isteniyorsa veya tanımlayıcı adların benzersizlik alanındaki sınırlar zorlandığında arama yapılacak sınırları tanımlar. Bu genel ilkeler XAML namescopes için geçerlidir. WPF 'de, xaml ad kapsamları, sayfa yüklendiğinde bir XAML sayfası için kök öğede oluşturulur. Sayfa kökünden başlayarak XAML sayfasında belirtilen her ad, ilgili XAML namescope 'a eklenir.
WPF XAML 'de ortak kök öğeler (ve gibi) olan öğeler PageWindow her zaman bir xaml namescope 'u denetler. Veya gibi bir öğe, FrameworkElementFrameworkContentElement biçimlendirme içindeki sayfanın kök öğesi ise, bir XAML işlemcisi Page , Page çalışma xaml namescope sağlamak için bir kökü örtülü olarak ekler.
Not
WPF derleme eylemleri xaml işaretlemesinin hiçbir öğesinde hiç Name veya özniteliği tanımlanmasa bile, XAML üretimi IÇIN xaml namescope oluşturun x:Name .
Aynı adı herhangi bir XAML namescope 'da iki kez kullanmayı denerseniz, bir özel durum oluşturulur. Kod arkasında ve derlenmiş bir uygulamanın parçası olan WPF XAML için, ilk biçimlendirme derlemesi sırasında sayfa için oluşturulan sınıf oluşturulurken WPF derleme eylemleri tarafından derleme zamanında oluşturulur. Herhangi bir yapı eylemi tarafından işaretleme tarafından derlenmediği XAML için, XAML yüklendiğinde XAML namescope sorunlarıyla ilgili özel durumlar ortaya çıkabilir. XAML tasarımcıları Ayrıca tasarım zamanında XAML namescope sorunlarını da tahmin edebilir.
Çalışma zamanı nesne ağaçlarına nesne ekleme
XAML 'nin ayrıştırılmasından sonra WPF XAML namescope 'un oluşturulduğu ve tanımlandığı zaman şu anda temsil edilir. Bu ağacı oluşturan XAML ayrıştırıldıktan sonra bir noktada nesne ağacına bir nesne eklerseniz, Namex:Name Yeni nesnedeki bir veya değer bir xaml namescope 'daki bilgileri otomatik olarak güncelleştirmez. XAML yüklendikten sonra bir nesne için bir WPF XAML namescope 'a bir ad eklemek için, RegisterName genellıkle XAML sayfa kökü olan xaml namescope öğesini tanımlayan nesnenin uygun uygulamasını çağırmanız gerekir. Ad kayıtlı değilse, eklenen nesneye, gibi yöntemler aracılığıyla adı başvuramaz FindName ve bu adı animasyon hedefleme için kullanamazsınız.
Uygulama geliştiricileri için en yaygın senaryo, RegisterName Adları sayfanın geçerli KÖKÜNDEKI xaml namescope 'a kaydetmek için kullanacaksınız. RegisterName animasyonların nesnelerini hedefleyen görsel taslak için önemli bir senaryonun bir parçasıdır. Daha fazla bilgi için bkz. görsel taslaklara genel bakış.
RegisterNameXaml namescope 'u tanımlayan nesne dışında bir nesne üzerinde çağrı yaparsanız, bu ad hala çağıran nesnenin içinde tutulduğu xaml namescope 'a kaydedilir, RegisterName nesne tanımlayan xaml namescope üzerinde çağırmışsınız gibi.
Koddaki XAML namescopes
Kodda xaml ad kapsamları oluşturabilir ve bunları kullanabilirsiniz. WPF için XAML işlemcisi, XAML kendisini işlerken bu API 'Leri ve kavramları kullandığından, API 'Ler ve XAML namescope oluşturma ile ilgili kavramlar, saf kod kullanımı için de aynıdır. Kavramlar ve API, genellikle XAML 'de kısmen veya tamamen tanımlanmış bir nesne ağacı içinde ada göre nesne bulabilme amacıyla vardır.
Programlı olarak oluşturulan ve yüklü XAML 'den olmayan uygulamalar için, bir XAML namescope tanımlayan nesne, INameScopeFrameworkElementFrameworkContentElement örnekleri üzerinde xaml namescope oluşturmayı desteklemek için ya da türetilmiş bir sınıf olmalıdır.
Ayrıca, XAML işlemcisi tarafından yüklenmeyen ve işlenen tüm öğeler için, nesne için XAML namescope 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 namescope oluşturmanız gerekir. XAML namescope oluşturmak için static SetNameScope yöntemi çağırın. Parametresi olarak sahip olacağı nesneyi dependencyObject ve NameScope parametresi olarak yeni bir Oluşturucu çağrısını belirtin value .
İçin olarak belirtilen nesne dependencyObjectSetNameScope bir INameScope uygulama değilse FrameworkElement veya FrameworkContentElement herhangi bir alt öğenin çağrılması hiçbir RegisterName etkiye sahip olmaz. Yeni XAML namescope 'u açıkça oluşturmadıysanız, çağrısı RegisterName bir özel durum oluşturacak.
Kodda XAML namescope API 'Lerinin kullanılmasına ilişkin bir örnek için bkz. ad kapsamını tanımlama.
Stillerde ve şablonlarda XAML namescopes
WPF 'deki stiller ve şablonlar, içeriği kolay bir şekilde yeniden kullanma ve yeniden uygulama yeteneği sağlar. Ancak, stiller ve şablonlar, şablon düzeyinde tanımlı XAML adları olan öğeleri de içerebilir. Aynı şablon bir sayfada birden çok kez kullanılabilir. Bu nedenle, stiller ve şablonlar, stil veya şablonun uygulandığı bir nesne ağacındaki herhangi bir konumdan bağımsız olarak kendi XAML namescopes değerlerini 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 de uygulanır. Şablonlarda ayrık XAML namescopes yoksa, TheBorder şablonda kullanılan ad xaml namescope 'da ad çakışmasına neden olur. Şablonun her örneklenmesi kendi XAML namescope 'a sahiptir. bu nedenle, bu örnekte oluşturulan her şablonun XAML namescope tam olarak bir ad içerir.
Stiller, genellikle görsel taslaklara ait bölümlerin atanabileceği belirli adlara sahip olması için kendi XAML namescope değerlerini de tanımlar. Bu adlar, şablon denetim özelleştirmenin bir parçası olarak yeniden tanımlansa bile, bu adın öğelerini hedefleyecek özel davranışları denetlemenize olanak tanır.
Ayrı XAML namescopes 'ler nedeniyle, bir şablonda adlandırılmış öğelerin bulunması, bir sayfada Şablonsuz adlandırılmış bir öğe bulmadan daha zor. Önce Template şablonun uygulandığı denetimin özellik değerini alarak uygulanan şablonu belirlemeniz gerekir. Daha sonra, şablonunun FindName ikinci parametre olarak uygulandığı denetimi geçirerek uygulamasının şablon sürümünü çağırabilirsiniz.
Bir denetim yazarınız ve uygulanan bir şablonda belirli bir adlandırılmış öğenin, denetimin kendisi tarafından tanımlanan bir davranışın hedefi olduğu bir kural oluşturuyorsanız, GetTemplateChild Denetim uygulama kodunuzda yöntemini kullanabilirsiniz. GetTemplateChildYöntemi korunur, bu nedenle yalnızca denetim yazarının buna erişimi vardır.
Bir şablon içinden çalışıyorsanız ve şablonun uygulandığı XAML namescope 'a erişmeniz gerekiyorsa, değerini alın TemplatedParent ve ardından bu değeri çağırın FindName . Şablon içinde çalışma örneği, etkinliğin uygulanan şablondaki bir öğeden oluşturulduğu olay işleyicisi uygulamasını yazıyorsanız olur.
XAML namescopes ve adla ilgili API 'Ler
FrameworkElementFindName, RegisterName ve UnregisterName yöntemleri. Bu yöntemleri bir XAML namescope 'ın sahibi olarak çağırırsanız, Yöntemler ilgili XAML namescope 'un yöntemlerine çağrı yapılır. Aksi takdirde, üst öğe bir XAML namescope 'a sahip olup olmadığını görmek için denetlenir ve bu işlem XAML namescope bulunana kadar yinelemeli olarak devam eder (XAML işlemci davranışı nedeniyle, kökte XAML namescope olması garanti edilir). FrameworkContentElement , hiçbir zaman XAML namescope 'a sahip olmadığı özel durum dışında, benzer davranışları vardır FrameworkContentElement . Yöntemler, FrameworkContentElement çağrının sonunda bir üst öğeye iletilebilmesi için üzerinde bulunur FrameworkElement .
SetNameScope , yeni bir XAML namescope 'ı varolan bir nesneyle eşlemek için kullanılır. SetNameScopeXaml namescope 'u sıfırlamak veya temizlemek için birden çok kez çağırabilirsiniz, ancak bu genel kullanım değildir. Ayrıca, GetNameScope Koddan genellikle kullanılmaz.
XAML namescope uygulamaları
Aşağıdaki sınıflar doğrudan uygulanır INameScope :
ResourceDictionary XAML adlarını veya ad kapsamları 'yi kullanmaz; Bunun yerine anahtarları kullanır, çünkü bir sözlük uygulamasıdır. Uygulayan tek neden, ResourceDictionaryINameScope gerçek bir xaml namescope ve bir tanıtıcı anahtarları arasındaki ayrımı açıklığa kavuşturmak ResourceDictionary ve ayrıca xaml ad kapsamları 'nin bir üst öğe öğelerine uygulanmamasını sağlamak için Kullanıcı koduna özel durumlar yükseltebilmesini sağlar ResourceDictionary .
FrameworkTemplate ve StyleINameScope Açık arabirim tanımları aracılığıyla uygulayın. Açık uygulamalar, INameScope xaml ad copes 'nın WPF iç süreçleriyle nasıl iletileceği, bu xaml ad copes 'nin arabirim üzerinden erişildiğinde genel olarak davranmasına izin verir. Ancak açık arabirim tanımları, ve ' ın geleneksel API yüzeyinin bir parçası değildir FrameworkTemplate , ancak bunun yerine, ve gibi StyleINameScopeFrameworkTemplateStyle diğer API 'leri kullanır GetTemplateChild .
Aşağıdaki sınıflar, System.Windows.NameScope yardımcı sınıfını kullanarak ve iliştirilmiş özelliği aracılığıyla xaml namescope uygulamasına bağlanarak kendı xaml namescope değerlerini tanımlar NameScope.NameScope :