Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Framework / System / Windows / TemplateNameScope.cs / 1305600 / TemplateNameScope.cs
/****************************************************************************\
*
* File: TemplateNameScope.cs
*
* Used to store mapping information for names occuring
* within the template content section.
*
* Copyright (C) 2005 by Microsoft Corporation. All rights reserved.
*
\***************************************************************************/
using System;
using System.Diagnostics;
using MS.Internal;
using MS.Utility;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Collections;
using System.Windows.Markup;
namespace System.Windows
{
//+-----------------------------------------------------------------------------
//
// Class TemplateNameScope
//
// This class implements the name scope that is used for template content
// (i.e. that which is applied to each templated parent, not the template itself).
// During apply (except for FEF-based templates), this is the INameScope to which the BamlRecordReader
// calls. We take those opportunities to hook up FEs and FCEs (e.g.
// with the TemplatedParent pointer). After apply, this services
// FindName requests.
//
//+-----------------------------------------------------------------------------
internal class TemplateNameScope : INameScope
{
#region Constructors
// This constructor builds a name scope that just supports lookup.
// This is used for FEF-based templates.
internal TemplateNameScope(DependencyObject templatedParent)
: this( templatedParent, null, null )
{
}
internal TemplateNameScope(
DependencyObject templatedParent,
List affectedChildren,
FrameworkTemplate frameworkTemplate )
{
Debug.Assert(templatedParent == null || (templatedParent is FrameworkElement || templatedParent is FrameworkContentElement),
"Templates are only supported on FE/FCE containers.");
_affectedChildren = affectedChildren;
_frameworkTemplate = frameworkTemplate;
_templatedParent = templatedParent;
_isTemplatedParentAnFE = true;
}
#endregion Constructors
#region INameScope
///
/// Registers the name - element combination
///
/// Name of the element
/// Element where name is defined
void INameScope.RegisterName(string name, object scopedElement)
{
// We register FrameworkElements and FrameworkContentElements in FrameworkTemplate.cs
// Since we register them during object creation, we don't need to process it the second
// time it shows up.
if (!(scopedElement is FrameworkContentElement || scopedElement is FrameworkElement))
{
RegisterNameInternal(name, scopedElement);
}
}
internal void RegisterNameInternal(string name, object scopedElement)
{
FrameworkElement fe;
FrameworkContentElement fce;
Helper.DowncastToFEorFCE( scopedElement as DependencyObject,
out fe, out fce,
false /*throwIfNeither*/ );
int childIndex;
// First, though, do we actually have a templated parent? If not,
// then we'll just set the properties directly on the element
// (this is the serialization scenario).
if( _templatedParent == null )
{
if (_nameMap == null)
{
_nameMap = new HybridDictionary();
}
_nameMap[name] = scopedElement;
// No, we don't have a templated parent. Loop through
// the shared values (assuming this is an FE/FCE), and set them
// directly onto the element.
if( fe != null || fce != null )
{
SetTemplateParentValues( name, scopedElement );
}
}
// We have a templated parent, but is this not a FE/FCE?
else if (fe == null && fce == null)
{
// All we need to do is update the _templatedNonFeChildren list
Hashtable nonFeChildren = _templatedNonFeChildrenField.GetValue(_templatedParent);
if (nonFeChildren == null)
{
nonFeChildren = new Hashtable(1);
_templatedNonFeChildrenField.SetValue(_templatedParent, nonFeChildren);
}
nonFeChildren[name] = scopedElement;
}
// Otherwise, we need to hook this FE/FCE up to the template.
else
{
// Update the list on the templated parent of the named FE/FCEs.
_affectedChildren.Add(scopedElement as DependencyObject);
// Update the TemplatedParent, IsTemplatedParentAnFE, and TemplateChildIndex.
if( fe != null )
{
fe._templatedParent = _templatedParent;
fe.IsTemplatedParentAnFE = _isTemplatedParentAnFE;
childIndex = fe.TemplateChildIndex = (int)_frameworkTemplate.ChildIndexFromChildName[name];
}
else
{
fce._templatedParent = _templatedParent;
fce.IsTemplatedParentAnFE = _isTemplatedParentAnFE;
childIndex = fce.TemplateChildIndex = (int)_frameworkTemplate.ChildIndexFromChildName[name];
}
// Entries into the NameScope MUST match the location in the AffectedChildren list
Debug.Assert(_affectedChildren.Count == childIndex);
// Make updates for the Loaded/Unloaded event listeners (if they're set).
HybridDictionary templateChildLoadedDictionary = _frameworkTemplate._TemplateChildLoadedDictionary;
FrameworkTemplate.TemplateChildLoadedFlags templateChildLoadedFlags
= templateChildLoadedDictionary[ childIndex ] as FrameworkTemplate.TemplateChildLoadedFlags;
if( templateChildLoadedFlags != null )
{
if( templateChildLoadedFlags.HasLoadedChangedHandler || templateChildLoadedFlags.HasUnloadedChangedHandler )
{
BroadcastEventHelper.AddHasLoadedChangeHandlerFlagInAncestry((fe != null) ? (DependencyObject)fe : (DependencyObject)fce);
}
}
// Establish databinding instance data.
StyleHelper.CreateInstanceDataForChild(
StyleHelper.TemplateDataField,
_templatedParent,
(fe!=null) ? (DependencyObject)fe : (DependencyObject)fce,
childIndex,
_frameworkTemplate.HasInstanceValues,
ref _frameworkTemplate.ChildRecordFromChildIndex);
}
}
///
/// Unregisters the name - element combination
///
/// Name of the element
void INameScope.UnregisterName(string name)
{
Debug.Assert(false, "Should never be trying to unregister via this interface for templates");
}
///
/// Find the element given name
///
object INameScope.FindName(string name)
{
// _templatedParent is null if template.LoadContent() was responsible
if (_templatedParent != null)
{
FrameworkObject fo = new FrameworkObject(_templatedParent);
Debug.Assert(fo.IsFE);
if (fo.IsFE)
{
return StyleHelper.FindNameInTemplateContent(fo.FE, name, fo.FE.TemplateInternal);
}
else
{
return null;
}
}
else
{
if (_nameMap == null || name == null || name == String.Empty)
return null;
return _nameMap[name];
}
}
#endregion INameScope
//+---------------------------------------------------------------------------------------------------------------
//
// SetTemplateParentValues
//
// This method takes the "template parent values" (those that look like local values in the template), which
// are ordinarily shared, and sets them as local values on the FE/FCE that was just created. This is used
// during serialization.
//
//+----------------------------------------------------------------------------------------------------------------
private void SetTemplateParentValues( string name, object element )
{
FrameworkTemplate.SetTemplateParentValues( name, element, _frameworkTemplate, ref _provideValueServiceProvider );
}
#region Data
// This is a HybridDictionary of Name->FE(FCE) mappings
private List _affectedChildren;
// This is the table of Name->NonFE mappings
private static UncommonField _templatedNonFeChildrenField = (UncommonField)StyleHelper.TemplatedNonFeChildrenField;
// The templated parent we're instantiating for
private DependencyObject _templatedParent;
// The template we're instantiating
private FrameworkTemplate _frameworkTemplate;
// Is templated parent an FE or an FCE?
private bool _isTemplatedParentAnFE;
ProvideValueServiceProvider _provideValueServiceProvider;
// This is a HybridDictionary of Name-Object maps
private HybridDictionary _nameMap;
#endregion Data
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- Timeline.cs
- IndexedSelectQueryOperator.cs
- DomainUpDown.cs
- AlgoModule.cs
- TextBox.cs
- InternalConfigHost.cs
- SyndicationItem.cs
- HttpPostedFileBase.cs
- WindowsTitleBar.cs
- PackageDigitalSignatureManager.cs
- CodeIdentifier.cs
- ProxyWebPartConnectionCollection.cs
- DataGridColumn.cs
- ToolStripDesignerAvailabilityAttribute.cs
- ReplyChannelAcceptor.cs
- QueryProcessor.cs
- BrushValueSerializer.cs
- OdbcRowUpdatingEvent.cs
- Floater.cs
- MailBnfHelper.cs
- SelfIssuedSamlTokenFactory.cs
- ReadOnlyCollectionBase.cs
- QilSortKey.cs
- ADMembershipUser.cs
- RotateTransform.cs
- DataBoundControl.cs
- Socket.cs
- ComboBoxAutomationPeer.cs
- XmlQualifiedName.cs
- ProcessThread.cs
- PagedDataSource.cs
- ConvertEvent.cs
- XmlException.cs
- ModelUIElement3D.cs
- ActivityExecutor.cs
- OrderedDictionary.cs
- ZipIOLocalFileBlock.cs
- EUCJPEncoding.cs
- IndicShape.cs
- BitmapVisualManager.cs
- BufferAllocator.cs
- XhtmlBasicValidationSummaryAdapter.cs
- PrintDialog.cs
- XPathChildIterator.cs
- ProcessModuleCollection.cs
- ToolStripDropTargetManager.cs
- ProxyHwnd.cs
- XmlSchemaException.cs
- FlowPanelDesigner.cs
- InsufficientExecutionStackException.cs
- ImageMetadata.cs
- AutomationElementIdentifiers.cs
- FileSystemWatcher.cs
- SymbolTable.cs
- RegistryDataKey.cs
- AssemblyBuilder.cs
- ALinqExpressionVisitor.cs
- SQLInt64Storage.cs
- SerializationHelper.cs
- HttpDictionary.cs
- IncrementalCompileAnalyzer.cs
- SqlRemoveConstantOrderBy.cs
- TextTrailingWordEllipsis.cs
- QilGenerator.cs
- LexicalChunk.cs
- XPathMultyIterator.cs
- RegistryPermission.cs
- WinFormsSecurity.cs
- ExeConfigurationFileMap.cs
- VerticalAlignConverter.cs
- TreeChangeInfo.cs
- DocumentPaginator.cs
- PathGradientBrush.cs
- TransactionChannel.cs
- Mappings.cs
- ProcessManager.cs
- DefaultAutoFieldGenerator.cs
- Rotation3D.cs
- DrawingAttributesDefaultValueFactory.cs
- HideDisabledControlAdapter.cs
- ZipIOLocalFileDataDescriptor.cs
- Pen.cs
- GPPOINT.cs
- AccessText.cs
- RegexEditorDialog.cs
- XmlTextEncoder.cs
- MachineKeyValidationConverter.cs
- XamlPointCollectionSerializer.cs
- CompilerScopeManager.cs
- WebHttpEndpoint.cs
- BinHexEncoding.cs
- XmlUtilWriter.cs
- _HeaderInfo.cs
- XamlInt32CollectionSerializer.cs
- SQLBoolean.cs
- FontWeightConverter.cs
- WebPartCloseVerb.cs
- Header.cs
- COM2PropertyDescriptor.cs
- TypeSystemHelpers.cs