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 namescope adlarında bir nesne ağacında nesnelerin XAML tanımlı adlarını ve örnek eşdeğerlerine arasındaki ilişkileri kurmak 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, bir XAML uygulaması için tek tek XAML sayfa yükleme 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 tarafından tanımlanan INameScope arabirim ve ayrıca pratik bir 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çinde ad kapsamlarıNamescopes in Loaded XAML Applications

Programlama Kavramları, genellikle daha geniş programlama veya bilgisayar bilimi bağlam benzersiz tanımlayıcısı 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ı kullanan sistemler için namescope sınırlar içinde tanımlar. Bu ada sahip bir nesne istenirse, bir işlem veya teknik arar veya adları tanımlama 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ı doğrudur.These general principles are true for XAML namescopes. Sayfa yüklendiğinde XAML sayfası için kök öğesinde, WPF XAML ad kapsamları oluşturulur.In WPF, XAML namescopes are created on the root element for a XAML page when the page is loaded. Başlangıç sayfası kök dizininde XAML sayfa içinde belirtilen her ad için ilgili bir XAML namescope eklenir.Each name specified within the XAML page starting at the page root is added to a pertinent XAML namescope.

WPF XAML, ortak kök öğeleri olan öğeler de (gibi Page, ve Window) her zaman bir XAML namescope 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 kök öğe işaretleme, sayfanın bir XAMLXAML işlemci ekler bir Page örtük olarak kök böylece Page çalışma XAML namescope 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 namescope XAML üretim için bile hiçbir oluşturma Name veya x:Name tüm öğelerde tanımlı öznitelikleri 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.

Tüm XAML namescope iki kez aynı adı kullanmaya çalışırsanız, bir özel durum oluşturulur.If you try to use the same name twice in any XAML namescope, an exception is raised. WPF derlenmiş bir uygulamanın parçası olan arka plan kod ve XAML için özel durum oluşturma zamanında WPF yapı eylemleri tarafından oluşturulan sınıfın sayfa için ilk biçimlendirme 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 olmayan herhangi bir derleme işlem biçimlendirme derlenmiş XAML için XAML namescope sorunlarıyla ilgili özel durum harekete geçirilen.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 namescope 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 WPF XAML namescope oluşturup tanımlı zaman içinde bir ana temsil eder.The moment that XAML is parsed represents the moment in time that a WPF XAML namescope is created and defined. Bir nesne için bir noktada bir nesne ağacının o ağaç üretilen XAML ayrıştırıldığında küpte sonra zaman içinde eklerseniz bir Name veya x:Name değeri yeni bir nesne üzerinde bir XAML namescope 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 namescope bir nesne için bir ad eklemek için uygun uygulama çağrı RegisterName XAML namescope tanımlayan nesne 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öntemleri gibi başvurulamaz FindName, ve animasyon hedeflemek 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.

Olduğunu, en yaygın bir senaryodur uygulama geliştiricileri için RegisterName adları geçerli sayfayı kökünde XAML namescope kaydedilecek.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 animasyon 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 görsel taslaklara genel bakış.For more information, see Storyboards Overview.

Eğer RegisterName adında gibi XAML namescope tanımlayan nesnesi başka bir nesne üzerinde adı hala çağrı nesnesi içinde tutulan XAML namescope kayıtlı RegisterName tanımlayan nesne XAML namescope ü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.

Kod içinde XAML ad kapsamlarıXAML 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 namescope oluşturmada yer alan bir saf kod kullanımı için bile aynı olduğu için XAML İşlemci WPFWPF XAML kendisini işlediğinde, bu API'leri 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 nesneler genellikle kısmen veya tamamen XAML içinde tanımlanmış bir nesne ağacının içinde adıyla bulabilme 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 ve yüklenen XAML yerine, XAML namescope tanımlayan nesne gerçekleyebilmeli INameScope, ya da bir FrameworkElement veya FrameworkContentElement türetilmiş sınıf, XAML namescope oluşturulmasını desteklemek için ö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, XAML işlemcisi tarafından işlenen değil yüklenen ve herhangi bir öğe için nesne için XAML namescope değil oluşturulduğunda veya varsayılan olarak başlatılır.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 namescope oluşturmanız gerekir.You must explicitly create a new XAML namescope for any object that you intend to register names into subsequently. XAML namescope oluşturmak için statik çağrı SetNameScope yöntemi.To create a XAML namescope, you call the static SetNameScope method. Olarak kendi nesne belirtin dependencyObject parametresi ve yeni bir NameScope oluşturucu çağrısı 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ğlanmışsa dependencyObject için SetNameScope değil bir INameScope uygulaması FrameworkElement veya FrameworkContentElementçağırarak 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 namescope açıkça oluşturmak başarısız olursa, ardından için çağırdığı RegisterName bir özel durum oluşturacak.If you fail to create the new XAML namescope explicitly, then calls to RegisterName will raise an exception.

Kodda XAML namescope API'leri 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 basit bir şekilde yeniden olanağı sunar.Styles and templates in WPFWPF provide the ability to reuse and reapply content in a straightforward way. Ancak, stilleri ve şablonları öğeleri şablon düzeyinde tanımlanan XAML adlarla de bulunabilir.However, styles and templates might also include elements with XAML names defined at the template level. Bu aynı şablonu bir sayfada birden çok kez kullanılabilir.That same template might be used multiple times in a page. Bu nedenle, kendi XAML ad kapsamları, stil veya şablonun uygulandığı herhangi bir nesne ağacında 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ı, yoksa TheBorder ad şablonunda kullanılan bir ad çakışması XAML namescope 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. Şablon her örneğinin kendi XAML namescope bulunduğundan bu örnekte, adı tam olarak bir her örneklenen şablonun XAML namescope 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.

Böylece görsel Taslaklar bölümlerini atanan belirli adları çoğunlukla olabilir stilleri, ayrıca kendi XAML namescope tanımlayın.Styles also define their own XAML namescope, mostly so that parts of storyboards can have particular names assigned. Şablon denetimi özelleştirme bir parçası olarak yeniden tanımlandı olsa bile bu adlar öğeleri, bu adı hedefleyen 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ı, şablonda adlandırılmış öğeleri bulma bir oluşturulmamış bir sayfa öğesinde adlı bulma değerinden daha zordur.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. Öncelikle uygulanan şablon alarak belirleyin gerekir Template burada şablonun uygulandığı 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ünü çağırmanızı FindName, ikinci parametre olarak şablonun uygulandığı denetimin 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 bir şablon öğesinde adlı belirli bir denetim tarafından tanımlanan bir davranış için hedef olduğu bir kuralı ürettiğini kullanabileceğiniz GetTemplateChild denetimi uygulama kodunuzu 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ın erişimi olur.The GetTemplateChild method is protected, so only the control author has access to it.

Bir şablon ve şablonun uygulandığı için XAML namescope almaya gerek içinde çalıştığınız, değerini almak TemplatedParentve sonra çağrı 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. Şablon içinde çalışan bir örnek olay işleyicisinin uygulaması yazıyorsanız, uygulanan bir şablonda bir öğeden olayın nerede 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 namescope sahipse, ilgili XAML namescope yöntemlere yöntemleri ç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 namescope aittir ve bu işlem, XAML namescope bulunana kadar yinelemeli olarak devam eder görmek için denetlenir (XAML işlemci davranışı nedeniyle garanti bir XAML namescope kökünde olacak şekilde).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ışlara sahip, hiçbir FrameworkContentElement hiç olmadığı kadar XAML namescope hakimi olursunuz.FrameworkContentElement has analogous behaviors, with the exception that no FrameworkContentElement will ever own a XAML namescope. Yöntemleri üzerinde mevcut FrameworkContentElement çağrıları sonunda iletilebilir böylece bir FrameworkElement üst öğe.The methods exist on FrameworkContentElement so that the calls can be forwarded eventually to a FrameworkElement parent element.

SetNameScope Varolan bir nesneye yeni bir XAML namescope 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 namescope değildir, ancak, bir 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 Namescope uygulamalarıXAML Namescope Implementations

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

ResourceDictionary XAML adı veya ad kapsamları kullanmaz; Sözlük uygulamasını 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 için doğru bir XAML namescope arasındaki ayrımı daha açıklayıcı özel durum kullanıcı kodunda oluşturabilir ve nasıl 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ı ile ne zaman eriştiği standart olarak davranmasına izin ver INameScope XAML ad kapsamları nasıl iletildiği olan 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üzeyinin parçası olmayan FrameworkTemplate ve Stylenadiren çağırmanız gerekir çünkü INameScope yöntemlerde FrameworkTemplate ve Style doğrudan ve bunun yerine diğer API'sini kullanmanız gerekir 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 namescope tanımladığınız System.Windows.NameScope yardımcı sınıf ve XAML namescope uygulaması bağlanma NameScope.NameScope ekli özellik: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