diff --git a/ILSpy.BamlDecompiler.Tests/BamlTestRunner.cs b/ILSpy.BamlDecompiler.Tests/BamlTestRunner.cs
index be9039601..b5cb07263 100644
--- a/ILSpy.BamlDecompiler.Tests/BamlTestRunner.cs
+++ b/ILSpy.BamlDecompiler.Tests/BamlTestRunner.cs
@@ -107,6 +107,12 @@ namespace ILSpy.BamlDecompiler.Tests
RunTest("cases/issue1435");
}
+ [Test]
+ public void Issue1546()
+ {
+ RunTest("cases/issue1546");
+ }
+
#region RunTest
void RunTest(string name)
{
diff --git a/ILSpy.BamlDecompiler.Tests/Cases/Issue1546.xaml b/ILSpy.BamlDecompiler.Tests/Cases/Issue1546.xaml
new file mode 100644
index 000000000..c09ce5b77
--- /dev/null
+++ b/ILSpy.BamlDecompiler.Tests/Cases/Issue1546.xaml
@@ -0,0 +1,35 @@
+
+ #f1f1f1
+ #2d2d30
+ #3f3f41
+ #007acc
+ #333337
+ #3f3f3f
+ #999999
+ #686868
+ #9e9e9e
+ #f1f1f1
+ #2d2d30
+ #3f3f41
+ #b20000
+ #990000
+ #009700
+ #007400
+ #1c97ea
+ #007acc
+ #333337
+ #3f3f3f
+ #999999
+ #686868
+ #9e9e9e
+
+
+
+
+
+ #FFD1D1D1
+
+ #FFA3A3A3
+
+ #FF747474
+
\ No newline at end of file
diff --git a/ILSpy.BamlDecompiler.Tests/ILSpy.BamlDecompiler.Tests.csproj b/ILSpy.BamlDecompiler.Tests/ILSpy.BamlDecompiler.Tests.csproj
index 198bbe621..5971fd32c 100644
--- a/ILSpy.BamlDecompiler.Tests/ILSpy.BamlDecompiler.Tests.csproj
+++ b/ILSpy.BamlDecompiler.Tests/ILSpy.BamlDecompiler.Tests.csproj
@@ -74,6 +74,9 @@
MSBuild:Compile
+
+ MSBuild:Compile
+
Designer
diff --git a/ILSpy.BamlDecompiler/Handlers/Blocks/KeyElementStartHandler.cs b/ILSpy.BamlDecompiler/Handlers/Blocks/KeyElementStartHandler.cs
index 12d0c22fe..f5844bd41 100644
--- a/ILSpy.BamlDecompiler/Handlers/Blocks/KeyElementStartHandler.cs
+++ b/ILSpy.BamlDecompiler/Handlers/Blocks/KeyElementStartHandler.cs
@@ -38,7 +38,7 @@ namespace ILSpy.BamlDecompiler.Handlers {
var key = (XamlResourceKey)node.Annotation;
var bamlElem = new BamlElement(node);
- bamlElem.Xaml = new XElement(ctx.GetXamlNsName("Key", parent.Xaml));
+ bamlElem.Xaml = new XElement(ctx.GetKnownNamespace("Key", XamlContext.KnownNamespace_Xaml, parent.Xaml));
parent.Xaml.Element.Add(bamlElem.Xaml.Element);
key.KeyElement = bamlElem;
base.Translate(ctx, node, bamlElem);
diff --git a/ILSpy.BamlDecompiler/Handlers/Records/ConstructorParameterTypeHandler.cs b/ILSpy.BamlDecompiler/Handlers/Records/ConstructorParameterTypeHandler.cs
index 7bc103727..278586687 100644
--- a/ILSpy.BamlDecompiler/Handlers/Records/ConstructorParameterTypeHandler.cs
+++ b/ILSpy.BamlDecompiler/Handlers/Records/ConstructorParameterTypeHandler.cs
@@ -31,7 +31,7 @@ namespace ILSpy.BamlDecompiler.Handlers {
public BamlElement Translate(XamlContext ctx, BamlNode node, BamlElement parent) {
var record = (ConstructorParameterTypeRecord)((BamlRecordNode)node).Record;
- var elem = new XElement(ctx.GetXamlNsName("TypeExtension", parent.Xaml));
+ var elem = new XElement(ctx.GetKnownNamespace("TypeExtension", XamlContext.KnownNamespace_Xaml, parent.Xaml));
elem.AddAnnotation(ctx.ResolveType(0xfd4d)); // Known type - TypeExtension
var bamlElem = new BamlElement(node);
diff --git a/ILSpy.BamlDecompiler/Handlers/Records/DefAttributeHandler.cs b/ILSpy.BamlDecompiler/Handlers/Records/DefAttributeHandler.cs
index 221c29aa3..8b141d002 100644
--- a/ILSpy.BamlDecompiler/Handlers/Records/DefAttributeHandler.cs
+++ b/ILSpy.BamlDecompiler/Handlers/Records/DefAttributeHandler.cs
@@ -31,7 +31,7 @@ namespace ILSpy.BamlDecompiler.Handlers {
var record = (DefAttributeRecord)((BamlRecordNode)node).Record;
var attrName = ctx.ResolveString(record.NameId);
- parent.Xaml.Element.Add(new XAttribute(ctx.GetXamlNsName(attrName), record.Value));
+ parent.Xaml.Element.Add(new XAttribute(ctx.GetKnownNamespace(attrName, XamlContext.KnownNamespace_Xaml), record.Value));
return null;
}
diff --git a/ILSpy.BamlDecompiler/Handlers/Records/DefAttributeKeyStringHandler.cs b/ILSpy.BamlDecompiler/Handlers/Records/DefAttributeKeyStringHandler.cs
index b92a5588a..0068ba4ac 100644
--- a/ILSpy.BamlDecompiler/Handlers/Records/DefAttributeKeyStringHandler.cs
+++ b/ILSpy.BamlDecompiler/Handlers/Records/DefAttributeKeyStringHandler.cs
@@ -38,7 +38,7 @@ namespace ILSpy.BamlDecompiler.Handlers {
var key = (XamlResourceKey)node.Annotation;
var bamlElem = new BamlElement(node);
- bamlElem.Xaml = new XElement(ctx.GetXamlNsName("Key", parent.Xaml));
+ bamlElem.Xaml = new XElement(ctx.GetKnownNamespace("Key", XamlContext.KnownNamespace_Xaml, parent.Xaml));
parent.Xaml.Element.Add(bamlElem.Xaml.Element);
bamlElem.Xaml.Element.Value = ctx.ResolveString(record.ValueId);
key.KeyElement = bamlElem;
diff --git a/ILSpy.BamlDecompiler/Handlers/Records/DefAttributeKeyTypeHandler.cs b/ILSpy.BamlDecompiler/Handlers/Records/DefAttributeKeyTypeHandler.cs
index 0b45d8583..8b6080248 100644
--- a/ILSpy.BamlDecompiler/Handlers/Records/DefAttributeKeyTypeHandler.cs
+++ b/ILSpy.BamlDecompiler/Handlers/Records/DefAttributeKeyTypeHandler.cs
@@ -40,10 +40,10 @@ namespace ILSpy.BamlDecompiler.Handlers {
var key = (XamlResourceKey)node.Annotation;
var bamlElem = new BamlElement(node);
- bamlElem.Xaml = new XElement(ctx.GetXamlNsName("Key", parent.Xaml));
+ bamlElem.Xaml = new XElement(ctx.GetKnownNamespace("Key", XamlContext.KnownNamespace_Xaml, parent.Xaml));
parent.Xaml.Element.Add(bamlElem.Xaml.Element);
- var typeElem = new XElement(ctx.GetXamlNsName("TypeExtension", parent.Xaml));
+ var typeElem = new XElement(ctx.GetKnownNamespace("TypeExtension", XamlContext.KnownNamespace_Xaml, parent.Xaml));
typeElem.AddAnnotation(ctx.ResolveType(0xfd4d)); // Known type - TypeExtension
typeElem.Add(new XElement(ctx.GetPseudoName("Ctor"), typeName));
bamlElem.Xaml.Element.Add(typeElem);
diff --git a/ILSpy.BamlDecompiler/Handlers/Records/LiteralContentHandler.cs b/ILSpy.BamlDecompiler/Handlers/Records/LiteralContentHandler.cs
index d5b0e73aa..ab36554b4 100644
--- a/ILSpy.BamlDecompiler/Handlers/Records/LiteralContentHandler.cs
+++ b/ILSpy.BamlDecompiler/Handlers/Records/LiteralContentHandler.cs
@@ -30,7 +30,7 @@ namespace ILSpy.BamlDecompiler.Handlers {
public BamlElement Translate(XamlContext ctx, BamlNode node, BamlElement parent) {
var record = (LiteralContentRecord)((BamlRecordNode)node).Record;
- var elem = new XElement(ctx.GetXamlNsName("XData", parent.Xaml));
+ var elem = new XElement(ctx.GetKnownNamespace("XData", XamlContext.KnownNamespace_Xaml, parent.Xaml));
var content = XElement.Parse(record.Value);
elem.Add(content);
diff --git a/ILSpy.BamlDecompiler/Handlers/Records/OptimizedStaticResourceHandler.cs b/ILSpy.BamlDecompiler/Handlers/Records/OptimizedStaticResourceHandler.cs
index 64a54695b..463acedc2 100644
--- a/ILSpy.BamlDecompiler/Handlers/Records/OptimizedStaticResourceHandler.cs
+++ b/ILSpy.BamlDecompiler/Handlers/Records/OptimizedStaticResourceHandler.cs
@@ -43,7 +43,7 @@ namespace ILSpy.BamlDecompiler.Handlers {
if (record.IsType) {
var value = ctx.ResolveType(record.ValueId);
- var typeElem = new XElement(ctx.GetXamlNsName("TypeExtension", parent.Xaml));
+ var typeElem = new XElement(ctx.GetKnownNamespace("TypeExtension", XamlContext.KnownNamespace_Xaml, parent.Xaml));
typeElem.AddAnnotation(ctx.ResolveType(0xfd4d)); // Known type - TypeExtension
typeElem.Add(new XElement(ctx.GetPseudoName("Ctor"), ctx.ToString(parent.Xaml, value)));
key = typeElem;
@@ -82,7 +82,7 @@ namespace ILSpy.BamlDecompiler.Handlers {
attrName = ctx.ToString(parent.Xaml, xName);
}
- var staticElem = new XElement(ctx.GetXamlNsName("StaticExtension", parent.Xaml));
+ var staticElem = new XElement(ctx.GetKnownNamespace("StaticExtension", XamlContext.KnownNamespace_Xaml, parent.Xaml));
staticElem.AddAnnotation(ctx.ResolveType(0xfda6)); // Known type - StaticExtension
staticElem.Add(new XElement(ctx.GetPseudoName("Ctor"), attrName));
key = staticElem;
diff --git a/ILSpy.BamlDecompiler/Handlers/Records/PresentationOptionsAttributeHandler.cs b/ILSpy.BamlDecompiler/Handlers/Records/PresentationOptionsAttributeHandler.cs
index 01d648ef7..e0f3f728a 100644
--- a/ILSpy.BamlDecompiler/Handlers/Records/PresentationOptionsAttributeHandler.cs
+++ b/ILSpy.BamlDecompiler/Handlers/Records/PresentationOptionsAttributeHandler.cs
@@ -31,7 +31,7 @@ namespace ILSpy.BamlDecompiler.Handlers {
var record = (PresentationOptionsAttributeRecord)((BamlRecordNode)node).Record;
var attrName = ctx.ResolveString(record.NameId);
- var attr = new XAttribute(ctx.GetXamlNsName(attrName, parent.Xaml), record.Value);
+ var attr = new XAttribute(ctx.GetKnownNamespace(attrName, XamlContext.KnownNamespace_PresentationOptions, parent.Xaml), record.Value);
parent.Xaml.Element.Add(attr);
return null;
diff --git a/ILSpy.BamlDecompiler/Handlers/Records/PropertyHandler.cs b/ILSpy.BamlDecompiler/Handlers/Records/PropertyHandler.cs
index c084b76e6..822fc0627 100644
--- a/ILSpy.BamlDecompiler/Handlers/Records/PropertyHandler.cs
+++ b/ILSpy.BamlDecompiler/Handlers/Records/PropertyHandler.cs
@@ -45,7 +45,7 @@ namespace ILSpy.BamlDecompiler.Handlers {
return new XAttribute(xamlProp.ToXName(ctx, parent.Xaml, true), value);
if (xamlProp.PropertyName == "Name" && elemType.ResolvedType.GetDefinition()?.ParentModule.IsMainModule == true)
- return new XAttribute(ctx.GetXamlNsName("Name"), value);
+ return new XAttribute(ctx.GetKnownNamespace("Name", XamlContext.KnownNamespace_Xaml), value);
return new XAttribute(xamlProp.ToXName(ctx, parent.Xaml, false), value);
}
diff --git a/ILSpy.BamlDecompiler/Handlers/Records/PropertyTypeReferenceHandler.cs b/ILSpy.BamlDecompiler/Handlers/Records/PropertyTypeReferenceHandler.cs
index 45a94f91e..aa29642af 100644
--- a/ILSpy.BamlDecompiler/Handlers/Records/PropertyTypeReferenceHandler.cs
+++ b/ILSpy.BamlDecompiler/Handlers/Records/PropertyTypeReferenceHandler.cs
@@ -42,7 +42,7 @@ namespace ILSpy.BamlDecompiler.Handlers {
elem.Xaml.Element.AddAnnotation(elemAttr);
parent.Xaml.Element.Add(elem.Xaml.Element);
- var typeElem = new XElement(ctx.GetXamlNsName("TypeExtension", parent.Xaml));
+ var typeElem = new XElement(ctx.GetKnownNamespace("TypeExtension", XamlContext.KnownNamespace_Xaml, parent.Xaml));
typeElem.AddAnnotation(ctx.ResolveType(0xfd4d)); // Known type - TypeExtension
typeElem.Add(new XElement(ctx.GetPseudoName("Ctor"), typeName));
elem.Xaml.Element.Add(typeElem);
diff --git a/ILSpy.BamlDecompiler/Rewrite/AttributeRewritePass.cs b/ILSpy.BamlDecompiler/Rewrite/AttributeRewritePass.cs
index b8e902119..a8c5ac22b 100644
--- a/ILSpy.BamlDecompiler/Rewrite/AttributeRewritePass.cs
+++ b/ILSpy.BamlDecompiler/Rewrite/AttributeRewritePass.cs
@@ -29,7 +29,7 @@ namespace ILSpy.BamlDecompiler.Rewrite {
XName key;
public void Run(XamlContext ctx, XDocument document) {
- key = ctx.GetXamlNsName("Key");
+ key = ctx.GetKnownNamespace("Key", XamlContext.KnownNamespace_Xaml);
bool doWork;
do {
diff --git a/ILSpy.BamlDecompiler/Rewrite/ConnectionIdRewritePass.cs b/ILSpy.BamlDecompiler/Rewrite/ConnectionIdRewritePass.cs
index fe2912ff9..82ab77302 100644
--- a/ILSpy.BamlDecompiler/Rewrite/ConnectionIdRewritePass.cs
+++ b/ILSpy.BamlDecompiler/Rewrite/ConnectionIdRewritePass.cs
@@ -59,7 +59,7 @@ namespace ILSpy.BamlDecompiler.Rewrite
{
var result = new List<(LongSet, EventRegistration[])>();
- var xClass = document.Root.Elements().First().Attribute(ctx.GetXamlNsName("Class"));
+ var xClass = document.Root.Elements().First().Attribute(ctx.GetKnownNamespace("Class", XamlContext.KnownNamespace_Xaml));
if (xClass == null)
return result;
diff --git a/ILSpy.BamlDecompiler/Rewrite/MarkupExtensionRewritePass.cs b/ILSpy.BamlDecompiler/Rewrite/MarkupExtensionRewritePass.cs
index e05eee62e..e2411672f 100644
--- a/ILSpy.BamlDecompiler/Rewrite/MarkupExtensionRewritePass.cs
+++ b/ILSpy.BamlDecompiler/Rewrite/MarkupExtensionRewritePass.cs
@@ -31,7 +31,7 @@ namespace ILSpy.BamlDecompiler.Rewrite {
XName ctor;
public void Run(XamlContext ctx, XDocument document) {
- key = ctx.GetXamlNsName("Key");
+ key = ctx.GetKnownNamespace("Key", XamlContext.KnownNamespace_Xaml);
ctor = ctx.GetPseudoName("Ctor");
bool doWork;
diff --git a/ILSpy.BamlDecompiler/Rewrite/XClassRewritePass.cs b/ILSpy.BamlDecompiler/Rewrite/XClassRewritePass.cs
index 332454d17..2e2d25e59 100644
--- a/ILSpy.BamlDecompiler/Rewrite/XClassRewritePass.cs
+++ b/ILSpy.BamlDecompiler/Rewrite/XClassRewritePass.cs
@@ -48,11 +48,11 @@ namespace ILSpy.BamlDecompiler.Rewrite {
elem.Name = xamlType.ToXName(ctx);
- var attrName = ctx.GetXamlNsName("Class", elem);
+ var attrName = ctx.GetKnownNamespace("Class", XamlContext.KnownNamespace_Xaml, elem);
var attrs = elem.Attributes().ToList();
if (typeDef.Accessibility != ICSharpCode.Decompiler.TypeSystem.Accessibility.Public) {
- var classModifierName = ctx.GetXamlNsName("ClassModifier", elem);
+ var classModifierName = ctx.GetKnownNamespace("ClassModifier", XamlContext.KnownNamespace_Xaml, elem);
attrs.Insert(0, new XAttribute(classModifierName, "internal"));
}
attrs.Insert(0, new XAttribute(attrName, type.ResolvedType.FullName));
diff --git a/ILSpy.BamlDecompiler/XamlContext.cs b/ILSpy.BamlDecompiler/XamlContext.cs
index 6afe81eee..50063cf6e 100644
--- a/ILSpy.BamlDecompiler/XamlContext.cs
+++ b/ILSpy.BamlDecompiler/XamlContext.cs
@@ -164,6 +164,10 @@ namespace ILSpy.BamlDecompiler {
return ns;
}
+ public const string KnownNamespace_Xaml = "http://schemas.microsoft.com/winfx/2006/xaml";
+ public const string KnownNamespace_Presentation = "http://schemas.microsoft.com/winfx/2006/xaml/presentation";
+ public const string KnownNamespace_PresentationOptions = "http://schemas.microsoft.com/winfx/2006/xaml/presentation/options";
+
public string TryGetXmlNamespace(IModule assembly, string typeNamespace) {
if (assembly == null)
return null;
@@ -184,16 +188,16 @@ namespace ILSpy.BamlDecompiler {
possibleXmlNs.Add(xmlNs);
}
- if (possibleXmlNs.Contains("http://schemas.microsoft.com/winfx/2006/xaml/presentation"))
- return "http://schemas.microsoft.com/winfx/2006/xaml/presentation";
+ if (possibleXmlNs.Contains(KnownNamespace_Presentation))
+ return KnownNamespace_Presentation;
return possibleXmlNs.FirstOrDefault();
}
- public XName GetXamlNsName(string name, XElement elem = null) {
- var xNs = GetXmlNamespace("http://schemas.microsoft.com/winfx/2006/xaml");
+ public XName GetKnownNamespace(string name, string xmlNamespace, XElement context = null) {
+ var xNs = GetXmlNamespace(xmlNamespace);
XName xName;
- if (elem != null && xNs == elem.GetDefaultNamespace())
+ if (context != null && xNs == context.GetDefaultNamespace())
xName = name;
else
xName = xNs + name;