Browse Source

Merge pull request #502 from gumme/WpfDesignerMarkupExtensionStaticResourceFix

Wpf Designer StaticResource fix
pull/503/head
Andreas Weizel 11 years ago
parent
commit
f76f245d69
  1. 28
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/Designer/ModelTests.cs
  2. 69
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/MarkupExtensionPrinter.cs

28
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/Designer/ModelTests.cs

@ -639,6 +639,34 @@ namespace ICSharpCode.WpfDesign.Tests.Designer @@ -639,6 +639,34 @@ namespace ICSharpCode.WpfDesign.Tests.Designer
AddBindingWithStaticResourceWhereResourceOnSameElement(true);
}
[Test]
public void AddStaticResourceWhereResourceOnSameElement()
{
DesignItem button = CreateCanvasContext("<Button/>");
DesignItem canvas = button.Parent;
DesignItemProperty resProp = button.Properties.GetProperty("Resources");
Assert.IsTrue(resProp.IsCollection);
DesignItem exampleClassItem = canvas.Services.Component.RegisterComponentForDesigner(new ExampleClass());
exampleClassItem.Key = "res1";
resProp.CollectionElements.Add(exampleClassItem);
button.Properties["Tag"].SetValue(new StaticResourceExtension());
button.Properties["Tag"].Value.Properties["ResourceKey"].SetValue("res1");
string expectedXaml = "<Button>\n" +
" <Button.Resources>\n" +
" <t:ExampleClass x:Key=\"res1\" />\n" +
" </Button.Resources>\n" +
" <Button.Tag>\n" +
" <StaticResourceExtension ResourceKey=\"res1\" />\n" +
" </Button.Tag>\n" +
"</Button>";
AssertCanvasDesignerOutput(expectedXaml, button.Context);
AssertLog("");
}
[Test]
public void AddBrushAsResource()
{

69
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/MarkupExtensionPrinter.cs

@ -38,36 +38,7 @@ namespace ICSharpCode.WpfDesign.XamlDom @@ -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));
}
/// <summary>
@ -115,6 +86,28 @@ namespace ICSharpCode.WpfDesign.XamlDom @@ -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 @@ -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;
}
}
}

Loading…
Cancel
Save