Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
XAML ad kapsamı, nesnelerin XAML tanımlı adları ile bunların örnek eşdeğerleri arasındaki ilişkileri depolar. Bu kavram, diğer programlama dillerinde ve teknolojilerinde namescope teriminin daha geniş anlamı ile benzerdir.
XAML ad alanları nasıl tanımlanır?
XAML ad kapsamlarındaki adlar, kullanıcı kodunun başlangıçta XAML'de bildirilen nesnelere başvurmasını sağlar. XAML ayrıştırma işleminin iç sonucu, çalışma zamanının bu nesnelerin XAML bildirimlerinde sahip olduğu ilişkilerin bir kısmını veya tümünü koruyan bir nesne kümesi oluşturmasıdır. Bu ilişkiler, oluşturulan nesnelerin belirli nesne özellikleri olarak korunur veya programlama modeli API'lerindeki yardımcı program yöntemlerine sunulur.
Bir XAML adskopunda bir adın en tipik kullanımı, kısmi sınıf şablonlarında oluşturulan initializeComponent yöntemiyle birlikte bir proje derleme eylemi olarak işaretleme derleme geçişi tarafından etkinleştirilen bir nesne örneğine doğrudan başvurudur.
Ayrıca, XAML işaretlemesinde bir adla tanımlanan nesnelere başvuru döndürmek için çalışma zamanında FindName yardımcı programı yöntemini de kullanabilirsiniz.
Derleme eylemleri ve XAML hakkında daha fazla bilgi
Teknik olarak, XAML'nin kendisi, XAML ile birlikte kod-arkası için tanımladığı kısmi sınıfın derlendiği esnada, bir işaretleme derleyicisinden geçer. İşaretlemede tanımlanan name veya x:Name özniteliğine sahip her nesne öğesi, XAML adıyla eşleşen bir ada sahip bir iç alan oluşturur. Bu alan başlangıçta boş olur. Ardından sınıfı, yalnızca tüm XAML yüklendikten sonra çağrılan bir InitializeComponent yöntemi oluşturur. InitializeComponent mantığı içinde, her iç alan eşdeğer ad dizesi için FindName dönüş değeriyle doldurulur. Derlemeden sonra bir Windows Çalışma Zamanı uygulama projesinin /obj alt klasöründeki her XAML sayfası için oluşturulan ".g" (oluşturulan) dosyalara bakarak bu altyapıyı kendiniz gözlemleyebilirsiniz. Ayrıca, alanları ve InitializeComponent yöntemini, sonuçta elde edilen derlemelerinizin üyeleri olarak görebilir veya arabirim dil içeriklerini başka bir şekilde inceleyebilirsiniz.
Uyarı
Özellikle Visual C++ bileşen uzantıları (C++/CX) uygulamaları için, XAML dosyasının kök öğesi için x:Name başvurusu için bir yedekleme alanı oluşturulmaz. Arka plandaki C++/CX koddan kök nesneye başvurmanız gerekiyorsa, diğer API'leri veya ağaç geçişini kullanın. Örneğin, bilinen bir adlandırılmış alt öğe için FindName'i çağırabilir ve ardından Parent öğesini çağırabilirsiniz.
XamlReader.Load ile çalışma zamanında nesne oluşturma
XAML, ilk XAML kaynak ayrıştırma işlemine benzer şekilde davranan XamlReader.Load yöntemi için dize girişi olarak da kullanılabilir. XamlReader.Load , çalışma zamanında bağlantısı kesilmiş yeni bir nesne ağacı oluşturur. Bağlantısı kesilmiş ağaç daha sonra ana nesne ağacındaki bir noktaya eklenebilir. Oluşturduğunuz nesne ağacını, Children gibi bir içerik özelliği koleksiyonuna ekleyerek veya nesne değeri alan başka bir özelliği ayarlayarak (örneğin, Fill özelliği için yeni bir ImageBrush yükleyerek) açıkça bağlamanız gerekir.
XamlReader.Load'un XAML ad kapsamı özellikleri üzerindeki etkileri
XamlReader.Load tarafından oluşturulan yeni nesne ağacı tarafından tanımlanan ön XAML ad kapsamı, sağlanan XAML'deki tanımlı adları benzersizlik açısından değerlendirir. Sağlanan XAML'deki adlar bu noktada dahili olarak benzersiz değilse , XamlReader.Load bir özel durum oluşturur. Bağlantısı kesilmiş nesne ağacı, ana uygulama nesne ağacına bağlandığında veya bağlandığı takdirde kendi XAML ad kapsamını ana uygulamanın XAML ad kapsamıyla birleştirmeye çalışmaz. Ağaçları bağladıktan sonra uygulamanızın birleştirilmiş bir nesne ağacı vardır, ancak bu ağacın içinde ayrı XAML ad kapsamları vardır. Bölümler nesneler arasındaki bağlantı noktalarında gerçekleşir ve burada bazı özellikleri XamlReader.Load çağrısından döndürülen değer olarak ayarlarsınız.
Ayrık ve bağlantısı kesilmiş XAML ad kapsamlarına sahip olmanın karmaşıklığı , FindName yöntemine yapılan çağrıların yanı sıra doğrudan yönetilen nesne başvurularının artık birleşik bir XAML ad kapsamına karşı çalışmamadır. Bunun yerine, FindName'in çağrıldığı belirli nesne kapsamı gösterir ve kapsam, çağıran nesnenin içinde olduğu XAML ad kapsamıdır. Doğrudan yönetilen nesne başvurusu durumunda kapsam, kodun yer aldığı sınıf tarafından belirtilir. Genellikle, uygulama içeriğinin bir "sayfasının" çalışma zamanı etkileşimi için arka plandaki kod, kök "sayfa"yı destekleyen kısmi sınıfta bulunur ve bu nedenle XAML ad alanı kök XAML ad alanıdır.
Kök XAML ad kapsamına adlandırılmış bir nesne almak için FindName'i çağırırsanız, yöntem XamlReader.Load tarafından oluşturulan ayrık bir XAML ad kapsamındaki nesneleri bulamaz. Buna karşılık, ayrık XAML ad kapsamı dışından alınan bir nesneden FindName çağırırsanız, yöntem kök XAML ad kapsamı içinde adlandırılmış nesneleri bulamaz.
Bu ayrık XAML ad kapsamı sorunu, FindName çağrısı kullanılırken yalnızca XAML ad kapsamlarında isimlendirilmiş nesneleri bulmayı etkiler.
Farklı bir XAML ad kapsamı içinde tanımlanan nesnelere başvuru almak için birkaç teknik kullanabilirsiniz:
- Nesne ağacı yapınızda (Panel.Children tarafından döndürülen koleksiyon gibi) var olduğu bilinen Parent ve/veya koleksiyon özellikleriyle tek tek adımlarda tüm ağacı gezin.
- Ayrık bir XAML ad kapsamından çağrı yapıyorsanız ve kök XAML ad kapsamını istiyorsanız, halihazırda görüntülenen ana pencereye referans almak her zaman kolaydır. Görsel kökünü (içerik kaynağı olarak da bilinen kök XAML öğesi) geçerli uygulama penceresinden bir kod satırında
Window.Current.Contentçağrısıyla alabilirsiniz. Daha sonra FrameworkElement'e yayınlayabilir ve bu kapsamdan FindName'i çağırabilirsiniz. - Kök XAML adskopundan çağrı yapıyorsanız ve ayrı bir XAML ad kapsamı içinde bir nesne istiyorsanız, yapılacak en iyi şey kodunuzda önceden planlamak ve XamlReader.Load tarafından döndürülen nesneye başvuruyu korumak ve ardından ana nesne ağacına eklemektir. Bu nesne artık ayrık XAML ad kapsamı içinde FindName'i çağırmak için geçerli bir nesnedir. Bu nesneyi genel değişken olarak kullanılabilir durumda tutabilir veya yöntem parametrelerini kullanarak başka bir şekilde geçirebilirsiniz.
- Görsel ağacı inceleyerek adlardan ve XAML ad kapsamının dikkate alınmasından tamamen kaçınabilirsiniz. VisualTreeHelper API'si, görsel ağacı yalnızca konum ve dizin temelinde üst nesneler ve alt koleksiyonlar açısından dolaşmanıza olanak tanır.
Şablonlardaki XAML ad kapsamları
XAML'deki şablonlar içeriği basit bir şekilde yeniden kullanma ve yeniden uygulama olanağı sağlar, ancak şablonlar şablon düzeyinde tanımlı adlara sahip öğeler de içerebilir. Aynı şablon sayfada birden çok kez kullanılabilir. Bu nedenle şablonlar, stilin veya şablonun uygulandığı içeren sayfadan bağımsız olarak kendi XAML ad kapsamlarını tanımlar. Şu ö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="MyTemplate">
....
<TextBlock x:Name="MyTextBlock" />
</ControlTemplate>
</Page.Resources>
<StackPanel>
<SomeControl Template="{StaticResource MyTemplate}" />
<SomeControl Template="{StaticResource MyTemplate}" />
</StackPanel>
</Page>
Burada, aynı şablon iki farklı denetime uygulanır. Şablonların ayrı XAML ad kapsamları yoksa, şablonda kullanılan "MyTextBlock" adı 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. Ancak, kök XAML isim kapsamı, her iki şablondan gelen adı içermez.
Ayrı XAML ad kapsamları nedeniyle, şablonun uygulandığı sayfanın kapsamından bir şablon içindeki adlandırılmış öğeleri bulmak farklı bir teknik gerektirir. Nesne ağacındaki bir nesnede FindName'i çağırmak yerine, önce şablonun uygulandığı nesneyi alırsınız ve sonra GetTemplateChild'ı ç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 GetTemplateChild yöntemini kullanabilirsiniz. GetTemplateChild yöntemi korunur, bu nedenle yalnızca denetim yazarı buna erişebilir. Ayrıca, denetim yazarlarının bölümleri ve şablon bölümlerini adlandırmak ve bunları denetim sınıfına uygulanan öznitelik değerleri olarak raporlamak için izlemesi gereken kurallar vardır. Bu teknik, farklı bir şablon uygulamak isteyen kullanıcıları denetlemek için önemli parçaların adlarını bulunabilir hale getirir ve bu da denetim işlevselliğini korumak için adlandırılmış bölümlerin değiştirilmesini gerektirebilir.
İlgili konular
Windows developer