From 577eb9c329ccc5bdb6793192f43a434afc8268dc Mon Sep 17 00:00:00 2001 From: gumme Date: Tue, 24 Jun 2014 12:05:08 +0200 Subject: [PATCH] A StaticResource that references a resource on the same element is now printed in element style. --- .../Tests/Designer/ModelTests.cs | 28 ++++++++ .../Project/MarkupExtensionPrinter.cs | 69 +++++++++++-------- 2 files changed, 67 insertions(+), 30 deletions(-) diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/Designer/ModelTests.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/Designer/ModelTests.cs index 84bcd70377..1419521e82 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/Designer/ModelTests.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/Designer/ModelTests.cs @@ -639,6 +639,34 @@ namespace ICSharpCode.WpfDesign.Tests.Designer AddBindingWithStaticResourceWhereResourceOnSameElement(true); } + [Test] + public void AddStaticResourceWhereResourceOnSameElement() + { + DesignItem button = CreateCanvasContext(""; + + AssertCanvasDesignerOutput(expectedXaml, button.Context); + AssertLog(""); + } + [Test] public void AddBrushAsResource() { diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/MarkupExtensionPrinter.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/MarkupExtensionPrinter.cs index d7b1b1949e..dd23b6eef2 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/MarkupExtensionPrinter.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/MarkupExtensionPrinter.cs @@ -38,36 +38,7 @@ namespace ICSharpCode.WpfDesign.XamlDom return false; } - foreach (var property in obj.Properties.Where((prop) => prop.IsSet)) - { - var value = property.PropertyValue; - if (value is XamlTextValue) - continue; - else - { - XamlObject xamlObject = value as XamlObject; - if (xamlObject == null || !xamlObject.IsMarkupExtension) - return false; - else { - var staticResource = xamlObject.Instance as System.Windows.StaticResourceExtension; - if (staticResource != null && - staticResource.ResourceKey != null) { - XamlObject parent = GetNonMarkupExtensionParent(xamlObject); - - if (parent != null) { - var parentLocalResource = parent.ServiceProvider.Resolver.FindLocalResource(staticResource.ResourceKey); - - // If resource with the specified key is declared locally on the same object as the StaticResource is being used the markup extension - // must be printed as element to find the resource, otherwise it will search from parent-parent and find none or another resource. - if (parentLocalResource != null) - return false; - } - } - } - } - } - - return true; + return CanPrint(obj, false, GetNonMarkupExtensionParent(obj)); } /// @@ -115,6 +86,28 @@ namespace ICSharpCode.WpfDesign.XamlDom return sb.ToString(); } + private static bool CanPrint(XamlObject obj, bool isNested, XamlObject nonMarkupExtensionParent) + { + if ((isNested || obj.ParentObject == nonMarkupExtensionParent) && IsStaticResourceThatReferencesLocalResource(obj, nonMarkupExtensionParent)) { + return false; + } + + foreach (var property in obj.Properties.Where((prop) => prop.IsSet)) { + var value = property.PropertyValue; + if (value is XamlTextValue) + continue; + else { + var xamlObject = value as XamlObject; + if (xamlObject == null || !xamlObject.IsMarkupExtension) + return false; + else + return CanPrint(xamlObject, true, nonMarkupExtensionParent); + } + } + + return true; + } + private static XamlObject GetNonMarkupExtensionParent(XamlObject markupExtensionObject) { System.Diagnostics.Debug.Assert(markupExtensionObject.IsMarkupExtension); @@ -125,5 +118,21 @@ namespace ICSharpCode.WpfDesign.XamlDom } return obj; } + + private static bool IsStaticResourceThatReferencesLocalResource(XamlObject obj, XamlObject nonMarkupExtensionParent) + { + var staticResource = obj.Instance as System.Windows.StaticResourceExtension; + if (staticResource != null && staticResource.ResourceKey != null && nonMarkupExtensionParent != null) { + + var parentLocalResource = nonMarkupExtensionParent.ServiceProvider.Resolver.FindLocalResource(staticResource.ResourceKey); + + // If resource with the specified key is declared locally on the same object as the StaticResource is being used the markup extension + // must be printed as element to find the resource, otherwise it will search from parent-parent and find none or another resource. + if (parentLocalResource != null) + return true; + } + + return false; + } } }