public ObjectWriterContext(XamlSchemaContext schemaContext, XamlObjectWriterSettings settings, XAML3.INameScope rootNameScope, XamlRuntime runtime) : base(schemaContext) { _stack = new XamlContextStack <ObjectWriterFrame>(() => new ObjectWriterFrame()); XAML3.INameScopeDictionary rootNameScopeDictionary = null; if (rootNameScope == null) { #if TARGETTING35SP1 rootNameScopeDictionary = new NameScopeDictionary(new NameScope()); #else rootNameScopeDictionary = new NameScope(); #endif } else { rootNameScopeDictionary = rootNameScope as XAML3.INameScopeDictionary; if (rootNameScopeDictionary == null) { rootNameScopeDictionary = new NameScopeDictionary(rootNameScope); } } _stack.CurrentFrame.NameScopeDictionary = rootNameScopeDictionary; _stack.PushScope(); // put a blank sentinal frame on the stack. if (settings != null) { _settings = settings.StripDelegates(); } _runtime = runtime; _savedDepth = 0; }
public ObjectWriterContext(XamlSavedContext savedContext, XamlObjectWriterSettings settings, XAML3.INameScope rootNameScope, XamlRuntime runtime) : base(savedContext.SchemaContext) { _stack = new XamlContextStack <ObjectWriterFrame>(savedContext.Stack, false); if (settings != null) { _settings = settings.StripDelegates(); } _runtime = runtime; BaseUri = savedContext.BaseUri; // If the bottom of the stack is a (no XamlType) Value (reparse) then back-up onto it. // Otherwise add a blank frame to isolate template use from the saved context. switch (savedContext.SaveContextType) { case SavedContextType.Template: // Templates always need a root namescope, to isolate them from the rest of the doc XAML3.INameScopeDictionary rootNameScopeDictionary = null; if (rootNameScope == null) { #if TARGETTING35SP1 rootNameScopeDictionary = new NameScopeDictionary(new NameScope()); #else rootNameScopeDictionary = new NameScope(); #endif } else { rootNameScopeDictionary = rootNameScope as XAML3.INameScopeDictionary; if (rootNameScopeDictionary == null) { rootNameScopeDictionary = new NameScopeDictionary(rootNameScope); } } // Push an extra frame to ensure that the template NameScope is // not part of the saved context. Otherwise, the namescope // will hold things alive as long as the template is alive _stack.PushScope(); _savedDepth = _stack.Depth; _stack.CurrentFrame.NameScopeDictionary = rootNameScopeDictionary; _stack.PushScope(); break; case SavedContextType.ReparseValue: case SavedContextType.ReparseMarkupExtension: Debug.Assert(rootNameScope == null, "Cannot pass a new namescope in to a reparse context"); _savedDepth = _stack.Depth - 1; break; } }
private XAML3.INameScopeDictionary HuntAroundForARootNameScope(ObjectWriterFrame rootFrame) { Debug.Assert(rootFrame.Depth == 1); object inst = rootFrame.Instance; if (inst == null && rootFrame.XamlType.IsNameScope) { throw new InvalidOperationException(SR.Get(SRID.NameScopeOnRootInstance)); } XAML3.INameScopeDictionary nameScopeDictionary = null; nameScopeDictionary = inst as XAML3.INameScopeDictionary; if (nameScopeDictionary == null) { XAML3.INameScope nameScope = inst as XAML3.INameScope; if (nameScope != null) { nameScopeDictionary = new NameScopeDictionary(nameScope); } } // If the root instance isn't a name scope // then perhaps it designated a property as the name scope. if (nameScopeDictionary == null) { XamlType xamlType = rootFrame.XamlType; if (xamlType.UnderlyingType != null) { // Get the Name Scope Property (from attribute on the class) XamlMember nameScopeProperty = TypeReflector.LookupNameScopeProperty(xamlType); if (nameScopeProperty != null) { // Read the value of the property. If it is an object we are good. // if it is null create a stock name scope dictionary object and assign it back. XAML3.INameScope nameScope = (XAML3.INameScope)_runtime.GetValue(inst, nameScopeProperty, false); if (nameScope == null) { #if TARGETTING35SP1 nameScopeDictionary = new NameScopeDictionary(new NameScope()); #else nameScopeDictionary = new NameScope(); #endif _runtime.SetValue(inst, nameScopeProperty, nameScopeDictionary); } else { nameScopeDictionary = nameScope as XAML3.INameScopeDictionary; if (nameScopeDictionary == null) { nameScopeDictionary = new NameScopeDictionary(nameScope); } } } } } if (nameScopeDictionary == null && _settings != null && _settings.RegisterNamesOnExternalNamescope) { ObjectWriterFrame frameZero = (ObjectWriterFrame)rootFrame.Previous; nameScopeDictionary = frameZero.NameScopeDictionary; } // Otherwise we still need a namescope at the root of the parse // for our own usage. For IXamlNameResolver() to use. if (nameScopeDictionary == null) { #if TARGETTING35SP1 nameScopeDictionary = new NameScopeDictionary(new NameScope()); #else nameScopeDictionary = new NameScope(); #endif } rootFrame.NameScopeDictionary = nameScopeDictionary; return(nameScopeDictionary); }