WPF XAML Ad KapsamlarıWPF XAML Namescopes

XAML ad kapsamları tanımlayan bir kavram XAML içinde tanımlanan nesneler var.XAML namescopes are a concept that identifies objects that are defined in XAML. XAML isim alanı adları, bir nesne ağacında nesneleri XAML tanımlanan adlarını ve örnek eşdeğerlerine arasındaki ilişkileri oluşturmak için kullanılabilir.The names in a XAML namescope can be used to establish relationships between the XAML-defined names of objects and their instance equivalents in an object tree. Genellikle, XAML ad kapsamları içinde WPFWPF yönetilen kod XAML uygulama için ayrı ayrı XAML sayfası yükleniyor kökleri olduğunda oluşturulur.Typically, XAML namescopes in WPFWPF managed code are created when loading the individual XAML page roots for a XAML application. XAML ad kapsamları programlama nesnesi olarak tarafından tanımlanan INameScope arabirim ve ayrıca pratik sınıfı tarafından uygulanan NameScope.XAML namescopes as the programming object are defined by the INameScope interface and are also implemented by the practical class NameScope.

Yüklenen XAML uygulamaları içindeki ad kapsamlarıNamescopes in Loaded XAML Applications

Daha geniş programlama veya bilgisayar bilimi bağlamı programlama kavramları, genellikle benzersiz bir kimlik veya bir nesneye erişmek için kullanılan ad ilkesini içerir.In a broader programming or computer science context, programming concepts often include the principle of a unique identifier or name that can be used to access an object. Tanımlayıcıları veya adlarını kullanan sistemleri için sınırlar içinde isim alanı tanımlayan bir nesne adının isteniyorsa hangi işlemin veya teknik arama veya adları tanımlamanın benzersizlik; burada görüntülerle zorlanır sınırlar.For systems that use identifiers or names, the namescope defines the boundaries within which a process or technique will search if an object of that name is requested, or the boundaries wherein uniqueness of identifying names is enforced. Bu ilkeler için XAML ad kapsamları true.These general principles are true for XAML namescopes. Sayfa yüklendiğinde, WPF XAML ad kapsamları XAML sayfası için kök öğesi oluşturulur.In WPF, XAML namescopes are created on the root element for a XAML page when the page is loaded. Sayfa kökte başlayan XAML sayfası içinde belirtilen her ad için ilgili bir XAML isim alanı eklenir.Each name specified within the XAML page starting at the page root is added to a pertinent XAML namescope.

WPF XAML, sık kullanılan kök öğe olan öğeler içinde (gibi Page, ve Window) her zaman bir XAML isim alanı denetim.In WPF XAML, elements that are common root elements (such as Page, and Window) always control a XAML namescope. Bir öğe gibi FrameworkElement veya FrameworkContentElement sayfanın biçimlendirmede, kök öğe bir XAMLXAML işlemcisi ekler bir Page örtük olarak kök böylece Page çalışma XAML isim alanı sağlayabilir.If an element such as FrameworkElement or FrameworkContentElement is the root element of the page in markup, a XAMLXAML processor adds a Page root implicitly so that the Page can provide a working XAML namescope.

Not

WPF yapı eylemleri XAML isim alanı XAML üretim için yoksa bile oluşturmak Name veya x:Name öznitelikleri herhangi bir öğe üzerinde tanımlanan XAMLXAML biçimlendirme.WPF build actions create a XAML namescope for a XAML production even if no Name or x:Name attributes are defined on any elements in the XAMLXAML markup.

Aynı adı iki kez herhangi XAML isim alanı içinde kullanmaya çalışırsa, bir özel durum oluşturulur.If you try to use the same name twice in any XAML namescope, an exception is raised. WPF arka plan kod ve derlenmiş bir uygulamanın parçası olan XAML için özel durum derleme zamanında WPF yapı eylemleri tarafından oluşturulan sınıf sayfası için ilk biçimlendirmesi derleme sırasında oluştururken oluşturulur.For WPF XAML that has code-behind and is part of a compiled application, the exception is raised at build time by WPF build actions, when creating the generated class for the page during the initial markup compile. XAML yüklendiğinde bir yapı eylemi tarafından biçimlendirme derlenmiş değil XAML için XAML isim alanı sorunlarıyla ilgili özel durumlar ortaya.For XAML that is not markup-compiled by any build action, exceptions related to XAML namescope issues might be raised when the XAML is loaded. XAML tasarımcıları tasarım zamanında XAML isim alanı sorunları tahmin.XAML designers might also anticipate XAML namescope issues at design time.

Çalışma zamanı nesne ağaçları nesneler eklemeAdding Objects to Runtime Object Trees

XAML ayrıştırılır şu anda bir WPF XAML isim alanı oluşturulup tanımlı zaman birazdan temsil eder.The moment that XAML is parsed represents the moment in time that a WPF XAML namescope is created and defined. Bir nesne bir nesne ağacına bir noktada ağacı üretilen XAML ayrıştırıldığında sonra zamanında eklerseniz bir Name veya x:Name yeni bir nesne değeri XAML isim alanı bilgileri otomatik olarak güncelleştirilmez.If you add an object to an object tree at a point in time after the XAML that produced that tree was parsed, a Name or x:Name value on the new object does not automatically update the information in a XAML namescope. XAML yüklendikten sonra bir WPF XAML isim alanı bir nesne için bir ad eklemek için uygun uygulanması çağrı RegisterName XAML isim alanı tanımlar nesnede olduğu genellikle XAML sayfası kök.To add a name for an object into a WPF XAML namescope after XAML is loaded, you must call the appropriate implementation of RegisterName on the object that defines the XAML namescope, which is typically the XAML page root. Adı kayıtlı değilse, eklenen nesne adına göre yöntemlerle gibi başvurulamaz FindName, ve animasyon hedefleme için bu adı kullanamazsınız.If the name is not registered, the added object cannot be referenced by name through methods such as FindName, and you cannot use that name for animation targeting.

Uygulama geliştiricilerinin en yaygın bir senaryo, kullanmasıdır RegisterName sayfasının geçerli kökündeki XAML isim alanı içine adlarını kaydetmek için.The most common scenario for application developers is that you will use RegisterName to register names into the XAML namescope on the current root of the page. RegisterName Bu hedef nesneler için animasyonları film şeritleri için önemli bir senaryo parçasıdır.RegisterName is part of an important scenario for storyboards that target objects for animations. Daha fazla bilgi için bkz: film şeritleri genel bakış.For more information, see Storyboards Overview.

Çağırırsanız RegisterName çağrısı yaptığını sanki XAML isim alanı tanımlayan nesnesi başka bir nesnede adı hala çağıran nesne içinde tutulur XAML isim alanı için kayıtlı RegisterName nesnesi tanımlayarak XAML isim alanı üzerinde.If you call RegisterName on an object other than the object that defines the XAML namescope, the name is still registered to the XAML namescope that the calling object is held within, as if you had called RegisterName on the XAML namescope defining object.

XAML ad kapsamları koduXAML Namescopes in Code

Oluşturun ve ardından kodda XAML ad kapsamları kullanın.You can create and then use XAML namescopes in code. API'ler ve kavramları XAML isim alanı oluşturmada yer alan bir saf kod kullanımı için bile aynı olduğu için XAML İşlemci WPFWPF XAML kendisini işlerken bu API'ları ve kavramları kullanır.The APIs and the concepts involved in XAML namescope creation are the same even for a pure code usage, because the XAML processor for WPFWPF uses these APIs and concepts when it processes XAML itself. Kavramlar ve API çoğunlukla genellikle XAML'de kısmen veya tamamen tanımlanan bir nesne ağacına içinde ada göre nesneleri bulmak bölümlemeye amacıyla mevcut.The concepts and API exist mainly for the purpose of being able to find objects by name within an object tree that is typically defined partially or entirely in XAML.

Program aracılığıyla oluşturulan uygulamaları için ve yüklenen XAML değil, XAML isim alanı tanımlayan nesnesi uygulamalıdır INameScope, veya bir FrameworkElement veya FrameworkContentElement XAML isim alanı oluşturulmasını desteklemek için türetilmiş sınıf, kendi örnekleri.For applications that are created programmatically, and not from loaded XAML, the object that defines a XAML namescope must implement INameScope, or be a FrameworkElement or FrameworkContentElement derived class, in order to support creation of a XAML namescope on its instances.

Ayrıca, değil yüklenen ve XAML processor tarafından işlenen herhangi bir öğe için nesne için XAML isim alanı oluşturulamadı veya varsayılan olarak başlatıldı.Also, for any element that is not loaded and processed by a XAML processor, the XAML namescope for the object is not created or initialized by default. Açıkça adlarına sonradan kaydetmek istediğiniz herhangi bir nesne için yeni bir XAML isim alanı oluşturmanız gerekir.You must explicitly create a new XAML namescope for any object that you intend to register names into subsequently. XAML isim alanı oluşturmak için statik çağırın SetNameScope yöntemi.To create a XAML namescope, you call the static SetNameScope method. Olarak sahip olacağını nesnesi belirtin dependencyObject parametresi ve yeni bir NameScope Oluşturucusu araması olarak value parametresi.Specify the object that will own it as the dependencyObject parameter, and a new NameScope constructor call as the value parameter.

Nesne olarak sağladıysanız dependencyObject için SetNameScope değil bir INameScope uygulaması, FrameworkElement veya FrameworkContentElement, arama RegisterName tüm alt öğeleri hiçbir etkisi olmaz.If the object provided as dependencyObject for SetNameScope is not a INameScope implementation, FrameworkElement or FrameworkContentElement, calling RegisterName on any child elements will have no effect. Yeni XAML isim alanı açıkça oluşturmak başarısız olursa, ardından çağrılar RegisterName bir özel durum oluşturacak.If you fail to create the new XAML namescope explicitly, then calls to RegisterName will raise an exception.

Code XAML isim alanı API'lerini kullanarak bir örnek için bkz: ad kapsamı tanımlama.For an example of using XAML namescope APIs in code, see Define a Name Scope.

XAML ad kapsamları stilleri ve şablonlarıXAML Namescopes in Styles and Templates

Stilleri ve şablonlar WPFWPF yeniden kullanmak ve içeriği kolay bir şekilde yeniden yeteneği sağlar.Styles and templates in WPFWPF provide the ability to reuse and reapply content in a straightforward way. Ancak, stil ve Şablonlar ayrıca öğeleri şablon düzeyinde tanımlanan XAML adlarıyla içerebilir.However, styles and templates might also include elements with XAML names defined at the template level. Aynı şablon bir sayfa birden çok kez kullanılabilir.That same template might be used multiple times in a page. Bu nedenle, kendi XAML ad kapsamları, burada stil veya şablon uygulanan herhangi bir nesne ağacındaki konumdan bağımsız stilleri ve şablonları tanımlayın.For this reason, styles and templates both define their own XAML namescopes, independent of whatever location in an object tree where the style or template is applied.

Aşağıdaki örnek göz önünde bulundurun:Consider the following example:

<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ı şablonu için iki farklı düğmeler uygulanır.Here, the same template is applied to two different buttons. Şablonları ayrık XAML ad kapsamları değilse TheBorder şablonda kullanılan adın XAML isim alanı içinde bir ad çakışması neden.If templates did not have discrete XAML namescopes, the TheBorder name used in the template would cause a name collision in the XAML namescope. Şablonun her örneklemesi kendi XAML isim alanı sahiptir, bu nedenle bu örnekte her örneklenen şablonun XAML isim alanı tam olarak bir ad içerecektir.Each instantiation of the template has its own XAML namescope, so in this example each instantiated template's XAML namescope would contain exactly one name.

Çoğunlukla film şeritleri bölümlerini atanan belirli adları böylece stilleri de kendi XAML isim alanı tanımlar.Styles also define their own XAML namescope, mostly so that parts of storyboards can have particular names assigned. Şablon denetim özelleştirme bir parçası olarak yeniden tanımlandı olsa bile bu adlar, bu adı öğeleri hedeflediğini denetim belirli davranışları etkinleştirin.These names enable control specific behaviors that will target elements of that name, even if the template was re-defined as part of control customization.

Nedeniyle ayrı XAML ad kapsamları bir şablonda adlandırılmış öğeleri bulma, bir oluşturulmamış bir sayfa öğesinde adlı bulma değerinden daha zorlu olur.Because of the separate XAML namescopes, finding named elements in a template is more challenging than finding a non-templated named element in a page. İlk alarak uygulanan şablon belirlemek gereken Template şablon uygulanan burada denetimin özellik değeri.You first need to determine the applied template, by getting the Template property value of the control where the template is applied. Ardından, şablon sürümü çağıran FindName, şablon ikinci parametre olarak uygulandığı denetimi geçirme.Then, you call the template version of FindName, passing the control where the template was applied as the second parameter.

Bir denetim yazar ve uygulanan şablon öğesinde adlı belirli bir denetim tarafından tanımlanan bir davranış için hedef olduğu bir kural oluşturmak, kullanabileceğiniz GetTemplateChild denetim uygulama kodunuzdan yöntemi.If you are a control author and you are generating a convention where a particular named element in an applied template is the target for a behavior that is defined by the control itself, you can use the GetTemplateChild method from your control implementation code. GetTemplateChild Yöntem korunur, böylece yalnızca denetim yazarı erişimi vardır.The GetTemplateChild method is protected, so only the control author has access to it.

Bir şablon ve burada şablonun için XAML isim alanı almak için gerek içinde çalışıyorsanız, değerini alın TemplatedParentve ardından arama FindName vardır.If you are working from within a template, and need to get to the XAML namescope where the template is applied, get the value of TemplatedParent, and then call FindName there. Şablonu içindeki çalışma örneği olay işleyicisinin uygulaması yazma varsa, uygulanan bir şablonda bir öğeden olay burada gerçekleştirilecektir olacaktır.An example of working within the template would be if you are writing the event handler implementation where the event will be raised from an element in an applied template.

FrameworkElement sahip FindName, RegisterName ve UnregisterName yöntemleri.FrameworkElement has FindName, RegisterName and UnregisterName methods. Bu yöntemleri çağırmak nesne XAML isim alanı sahipse, ilgili XAML isim alanı yöntemlerin içine yöntemlerini çağırın.If the object you call these methods on owns a XAML namescope, the methods call into the methods of the relevant XAML namescope. Aksi takdirde, üst öğenin XAML isim alanı sahibi ve XAML isim alanı bulunana kadar yinelemeli olarak bu işlem devam görmek için kontrol edilir (XAML işlemci davranışı nedeniyle var bir XAML isim alanı kökünde olması garanti).Otherwise, the parent element is checked to see if it owns a XAML namescope, and this process continues recursively until a XAML namescope is found (because of the XAML processor behavior, there is guaranteed to be a XAML namescope at the root). FrameworkContentElement özel durum ile benzer davranışları sahip, hiçbir FrameworkContentElement hiç XAML isim alanı sahibi.FrameworkContentElement has analogous behaviors, with the exception that no FrameworkContentElement will ever own a XAML namescope. Yöntemleri mevcut FrameworkContentElement çağrıları sonunda çok iletilebilir böylece bir FrameworkElement üst öğesi.The methods exist on FrameworkContentElement so that the calls can be forwarded eventually to a FrameworkElement parent element.

SetNameScope var olan bir nesne için yeni bir XAML isim alanı eşlemek için kullanılır.SetNameScope is used to map a new XAML namescope to an existing object. Çağırabilirsiniz SetNameScope birden çok kez sıfırlama veya XAML temizlemek için isim alanı değildir, ancak, ortak kullanım.You can call SetNameScope more than once in order to reset or clear the XAML namescope, but that is not a common usage. Ayrıca, GetNameScope koddan genellikle kullanılmaz.Also, GetNameScope is not typically used from code.

XAML isim alanı uygulamalarıXAML Namescope Implementations

Aşağıdaki sınıflar uygulama INameScope doğrudan:The following classes implement INameScope directly:

ResourceDictionary XAML adları veya ad kapsamları kullanmaz; bir sözlük uygulaması olduğu için bunun yerine, anahtarları kullanır.ResourceDictionary does not use XAML names or namescopes ; it uses keys instead, because it is a dictionary implementation. Yalnızca neden ResourceDictionary uygulayan INameScope true XAML isim alanı arasında ayrım açıklamak yardımcı özel durumlar kullanıcı kodu oluşturabilir ve nasıl olduğu bir ResourceDictionary anahtarları, işler ve ayrıca XAML ad kapsamları için uygulanmaz güvence altına almak için bir ResourceDictionary üst öğeler tarafından.The only reason that ResourceDictionary implements INameScope is so it can raise exceptions to user code that help clarify the distinction between a true XAML namescope and how a ResourceDictionary handles keys, and also to assure that XAML namescopes are not applied to a ResourceDictionary by parent elements.

FrameworkTemplate ve Style uygulamak INameScope açık arabirim tanımları aracılığıyla.FrameworkTemplate and Style implement INameScope through explicit interface definitions. Açık uygulamaları bu XAML ad kapsamları üzerinden zaman erişilen standart olarak davranmasına izin INameScope XAML ad kapsamları nasıl bildirilir olduğu arabirimi tarafından WPFWPF iç işlemler.The explicit implementations allow these XAML namescopes to behave conventionally when they are accessed through the INameScope interface, which is how XAML namescopes are communicated by WPFWPF internal processes. Ancak açık arabirim tanımları geleneksel API yüzeyi parçası olmayan FrameworkTemplate ve Style, nadiren çağırmanız gerekir çünkü INameScope yöntemlere FrameworkTemplate ve Style doğrudan ve bunun yerine diğer API kullanır gibi GetTemplateChild.But the explicit interface definitions are not part of the conventional API surface of FrameworkTemplate and Style, because you seldom need to call the INameScope methods on FrameworkTemplate and Style directly, and instead would use other API such as GetTemplateChild.

Aşağıdaki sınıflar kullanarak kendi XAML isim alanı tanımlayın System.Windows.NameScope yardımcı sınıfı ve XAML isim alanı uygulaması bağlanma NameScope.NameScope özelliği eklenmiş:The following classes define their own XAML namescope, by using the System.Windows.NameScope helper class and connecting to its XAML namescope implementation through the NameScope.NameScope attached property:

Ayrıca Bkz.See Also

WPF XAML için XAML Ad Alanları ve Ad Alanı EşlemesiXAML Namespaces and Namespace Mapping for WPF XAML
x:Name Yönergesix:Name Directive