public static void Load(Stream stream, object component) { DependencyObject dependencyObject = component as DependencyObject; NameScope nameScope = new NameScope(); if (dependencyObject != null) { NameScope.SetNameScope(dependencyObject, nameScope); } XmlReader xml = XmlReader.Create(stream); XamlXmlReader reader = new XamlXmlReader(xml); XamlObjectWriter writer = new XamlObjectWriter( new XamlSchemaContext(), new XamlObjectWriterSettings { RootObjectInstance = component, ExternalNameScope = nameScope, RegisterNamesOnExternalNamescope = true, XamlSetValueHandler = SetValue, }); while (reader.Read()) { writer.WriteNode(reader); } }
public void Parse(string input, string[] args = null) { var xxr = new XamlXmlReader(new StringReader(input), new XamlSchemaContext()); var graphReader = new XamlObjectWriter(xxr.SchemaContext); while (xxr.Read()) graphReader.WriteNode(xxr); var page = (Page)graphReader.Result; // Map our generators var g = new Generator(); g.Map<Page, PageGeneratorBlock>(); g.Map<Button, ButtonGeneratorBlock>(); g.Map<StackPanel, StackPanelGeneratorBlock>(); var doc = new HtmlDocument(); var html = doc.CreateElement("html"); g.Generate(html, page); // HTML5 Doc type doc.DocumentNode.AppendChild(doc.CreateComment("<!DOCTYPE html>")); doc.DocumentNode.AppendChild(html); doc.Save("test.htm"); var cssContents = g.GenerateStyles(page); File.WriteAllText("XamlCore.css", cssContents); }
public static object Load(System.Xaml.XamlReader reader) { XamlObjectWriter writer = new XamlObjectWriter( new XamlSchemaContext(), new XamlObjectWriterSettings { XamlSetValueHandler = SetValue, }); while (reader.Read()) { writer.WriteNode(reader); } object result = writer.Result; return result; }
public MainWindow() { InitializeComponent(); using (var reader = new XamlXmlReader("./Button.xaml")) using (var writer = new XamlXmlWriter(new FileStream("./Test.xaml", FileMode.Create), reader.SchemaContext)) { while (reader.Read()) { writer.WriteNode(reader); } } using (var reader = new XamlObjectReader(new Button())) using (var writer = new XamlObjectWriter(reader.SchemaContext)) { while (reader.Read()) { writer.WriteNode(reader); } var button = (Button)writer.Result; } using (var reader = new XamlXmlReader(new StringReader("<Button xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\">This is a button</Button>"))) using (var writer = new XamlObjectWriter(reader.SchemaContext)) { while (reader.Read()) { writer.WriteNode(reader); } var button = (Button)writer.Result; } var button1 = (Button)XamlServices.Load("./Button.xaml"); var button2 = XamlServices.Load(new XamlObjectReader(new Button())); var button3 = XamlServices.Load(new StringReader("<Button xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\">This is a button</Button>")); var button4 = XamlServices.Parse("<Button xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\">This is a button</Button>"); XamlServices.Save("./Test2.xaml", new Button()); //DispatcherObject methods, hidden from intellisense via the EditorBrowsableAttribute button1.CheckAccess(); button1.VerifyAccess(); }
public static void Load(Stream stream, object component) { XmlReader xml = XmlReader.Create(stream); XamlXmlReader reader = new XamlXmlReader(xml); XamlObjectWriter writer = new XamlObjectWriter( new XamlSchemaContext(), new XamlObjectWriterSettings { RootObjectInstance = component, //ExternalNameScope = nameScope, RegisterNamesOnExternalNamescope = true, XamlSetValueHandler = SetValue, }); while (reader.Read()) { writer.WriteNode(reader); } }
public static object Load(System.Xaml.XamlReader reader) { XamlObjectWriter writer = new XamlObjectWriter( new XamlSchemaContext(), new XamlObjectWriterSettings { XamlSetValueHandler = SetValue, }); while (reader.Read()) { writer.WriteNode(reader); } object result = writer.Result; DependencyObject dependencyObject = result as DependencyObject; if (dependencyObject != null) { NameScope.SetNameScope(dependencyObject, writer.RootNameScope); } return result; }
internal static void TransformNodes(System.Xaml.XamlReader xamlReader, System.Xaml.XamlObjectWriter xamlWriter, bool onlyLoadOneNode, bool skipJournaledProperties, bool shouldPassLineNumberInfo, IXamlLineInfo xamlLineInfo, IXamlLineInfoConsumer xamlLineInfoConsumer, XamlContextStack <WpfXamlFrame> stack, IStyleConnector styleConnector) { while (xamlReader.Read()) { if (shouldPassLineNumberInfo) { if (xamlLineInfo.LineNumber != 0) { xamlLineInfoConsumer.SetLineInfo(xamlLineInfo.LineNumber, xamlLineInfo.LinePosition); } } switch (xamlReader.NodeType) { case System.Xaml.XamlNodeType.NamespaceDeclaration: xamlWriter.WriteNode(xamlReader); if (stack.Depth == 0 || stack.CurrentFrame.Type != null) { stack.PushScope(); // Need to create an XmlnsDictionary. // Look up stack to see if we have one earlier // If so, use that. Otherwise new a xmlnsDictionary WpfXamlFrame iteratorFrame = stack.CurrentFrame; while (iteratorFrame != null) { if (iteratorFrame.XmlnsDictionary != null) { stack.CurrentFrame.XmlnsDictionary = new XmlnsDictionary(iteratorFrame.XmlnsDictionary); break; } iteratorFrame = (WpfXamlFrame)iteratorFrame.Previous; } if (stack.CurrentFrame.XmlnsDictionary == null) { stack.CurrentFrame.XmlnsDictionary = new XmlnsDictionary(); } } stack.CurrentFrame.XmlnsDictionary.Add(xamlReader.Namespace.Prefix, xamlReader.Namespace.Namespace); break; case System.Xaml.XamlNodeType.StartObject: WriteStartObject(xamlReader, xamlWriter, stack); break; case System.Xaml.XamlNodeType.GetObject: xamlWriter.WriteNode(xamlReader); // If there wasn't a namespace node before this get object, need to pushScope. if (stack.CurrentFrame.Type != null) { stack.PushScope(); } stack.CurrentFrame.Type = stack.PreviousFrame.Property.Type; break; case System.Xaml.XamlNodeType.EndObject: xamlWriter.WriteNode(xamlReader); // Freeze if required if (stack.CurrentFrame.FreezeFreezable) { Freezable freezable = xamlWriter.Result as Freezable; if (freezable != null && freezable.CanFreeze) { freezable.Freeze(); } } DependencyObject dependencyObject = xamlWriter.Result as DependencyObject; if (dependencyObject != null && stack.CurrentFrame.XmlSpace.HasValue) { XmlAttributeProperties.SetXmlSpace(dependencyObject, stack.CurrentFrame.XmlSpace.Value ? "default" : "preserve"); } stack.PopScope(); break; case System.Xaml.XamlNodeType.StartMember: // ObjectWriter should NOT process PresentationOptions:Freeze directive since it is Unknown // The space directive node stream should not be written because it induces object instantiation, // and the Baml2006Reader can produce space directives prematurely. if (!(xamlReader.Member.IsDirective && xamlReader.Member == XamlReaderHelper.Freeze) && xamlReader.Member != XmlSpace.Value && xamlReader.Member != XamlLanguage.Space) { xamlWriter.WriteNode(xamlReader); } stack.CurrentFrame.Property = xamlReader.Member; if (skipJournaledProperties) { if (!stack.CurrentFrame.Property.IsDirective) { System.Windows.Baml2006.WpfXamlMember wpfMember = stack.CurrentFrame.Property as System.Windows.Baml2006.WpfXamlMember; if (wpfMember != null) { DependencyProperty prop = wpfMember.DependencyProperty; if (prop != null) { FrameworkPropertyMetadata metadata = prop.GetMetadata(stack.CurrentFrame.Type.UnderlyingType) as FrameworkPropertyMetadata; if (metadata != null && metadata.Journal == true) { // Ignore the BAML for this member, unless it declares a value that wasn't journaled - namely a binding or a dynamic resource int count = 1; while (xamlReader.Read()) { switch (xamlReader.NodeType) { case System.Xaml.XamlNodeType.StartMember: count++; break; case System.Xaml.XamlNodeType.StartObject: XamlType xamlType = xamlReader.Type; XamlType bindingBaseType = xamlType.SchemaContext.GetXamlType(typeof(BindingBase)); XamlType dynamicResourceType = xamlType.SchemaContext.GetXamlType(typeof(DynamicResourceExtension)); if (count == 1 && (xamlType.CanAssignTo(bindingBaseType) || xamlType.CanAssignTo(dynamicResourceType))) { count = 0; WriteStartObject(xamlReader, xamlWriter, stack); } break; case System.Xaml.XamlNodeType.EndMember: count--; if (count == 0) { xamlWriter.WriteNode(xamlReader); stack.CurrentFrame.Property = null; } break; case System.Xaml.XamlNodeType.Value: DynamicResourceExtension value = xamlReader.Value as DynamicResourceExtension; if (value != null) { WriteValue(xamlReader, xamlWriter, stack, styleConnector); } break; } if (count == 0) { break; } } System.Diagnostics.Debug.Assert(count == 0, "Mismatch StartMember/EndMember"); } } } } } break; case System.Xaml.XamlNodeType.EndMember: WpfXamlFrame currentFrame = stack.CurrentFrame; XamlMember currentProperty = currentFrame.Property; // ObjectWriter should not process PresentationOptions:Freeze directive nodes since it is unknown // The space directive node stream should not be written because it induces object instantiation, // and the Baml2006Reader can produce space directives prematurely. if (!(currentProperty.IsDirective && currentProperty == XamlReaderHelper.Freeze) && currentProperty != XmlSpace.Value && currentProperty != XamlLanguage.Space) { xamlWriter.WriteNode(xamlReader); } currentFrame.Property = null; break; case System.Xaml.XamlNodeType.Value: WriteValue(xamlReader, xamlWriter, stack, styleConnector); break; default: xamlWriter.WriteNode(xamlReader); break; } //Only do this loop for one node if loadAsync if (onlyLoadOneNode) { return; } } }
private void LoadTemplateXaml(System.Xaml.XamlReader templateReader, XamlObjectWriter currentWriter) { try { int nestedTemplateDepth = 0; // Prepare to provide source info if needed IXamlLineInfoConsumer lineInfoConsumer = null; IXamlLineInfo lineInfo = null; if (XamlSourceInfoHelper.IsXamlSourceInfoEnabled) { lineInfo = templateReader as IXamlLineInfo; if (lineInfo != null) { lineInfoConsumer = currentWriter as IXamlLineInfoConsumer; } } while (templateReader.Read()) { if (lineInfoConsumer != null) { lineInfoConsumer.SetLineInfo(lineInfo.LineNumber, lineInfo.LinePosition); } // We need to call the ObjectWriter first because x:Name & RNPA needs to be registered // before we call InvalidateProperties. currentWriter.WriteNode(templateReader); switch (templateReader.NodeType) { case System.Xaml.XamlNodeType.None: case System.Xaml.XamlNodeType.NamespaceDeclaration: break; case System.Xaml.XamlNodeType.StartObject: { // If parent is a namescope or was inside a nested namescope, make the new frame inside a nested namescope // See usage in HandleAfterBeginInit() bool isInsideNameScope = Names.Depth > 0 && (IsNameScope(Names.CurrentFrame.Type) || Names.CurrentFrame.InsideNameScope); Names.PushScope(); Names.CurrentFrame.Type = templateReader.Type; if (isInsideNameScope) { Names.CurrentFrame.InsideNameScope = true; } } break; case System.Xaml.XamlNodeType.GetObject: { // If parent is a namescope or was inside a nested namescope, make the new frame inside a nested namescope bool isInsideNameScope = IsNameScope(Names.CurrentFrame.Type) || Names.CurrentFrame.InsideNameScope; Names.PushScope(); Names.CurrentFrame.Type = Names.PreviousFrame.Property.Type; if (isInsideNameScope) { Names.CurrentFrame.InsideNameScope = true; } } break; case System.Xaml.XamlNodeType.StartMember: Names.CurrentFrame.Property = templateReader.Member; if (templateReader.Member.DeferringLoader != null) { nestedTemplateDepth += 1; } break; case System.Xaml.XamlNodeType.EndMember: if (Names.CurrentFrame.Property.DeferringLoader != null) { nestedTemplateDepth -= 1; } Names.CurrentFrame.Property = null; break; case System.Xaml.XamlNodeType.EndObject: Names.PopScope(); break; case System.Xaml.XamlNodeType.Value: if (nestedTemplateDepth == 0) { if (Names.CurrentFrame.Property == XamlLanguage.ConnectionId) { if (_styleConnector != null) { _styleConnector.Connect((int)templateReader.Value, Names.CurrentFrame.Instance); } } } break; default: Debug.Assert(false, "Unknown enum value"); break; } } } catch (Exception e) { if (CriticalExceptions.IsCriticalException(e) || e is System.Windows.Markup.XamlParseException) { throw; } System.Windows.Markup.XamlReader.RewrapException(e, null); } }
internal static void TransformNodes(System.Xaml.XamlReader xamlReader, System.Xaml.XamlObjectWriter xamlWriter, bool onlyLoadOneNode, bool skipJournaledProperties, bool shouldPassLineNumberInfo, IXamlLineInfo xamlLineInfo, IXamlLineInfoConsumer xamlLineInfoConsumer, XamlContextStack <WpfXamlFrame> stack, IStyleConnector styleConnector) { while (xamlReader.Read()) { if (shouldPassLineNumberInfo) { if (xamlLineInfo.LineNumber != 0) { xamlLineInfoConsumer.SetLineInfo(xamlLineInfo.LineNumber, xamlLineInfo.LinePosition); } } switch (xamlReader.NodeType) { case System.Xaml.XamlNodeType.NamespaceDeclaration: xamlWriter.WriteNode(xamlReader); if (stack.Depth == 0 || stack.CurrentFrame.Type != null) { stack.PushScope(); // Need to create an XmlnsDictionary. // Look up stack to see if we have one earlier // If so, use that. Otherwise new a xmlnsDictionary WpfXamlFrame iteratorFrame = stack.CurrentFrame; while (iteratorFrame != null) { if (iteratorFrame.XmlnsDictionary != null) { stack.CurrentFrame.XmlnsDictionary = new XmlnsDictionary(iteratorFrame.XmlnsDictionary); break; } iteratorFrame = (WpfXamlFrame)iteratorFrame.Previous; } if (stack.CurrentFrame.XmlnsDictionary == null) { stack.CurrentFrame.XmlnsDictionary = new XmlnsDictionary(); } } stack.CurrentFrame.XmlnsDictionary.Add(xamlReader.Namespace.Prefix, xamlReader.Namespace.Namespace); break; case System.Xaml.XamlNodeType.StartObject: xamlWriter.WriteNode(xamlReader); // If there's a frame but no Type, that means there // was a namespace. Just set the Type if (stack.Depth != 0 && stack.CurrentFrame.Type == null) { stack.CurrentFrame.Type = xamlReader.Type; } else { // Propagate the FreezeFreezable property from the current stack frame stack.PushScope(); stack.CurrentFrame.Type = xamlReader.Type; if (stack.PreviousFrame.FreezeFreezable) { stack.CurrentFrame.FreezeFreezable = true; } } break; case System.Xaml.XamlNodeType.GetObject: xamlWriter.WriteNode(xamlReader); // If there wasn't a namespace node before this get object, need to pushScope. if (stack.CurrentFrame.Type != null) { stack.PushScope(); } stack.CurrentFrame.Type = stack.PreviousFrame.Property.Type; break; case System.Xaml.XamlNodeType.EndObject: xamlWriter.WriteNode(xamlReader); // Freeze if required if (stack.CurrentFrame.FreezeFreezable) { Freezable freezable = xamlWriter.Result as Freezable; if (freezable != null && freezable.CanFreeze) { freezable.Freeze(); } } DependencyObject dependencyObject = xamlWriter.Result as DependencyObject; if (dependencyObject != null && stack.CurrentFrame.XmlSpace.HasValue) { XmlAttributeProperties.SetXmlSpace(dependencyObject, stack.CurrentFrame.XmlSpace.Value ? "default" : "preserve"); } stack.PopScope(); break; case System.Xaml.XamlNodeType.StartMember: // ObjectWriter should NOT process PresentationOptions:Freeze directive since it is Unknown // The space directive node stream should not be written because it induces object instantiation, // and the Baml2006Reader can produce space directives prematurely. if (!(xamlReader.Member.IsDirective && xamlReader.Member == XamlReaderHelper.Freeze) && xamlReader.Member != XmlSpace.Value && xamlReader.Member != XamlLanguage.Space) { xamlWriter.WriteNode(xamlReader); } stack.CurrentFrame.Property = xamlReader.Member; if (skipJournaledProperties) { if (!stack.CurrentFrame.Property.IsDirective) { System.Windows.Baml2006.WpfXamlMember wpfMember = stack.CurrentFrame.Property as System.Windows.Baml2006.WpfXamlMember; if (wpfMember != null) { DependencyProperty prop = wpfMember.DependencyProperty; if (prop != null) { FrameworkPropertyMetadata metadata = prop.GetMetadata(stack.CurrentFrame.Type.UnderlyingType) as FrameworkPropertyMetadata; if (metadata != null && metadata.Journal == true) { // int count = 1; while (xamlReader.Read()) { switch (xamlReader.NodeType) { case System.Xaml.XamlNodeType.StartMember: count++; break; case System.Xaml.XamlNodeType.EndMember: count--; if (count == 0) { xamlWriter.WriteNode(xamlReader); } break; } if (count == 0) { break; } } // shouldn't this have been a XamlReader.Skip()? System.Diagnostics.Debug.Assert(count == 0, "Mismatch StartMember/EndMember"); } } } } } break; case System.Xaml.XamlNodeType.EndMember: WpfXamlFrame currentFrame = stack.CurrentFrame; XamlMember currentProperty = currentFrame.Property; // ObjectWriter should not process PresentationOptions:Freeze directive nodes since it is unknown // The space directive node stream should not be written because it induces object instantiation, // and the Baml2006Reader can produce space directives prematurely. if (!(currentProperty.IsDirective && currentProperty == XamlReaderHelper.Freeze) && currentProperty != XmlSpace.Value && currentProperty != XamlLanguage.Space) { xamlWriter.WriteNode(xamlReader); } currentFrame.Property = null; break; case System.Xaml.XamlNodeType.Value: if (stack.CurrentFrame.Property.IsDirective && stack.CurrentFrame.Property == XamlLanguage.Shared) { bool isShared; if (bool.TryParse(xamlReader.Value as string, out isShared)) { if (!isShared) { if (!(xamlReader is Baml2006Reader)) { throw new XamlParseException(SR.Get(SRID.SharedAttributeInLooseXaml)); } } } } // ObjectWriter should not process PresentationOptions:Freeze directive nodes since it is unknown if (stack.CurrentFrame.Property.IsDirective && stack.CurrentFrame.Property == XamlReaderHelper.Freeze) { bool freeze = Convert.ToBoolean(xamlReader.Value, TypeConverterHelper.InvariantEnglishUS); stack.CurrentFrame.FreezeFreezable = freeze; var bamlReader = xamlReader as System.Windows.Baml2006.Baml2006Reader; if (bamlReader != null) { bamlReader.FreezeFreezables = freeze; } } // The space directive node stream should not be written because it induces object instantiation, // and the Baml2006Reader can produce space directives prematurely. else if (stack.CurrentFrame.Property == XmlSpace.Value || stack.CurrentFrame.Property == XamlLanguage.Space) { if (typeof(DependencyObject).IsAssignableFrom(stack.CurrentFrame.Type.UnderlyingType)) { System.Diagnostics.Debug.Assert(xamlReader.Value is string, "XmlAttributeProperties.XmlSpaceProperty has the type string."); stack.CurrentFrame.XmlSpace = (string)xamlReader.Value == "default"; } } else { // Ideally we should check if we're inside FrameworkTemplate's Content and not register those. // However, checking if the instance is null accomplishes the same with a much smaller perf impact. if (styleConnector != null && stack.CurrentFrame.Instance != null && stack.CurrentFrame.Property == XamlLanguage.ConnectionId && typeof(Style).IsAssignableFrom(stack.CurrentFrame.Type.UnderlyingType)) { styleConnector.Connect((int)xamlReader.Value, stack.CurrentFrame.Instance); } xamlWriter.WriteNode(xamlReader); } break; default: xamlWriter.WriteNode(xamlReader); break; } //Only do this loop for one node if loadAsync if (onlyLoadOneNode) { return; } } }
private void ExtractBAML(string name, Stream stream) { var reader = new Baml2006Reader(stream); var settings = new XamlObjectWriterSettings (); settings.BeforePropertiesHandler += (sender, e) => { Trace("properties for {0}", e.Instance); }; settings.XamlSetValueHandler += (sender, e) => { //TraceTarget.Trace("set value {0} = {1}", e.Member.Name, e.Value); /*if (e.Member.Name == "DeferrableContent") { e.Handled = true; }*/ }; var writer = new XamlObjectWriter(reader.SchemaContext, settings); while (reader.Read()) { writer.WriteNode(reader); } var x = writer.Result; var ms = new MemoryStream(); using (var xwriter = XmlWriter.Create(ms, new XmlWriterSettings { Indent = true })) { System.Windows.Markup.XamlWriter.Save(x, xwriter); } var xamlname = Path.ChangeExtension(name, ".xaml"); ms.Position = 0; AddResource(xamlname, ms); }
private void LoadTemplateXaml(System.Xaml.XamlReader templateReader, XamlObjectWriter currentWriter) { try { while (templateReader.Read()) { // We need to call the ObjectWriter first because x:Name & RNPA needs to be registered // before we call InvalidateProperties. currentWriter.WriteNode(templateReader); switch (templateReader.NodeType) { case System.Xaml.XamlNodeType.None: case System.Xaml.XamlNodeType.NamespaceDeclaration: break; case System.Xaml.XamlNodeType.StartObject: { // If parent is a namescope or was inside a nested namescope, make the new frame inside a nested namescope bool isInsideNameScope = Names.Depth > 0 && (IsNameScope(Names.CurrentFrame.Type) || Names.CurrentFrame.InsideNameScope); Names.PushScope(); Names.CurrentFrame.Type = templateReader.Type; if (isInsideNameScope) { Names.CurrentFrame.InsideNameScope = true; } } break; case System.Xaml.XamlNodeType.GetObject: { // If parent is a namescope or was inside a nested namescope, make the new frame inside a nested namescope bool isInsideNameScope = IsNameScope(Names.CurrentFrame.Type) || Names.CurrentFrame.InsideNameScope; Names.PushScope(); Names.CurrentFrame.Type = Names.PreviousFrame.Property.Type; if (isInsideNameScope) { Names.CurrentFrame.InsideNameScope = true; } } break; case System.Xaml.XamlNodeType.StartMember: Names.CurrentFrame.Property = templateReader.Member; break; case System.Xaml.XamlNodeType.EndMember: Names.CurrentFrame.Property = null; break; case System.Xaml.XamlNodeType.EndObject: Names.PopScope(); break; case System.Xaml.XamlNodeType.Value: if (Names.CurrentFrame.Property == XamlLanguage.ConnectionId) { if (_styleConnector != null) { _styleConnector.Connect((int)templateReader.Value, Names.CurrentFrame.Instance); } } break; default: Debug.Assert(false, "Unknown enum value"); break; } } } catch (Exception e) { if (CriticalExceptions.IsCriticalException(e) || e is System.Windows.Markup.XamlParseException) { throw; } System.Windows.Markup.XamlReader.RewrapException(e, null); } }