diff --git a/src/Markup/Perspex.Markup.Xaml/Data/StyleResourceBinding.cs b/src/Markup/Perspex.Markup.Xaml/Data/StyleResourceBinding.cs index 58b18fae6e..390efc6f63 100644 --- a/src/Markup/Perspex.Markup.Xaml/Data/StyleResourceBinding.cs +++ b/src/Markup/Perspex.Markup.Xaml/Data/StyleResourceBinding.cs @@ -5,6 +5,7 @@ using System; using System.Reactive.Disposables; using System.Reactive.Linq; using System.Reactive.Subjects; +using Perspex.Controls; using Perspex.Data; using Perspex.Styling; @@ -38,18 +39,20 @@ namespace Perspex.Markup.Xaml.Data PerspexProperty targetProperty, IPerspexObject treeAnchor = null) { - return new Subject(target, Name); + return new Subject(target, Name, treeAnchor); } private class Subject : ISubject { private IPerspexObject _target; private string _name; + private IPerspexObject _treeAnchor; - public Subject(IPerspexObject target, string name) + public Subject(IPerspexObject target, string name, IPerspexObject treeAnchor) { _target = target; _name = name; + _treeAnchor = treeAnchor; } public void OnCompleted() @@ -66,24 +69,25 @@ namespace Perspex.Markup.Xaml.Data public IDisposable Subscribe(IObserver observer) { - // HACK around OmniXAML issue #84. - var po = (PerspexObject)_target; - var parent = PerspexPropertyRegistry.Instance.FindRegistered(po, "Parent"); - - return po.GetObservable(parent) - .Where(x => x != PerspexProperty.UnsetValue && x != null) - .Take(1) - .Subscribe(_ => + var host = (_target as IControl) ?? (_treeAnchor as IControl); + + if (host != null) + { + var resource = host.FindStyleResource(_name); + + if (resource != PerspexProperty.UnsetValue) { - var resource = ((IStyleHost)_target).FindStyleResource(_name); + observer.OnNext(resource); + } - if (resource != PerspexProperty.UnsetValue) - { - observer.OnNext(resource); - } + observer.OnCompleted(); + } + else + { + // TODO: Log error. + } - observer.OnCompleted(); - }); + return Disposable.Empty; } } } diff --git a/tests/Perspex.Markup.Xaml.UnitTests/Xaml/StyleTests.cs b/tests/Perspex.Markup.Xaml.UnitTests/Xaml/StyleTests.cs index 8df9967318..e1347b2779 100644 --- a/tests/Perspex.Markup.Xaml.UnitTests/Xaml/StyleTests.cs +++ b/tests/Perspex.Markup.Xaml.UnitTests/Xaml/StyleTests.cs @@ -113,5 +113,32 @@ namespace Perspex.Markup.Xaml.UnitTests.Xaml Assert.Equal(0xff506070, brush.Color.ToUint32()); } } + + [Fact] + public void StyleResource_Can_Be_Assigned_To_StyleResource_Property() + { + using (UnitTestApplication.Start(TestServices.StyledWindow)) + { + var xaml = @" + + + + +"; + + var loader = new PerspexXamlLoader(); + var window = (Window)loader.Load(xaml); + var brush = (Perspex.Media.Mutable.SolidColorBrush)window.FindStyleResource("brush"); + + Assert.Equal(0xff506070, brush.Color.ToUint32()); + } + } } }