Browse Source

Fix faulty resource lookup.

Steven Kirk 8 years ago
parent
commit
bf2d403f14

+ 1 - 1
src/Avalonia.Controls/Application.cs

@@ -153,7 +153,7 @@ namespace Avalonia
         bool IResourceProvider.TryGetResource(string key, out object value)
         {
             value = null;
-            return _resources?.TryGetResource(key, out value) ??
+            return (_resources?.TryGetResource(key, out value) ?? false) ||
                    Styles.TryGetResource(key, out value);
         }
 

+ 2 - 3
src/Avalonia.Controls/Control.cs

@@ -428,9 +428,8 @@ namespace Avalonia.Controls
         bool IResourceProvider.TryGetResource(string key, out object value)
         {
             value = null;
-            return _resources?.TryGetResource(key, out value) ?? 
-                   _styles?.TryGetResource(key, out value) ??
-                   false;
+            return (_resources?.TryGetResource(key, out value) ?? false) ||
+                   (_styles?.TryGetResource(key, out value) ?? false);
         }
 
         /// <summary>

+ 2 - 2
src/Avalonia.Controls/ControlExtensions.cs

@@ -86,7 +86,7 @@ namespace Avalonia.Controls
         /// </summary>
         /// <param name="control">The control.</param>
         /// <param name="key">The resource key.</param>
-        /// <returns>The resource, or null if not found.</returns>
+        /// <returns>The resource, or <see cref="AvaloniaProperty.UnsetValue"/> if not found.</returns>
         public static object FindResource(this IControl control, string key)
         {
             Contract.Requires<ArgumentNullException>(control != null);
@@ -107,7 +107,7 @@ namespace Avalonia.Controls
                 current = current.StylingParent;
             }
 
-            return null;
+            return AvaloniaProperty.UnsetValue;
         }
 
         /// <summary>

+ 36 - 1
tests/Avalonia.Controls.UnitTests/ControlTests_Resources.cs

@@ -77,11 +77,46 @@ namespace Avalonia.Controls.UnitTests
                             { "foo", "foo-value" },
                         }
                     }
-                }
+                },
+                Resources =
+                {
+                    { "bar", "bar-value" },
+                },
             };
 
             Assert.Equal("foo-value", target.FindResource("foo"));
         }
 
+        [Fact]
+        public void FindResource_Should_Find_Application_Style_Resource()
+        {
+            Control target;
+
+            var app = new Application
+            {
+                Styles =
+                {
+                    new Style
+                    {
+                        Resources =
+                        {
+                            { "foo", "foo-value" },
+                        },
+                    }
+                },
+                Resources =
+                {
+                    { "bar", "bar-value" },
+                },
+            };
+
+            var root = new TestRoot
+            {
+                Child = target = new Control(),
+                StylingParent = app,
+            };
+
+            Assert.Equal("foo-value", target.FindResource("foo"));
+        }
     }
 }