While it’s great that we have a common Xaml stack that works across WPF, WF, and WCF, there are some slight differences in the way that WPF loads XAML that doesn’t work with the simple XamlServices.Load API.
For WPF XAML, you should use System.Windows.Markup.XamlReader.Load and System.Windows.Markup.XamlWriter.Save. This will ensure that your XAML will load and save correctly.
Here’s a list of some of the special things that XamlReader.Load does: (this isn’t a full list)
- Enables Journaling (a WPF navigation feature)
- Sets special attached DependencyProperties on all DependencyObjects (e.g. BaseUri, XmlnsDictionary, XmlSpace etc…)
- Ignores x:Uid on property elements. Early in V3 (before we shipped), there was a bug in the UpdateUid build task that put x:Uid on every XML element including property elements. XAML doesn’t support properties on properties which means that Uid isn’t support on property elements. We ignored it in V3 and we ignore it in V4 if you use XamlReader.Load (we actually just set XamlReaderSettings.IgnoreUidOnPropertyElements)
- Wire up events inside of templates and styles
- Freeze freezables
- Uses the Wpf XamlSchemaContext (which you can get from System.Windows.MarkupXamlReader.GetWpfSchemaContext())
- IProvideValueTarget.TargetProperty returns DependencyProperties instead of PropertyInfos. Binding and DynamicResource require this.
- There were several other quirks that we added for compat reasons
As you can see, most of this stuff isn’t very generic. It’s pretty specific to WPF and thus we couldn’t justify putting it in the generic System.Xaml parser.