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; } }
public XamlSavedContext GetSavedContext(SavedContextType savedContextType) { // Ensure that we have a root namescope before cloning the stack ObjectWriterFrame topFrame = GetTopFrame(); if (topFrame.NameScopeDictionary == null) { topFrame.NameScopeDictionary = LookupNameScopeDictionary(topFrame); } // Clone the stack var newStack = new XamlContextStack <ObjectWriterFrame>(_stack, true); XamlSavedContext savedContext = new XamlSavedContext(savedContextType, this, newStack); return(savedContext); }
public ObjectWriterContext(XamlSavedContext savedContext, XamlObjectWriterSettings settings, INameScope rootNameScope, XamlRuntime runtime) : base(savedContext.SchemaContext) { INameScopeDictionary dictionary; this._stack = new XamlContextStack <ObjectWriterFrame>(savedContext.Stack, false); if (settings != null) { this._settings = settings.StripDelegates(); } this._runtime = runtime; this.BaseUri = savedContext.BaseUri; switch (savedContext.SaveContextType) { case SavedContextType.Template: dictionary = null; if (rootNameScope != null) { dictionary = rootNameScope as INameScopeDictionary; if (dictionary == null) { dictionary = new NameScopeDictionary(rootNameScope); } break; } dictionary = new NameScope(); break; case SavedContextType.ReparseValue: case SavedContextType.ReparseMarkupExtension: this._savedDepth = this._stack.Depth - 1; return; default: return; } this._stack.PushScope(); this._savedDepth = this._stack.Depth; this._stack.CurrentFrame.NameScopeDictionary = dictionary; this._stack.PushScope(); }
public XamlObjectWriterFactory(ObjectWriterContext context) { _savedContext = context.GetSavedContext(SavedContextType.Template); _parentSettings = context.ServiceProvider_GetSettings(); }