WPF XAML 名前スコープWPF XAML Namescopes

XAML 名前スコープは、XAML で定義されているオブジェクトを識別する概念です。XAML namescopes are a concept that identifies objects that are defined in XAML. XAML 名前スコープ内の名前は、オブジェクト ツリーで XAML 定義のオブジェクトの名前と、対応するインスタンス間の関係を確立するために使用できます。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. 通常、XAML 名前スコープWPFWPFXAML アプリケーションのルート個々 の XAML ページの読み込みとマネージ コードが作成されます。Typically, XAML namescopes in WPFWPF managed code are created when loading the individual XAML page roots for a XAML application. プログラミング オブジェクトとしての XAML 名前スコープが定義されている、INameScopeインターフェイスし、実際のクラスによって実装もNameScopeします。XAML namescopes as the programming object are defined by the INameScope interface and are also implemented by the practical class NameScope.

読み込まれた XAML アプリケーションにおける名前スコープNamescopes in Loaded XAML Applications

プログラミングの概念より広範なプログラミングまたはコンピューター サイエンスのコンテキストでは、一意の識別子またはオブジェクトへのアクセスに使用できる名前の原則多くの場合があります。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. 内の境界を定義する名前スコープを識別子または名前を使用するシステム プロセスまたは手法は、その名前のオブジェクトが要求された場合に検索がまたは識別名の一意性を強制する、境界。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. これらの一般的な原則は、XAML 名前スコープの場合は true です。These general principles are true for XAML namescopes. ページが読み込まれるときに、WPF では、XAML ページのルート要素の XAML 名前スコープが作成されます。In WPF, XAML namescopes are created on the root element for a XAML page when the page is loaded. ページのルートから始まる XAML ページ内で指定した名前は、関連する XAML 名前スコープに追加されます。Each name specified within the XAML page starting at the page root is added to a pertinent XAML namescope.

WPF XAML、共通のルート要素である要素に (などPage、およびWindow) 常に XAML 名前スコープを制御します。In WPF XAML, elements that are common root elements (such as Page, and Window) always control a XAML namescope. 場合など、要素FrameworkElementまたはFrameworkContentElementはマークアップでは、ページのルート要素です、XAMLXAMLプロセッサを追加、Page暗黙的にルートように、Page作業の XAML 名前スコープを指定できます。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.

注意

XAML の運用環境用の XAML 名前スコープを作成しない場合でも WPF ビルド アクションNameまたはx:Name属性の定義内の各要素には、XAMLXAMLマークアップ。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.

任意の XAML 名前スコープ内で 2 回、同じ名前を使用しようとすると、例外が発生します。If you try to use the same name twice in any XAML namescope, an exception is raised. 分離コードがあり、コンパイル済みアプリケーションの一部を WPF XAML では、例外がビルド時に、WPF ビルド アクションによって、初期のマークアップのコンパイル時に、ページに対して生成されたクラスを作成するときに発生します。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、XAML が読み込まれるときに XAML 名前スコープの問題に関連する例外を発生する可能性があります。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 デザイナーでは、デザイン時に XAML 名前スコープの問題も予測可能性があります。XAML designers might also anticipate XAML namescope issues at design time.

オブジェクトをランタイム オブジェクト ツリーに追加します。Adding Objects to Runtime Object Trees

XAML が解析される時点では、WPF XAML 名前スコープを作成および定義の時点を表します。The moment that XAML is parsed represents the moment in time that a WPF XAML namescope is created and defined. オブジェクト ツリーの時点にそのツリーを生成した XAML が解析された後でオブジェクトを追加した場合、Nameまたはx:Name新しいオブジェクトの値が XAML 名前スコープ内の情報を自動的に更新されません。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 が読み込まれた後に、WPF XAML 名前スコープにオブジェクトの名前を追加するには、適切な実装を呼び出す必要がありますRegisterName通常を XAML 名前スコープを定義するオブジェクト、XAML ページのルート。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. 名前が登録されていない場合追加されたオブジェクト名を使って参照できませんメソッドなどFindName、およびアニメーションのターゲットの名前を使用することはできません。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.

アプリケーション開発者向けの最も一般的なシナリオが使用するRegisterNameページの現在のルートの XAML 名前スコープに名前を登録します。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 ストーリー ボードの重要なシナリオの一部のアニメーションには、そのターゲット オブジェクト。RegisterName is part of an important scenario for storyboards that target objects for animations. 詳細については、次を参照してください。ストーリー ボードの概要します。For more information, see Storyboards Overview.

呼び出す場合RegisterNameXAML 名前スコープを定義するオブジェクト以外のオブジェクトの名前が登録されたまま、呼び出し元のオブジェクトが保持されている XAML 名前スコープにするを呼び出した場合とRegisterNameでオブジェクトを定義する XAML 名前スコープ。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 名前スコープXAML Namescopes in Code

作成し、コードで XAML 名前スコープを使用できます。You can create and then use XAML namescopes in code. Api と XAML 名前スコープの作成に関連する概念は純粋なコードの使用状況の場合でも同じため、XAML プロセッサをWPFWPFXAML 自体の処理時に、これらの Api と概念を使用します。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. 概念と API は、XAML では部分的または完全は定義された通常オブジェクト ツリー内で名前によってオブジェクトを検索できるため、主に存在します。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.

プログラムで作成したアプリケーションと読み込まれた XAML からではなく、XAML 名前スコープを定義するオブジェクトを実装する必要がありますINameScope、でも、FrameworkElementまたはFrameworkContentElementの XAML 名前スコープの作成をサポートするために派生クラスで、インスタンス。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.

また、任意の要素の読み込みおよび XAML プロセッサで処理されないが、オブジェクトの XAML 名前スコープは作成または既定で初期化します。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. 明示的に名前をその後登録をする任意のオブジェクトの新しい XAML 名前スコープを作成する必要があります。You must explicitly create a new XAML namescope for any object that you intend to register names into subsequently. XAML 名前スコープを作成するには、静的なを呼び出すSetNameScopeメソッド。To create a XAML namescope, you call the static SetNameScope method. それを所有するオブジェクトを指定、dependencyObjectパラメーター、および新しいNameScopeとしてコンス トラクターの呼び出し、valueパラメーター。Specify the object that will own it as the dependencyObject parameter, and a new NameScope constructor call as the value parameter.

として、オブジェクトが指定されている場合dependencyObjectSetNameScopeでない、INameScope実装、FrameworkElementまたはFrameworkContentElementを呼び出すと、RegisterNameですべての子要素は影響しません。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. 新しい XAML 名前スコープを明示的に作成に失敗した場合に呼び出してRegisterNameで例外が発生します。If you fail to create the new XAML namescope explicitly, then calls to RegisterName will raise an exception.

コードでの XAML 名前スコープの Api を使用しての例は、次を参照してください。名前スコープを定義するします。For an example of using XAML namescope APIs in code, see Define a Name Scope.

スタイルとテンプレートで XAML 名前スコープXAML Namescopes in Styles and Templates

スタイルとテンプレートでWPFWPF再利用し、簡単な方法でコンテンツを再適用する機能を提供します。Styles and templates in WPFWPF provide the ability to reuse and reapply content in a straightforward way. ただし、スタイルとテンプレートもあります要素テンプレート レベルで定義されている XAML 名。However, styles and templates might also include elements with XAML names defined at the template level. ページで同じテンプレートを複数回使用可能性があります。That same template might be used multiple times in a page. このため、スタイルとテンプレートがスタイルまたはテンプレートが適用される任意の場所、オブジェクト ツリー内の独立した独自の XAML 名前スコープを定義します。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.

次に例を示します。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>

ここでは、同じテンプレートでは、2 つの異なるボタンに適用されます。Here, the same template is applied to two different buttons. テンプレートは個別の XAML 名前スコープを持っていなかった場合、 TheBorder XAML 名前スコープ内名前の競合が発生すると、テンプレートで使用される名前。If templates did not have discrete XAML namescopes, the TheBorder name used in the template would cause a name collision in the XAML namescope. テンプレートには、各インスタンスでは、独自の XAML 名前スコープを持つため、この例の場合、各インスタンス化されたテンプレートの XAML 名前スコープに、名前が 1 つだけ含まれます。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.

スタイルは、ストーリー ボードのパーツが割り当てられている特定の名前を持てるようにほとんどの場合も、独自の XAML 名前スコープを定義します。Styles also define their own XAML namescope, mostly so that parts of storyboards can have particular names assigned. これらの名前は、テンプレートをコントロールのカスタマイズの一部として再定義した場合でも、その名前の要素が対象とするコントロール固有の動作を有効にします。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.

により、別の XAML 名前スコープ、テンプレートの名前付き要素の検索はさらに、テンプレート化されていないページ内の要素をという名前の検索よりも大きな問題です。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. まず取得することで、テンプレートを適用したを決定する必要があります、Templateテンプレートが適用されているコントロールのプロパティ値。You first need to determine the applied template, by getting the Template property value of the control where the template is applied. 次のテンプレート バージョンを呼び出すFindNameテンプレートが 2 番目のパラメーターとして適用されたコントロールを渡します。Then, you call the template version of FindName, passing the control where the template was applied as the second parameter.

コントロールの作成者があり、コントロール自体で定義されている動作の対象の特定、適用されたテンプレート内の要素をという名前のある規則を生成している場合は使用できます、GetTemplateChildコントロールの実装コードからメソッド。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のみ、コントロールの作成者がアクセスするメソッドは保護されています。The GetTemplateChild method is protected, so only the control author has access to it.

テンプレート、および、テンプレートが適用されている XAML 名前スコープを取得する必要がある内から作業する場合の値を取得TemplatedParentを呼び出してFindNameがあります。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. テンプレート内での作業の例となります、イベント ハンドラーの実装を記述しているかどうか、適用されたテンプレート内の要素から、イベントの発生した場所。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 FindNameRegisterNameUnregisterNameメソッド。FrameworkElement has FindName, RegisterName and UnregisterName methods. これらのメソッドを呼び出すオブジェクトに XAML 名前スコープが所有している場合、メソッドは、関連する XAML 名前スコープのメソッドを呼び出します。If the object you call these methods on owns a XAML namescope, the methods call into the methods of the relevant XAML namescope. それ以外の場合、親要素をチェックして、XAML 名前スコープを所有しているかどうかは、XAML 名前スコープが見つかるまで、このプロセスは再帰的に (により XAML プロセッサの動作が保証されてルートにある XAML 名前スコープにする)。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 動作は、例外に似ていますがないFrameworkContentElementXAML 名前スコープを所有します。FrameworkContentElement has analogous behaviors, with the exception that no FrameworkContentElement will ever own a XAML namescope. メソッド上に存在FrameworkContentElement呼び出しが最終的に転送できるように、FrameworkElement親要素。The methods exist on FrameworkContentElement so that the calls can be forwarded eventually to a FrameworkElement parent element.

SetNameScope 既存のオブジェクトに新しい XAML 名前スコープをマップに使用されます。SetNameScope is used to map a new XAML namescope to an existing object. 呼び出すことができますSetNameScope2 回以上をリセットまたは、XAML をオフにするには名前スコープがするではありません一般的な使用方法。You can call SetNameScope more than once in order to reset or clear the XAML namescope, but that is not a common usage. また、GetNameScopeコードからは通常は使用されません。Also, GetNameScope is not typically used from code.

XAML 名前スコープの実装XAML Namescope Implementations

次は、実装をクラスINameScope直接。The following classes implement INameScope directly:

ResourceDictionary XAML 名や名前スコープ; を使用しません。使用してキー代わりに、ディクショナリの実装があるためです。ResourceDictionary does not use XAML names or namescopes ; it uses keys instead, because it is a dictionary implementation. 唯一の理由ResourceDictionary実装INameScopeが true の XAML 名前スコープの違いを明確にするユーザー コードに例外を発生させる可能性が方法と、ResourceDictionaryキーを処理および XAML 名前スコープに適用されないことを保証することも、ResourceDictionary親要素。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 Style実装INameScopeで明示的なインターフェイスを定義します。FrameworkTemplate and Style implement INameScope through explicit interface definitions. 明示的な実装を介してアクセスされるときに従来どおり動作するこれらの XAML 名前スコープを許可する、INameScopeインターフェイスとは、XAML 名前スコープをどのように伝達してWPFWPF内部プロセスです。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. 明示的なインターフェイスの定義は、従来の API サーフェスの一部ではないが、FrameworkTemplateStyleほとんどを呼び出す必要があるため、INameScopeメソッドFrameworkTemplateStyleを直接と代わりには他の API を使用など、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.

次のクラスを使用して、独自の XAML 名前スコープを定義する、System.Windows.NameScopeヘルパー クラスおよびその XAML 名前スコープの実装を通じてへの接続、NameScope.NameScope添付プロパティ。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:

関連項目See also