|
|
|
|
@ -35,90 +35,89 @@ namespace ICSharpCode.WpfDesign.XamlDom
@@ -35,90 +35,89 @@ namespace ICSharpCode.WpfDesign.XamlDom
|
|
|
|
|
{ |
|
|
|
|
public static FrameworkTemplate GetFrameworkTemplate(XmlElement xmlElement, XamlObject parentObject) |
|
|
|
|
{ |
|
|
|
|
try |
|
|
|
|
{ |
|
|
|
|
var nav = xmlElement.CreateNavigator(); |
|
|
|
|
|
|
|
|
|
var ns = new Dictionary<string, string>(); |
|
|
|
|
while (true) |
|
|
|
|
var nav = xmlElement.CreateNavigator(); |
|
|
|
|
|
|
|
|
|
var ns = new Dictionary<string, string>(); |
|
|
|
|
while (true) |
|
|
|
|
{ |
|
|
|
|
var nsInScope = nav.GetNamespacesInScope(XmlNamespaceScope.ExcludeXml); |
|
|
|
|
foreach (var ak in nsInScope) |
|
|
|
|
{ |
|
|
|
|
var nsInScope = nav.GetNamespacesInScope(XmlNamespaceScope.ExcludeXml); |
|
|
|
|
foreach (var ak in nsInScope) |
|
|
|
|
{ |
|
|
|
|
if (!ns.ContainsKey(ak.Key) && ak.Key != "") |
|
|
|
|
ns.Add(ak.Key, ak.Value); |
|
|
|
|
} |
|
|
|
|
if (!nav.MoveToParent()) |
|
|
|
|
break; |
|
|
|
|
if (!ns.ContainsKey(ak.Key) && ak.Key != "") |
|
|
|
|
ns.Add(ak.Key, ak.Value); |
|
|
|
|
} |
|
|
|
|
if (!nav.MoveToParent()) |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var keyAttrib = xmlElement.GetAttribute("Key", XamlConstants.XamlNamespace); |
|
|
|
|
foreach (var dictentry in ns) |
|
|
|
|
{ |
|
|
|
|
xmlElement.SetAttribute("xmlns:" + dictentry.Key, dictentry.Value); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var keyAttrib = xmlElement.GetAttribute("Key", XamlConstants.XamlNamespace); |
|
|
|
|
|
|
|
|
|
if (string.IsNullOrEmpty(keyAttrib)) |
|
|
|
|
xmlElement.SetAttribute("Key", XamlConstants.XamlNamespace, "$$temp&&§§%%__"); |
|
|
|
|
if (string.IsNullOrEmpty(keyAttrib)) |
|
|
|
|
xmlElement.SetAttribute("Key", XamlConstants.XamlNamespace, "$$temp&&§§%%__"); |
|
|
|
|
|
|
|
|
|
var xaml = xmlElement.OuterXml; |
|
|
|
|
xaml = "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/netfx/2007/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">" + xaml + "</ResourceDictionary>"; |
|
|
|
|
StringReader stringReader = new StringReader(xaml); |
|
|
|
|
XmlReader xmlReader = XmlReader.Create(stringReader); |
|
|
|
|
var xamlReader = new XamlXmlReader(xmlReader, parentObject.ServiceProvider.SchemaContext); |
|
|
|
|
var xaml = xmlElement.OuterXml; |
|
|
|
|
xaml = "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/netfx/2007/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">" + xaml + "</ResourceDictionary>"; |
|
|
|
|
StringReader stringReader = new StringReader(xaml); |
|
|
|
|
XmlReader xmlReader = XmlReader.Create(stringReader); |
|
|
|
|
var xamlReader = new XamlXmlReader(xmlReader, parentObject.ServiceProvider.SchemaContext); |
|
|
|
|
|
|
|
|
|
var seti = new XamlObjectWriterSettings(); |
|
|
|
|
var seti = new XamlObjectWriterSettings(); |
|
|
|
|
|
|
|
|
|
var resourceDictionary = new ResourceDictionary(); |
|
|
|
|
var obj = parentObject; |
|
|
|
|
while (obj != null) |
|
|
|
|
var resourceDictionary = new ResourceDictionary(); |
|
|
|
|
var obj = parentObject; |
|
|
|
|
while (obj != null) |
|
|
|
|
{ |
|
|
|
|
if (obj.Instance is ResourceDictionary) |
|
|
|
|
{ |
|
|
|
|
if (obj.Instance is ResourceDictionary) |
|
|
|
|
var r = obj.Instance as ResourceDictionary; |
|
|
|
|
foreach (var k in r.Keys) |
|
|
|
|
{ |
|
|
|
|
var r = obj.Instance as ResourceDictionary; |
|
|
|
|
foreach (var k in r.Keys) |
|
|
|
|
{ |
|
|
|
|
if (!resourceDictionary.Contains(k)) |
|
|
|
|
resourceDictionary.Add(k, r[k]); |
|
|
|
|
} |
|
|
|
|
if (!resourceDictionary.Contains(k)) |
|
|
|
|
resourceDictionary.Add(k, r[k]); |
|
|
|
|
} |
|
|
|
|
else if (obj.Instance is FrameworkElement) |
|
|
|
|
{ |
|
|
|
|
var r = ((FrameworkElement)obj.Instance).Resources; |
|
|
|
|
foreach (var k in r.Keys) |
|
|
|
|
{ |
|
|
|
|
if (!resourceDictionary.Contains(k)) |
|
|
|
|
resourceDictionary.Add(k, r[k]); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
obj = obj.ParentObject; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
seti.BeforePropertiesHandler = (s, e) => |
|
|
|
|
else if (obj.Instance is FrameworkElement) |
|
|
|
|
{ |
|
|
|
|
if (seti.BeforePropertiesHandler != null) |
|
|
|
|
var r = ((FrameworkElement)obj.Instance).Resources; |
|
|
|
|
foreach (var k in r.Keys) |
|
|
|
|
{ |
|
|
|
|
var rr = e.Instance as ResourceDictionary; |
|
|
|
|
rr.MergedDictionaries.Add(resourceDictionary); |
|
|
|
|
seti.BeforePropertiesHandler = null; |
|
|
|
|
if (!resourceDictionary.Contains(k)) |
|
|
|
|
resourceDictionary.Add(k, r[k]); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
obj = obj.ParentObject; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var writer = new XamlObjectWriter(parentObject.ServiceProvider.SchemaContext, seti); |
|
|
|
|
seti.BeforePropertiesHandler = (s, e) => |
|
|
|
|
{ |
|
|
|
|
if (seti.BeforePropertiesHandler != null) |
|
|
|
|
{ |
|
|
|
|
var rr = e.Instance as ResourceDictionary; |
|
|
|
|
rr.MergedDictionaries.Add(resourceDictionary); |
|
|
|
|
seti.BeforePropertiesHandler = null; |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
XamlServices.Transform(xamlReader, writer); |
|
|
|
|
var writer = new XamlObjectWriter(parentObject.ServiceProvider.SchemaContext, seti); |
|
|
|
|
|
|
|
|
|
var result = (ResourceDictionary)writer.Result; |
|
|
|
|
XamlServices.Transform(xamlReader, writer); |
|
|
|
|
|
|
|
|
|
var enr = result.Keys.GetEnumerator(); |
|
|
|
|
enr.MoveNext(); |
|
|
|
|
var rdKey = enr.Current; |
|
|
|
|
var result = (ResourceDictionary)writer.Result; |
|
|
|
|
|
|
|
|
|
var template = result[rdKey] as FrameworkTemplate; |
|
|
|
|
result.Remove(rdKey); |
|
|
|
|
return template; |
|
|
|
|
} |
|
|
|
|
catch (Exception) |
|
|
|
|
{ } |
|
|
|
|
var enr = result.Keys.GetEnumerator(); |
|
|
|
|
enr.MoveNext(); |
|
|
|
|
var rdKey = enr.Current; |
|
|
|
|
|
|
|
|
|
return null; |
|
|
|
|
var template = result[rdKey] as FrameworkTemplate; |
|
|
|
|
result.Remove(rdKey); |
|
|
|
|
return template; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|