Browse Source

Added new style resource test.

To get style resources working, OmniXaml #84 really needs to be set, so
style resource tests failing for the moment.
pull/464/head
Steven Kirk 11 years ago
parent
commit
0df95a81ae
  1. 38
      src/Markup/Perspex.Markup.Xaml/Data/StyleResourceBinding.cs
  2. 27
      tests/Perspex.Markup.Xaml.UnitTests/Xaml/StyleTests.cs

38
src/Markup/Perspex.Markup.Xaml/Data/StyleResourceBinding.cs

@ -5,6 +5,7 @@ using System;
using System.Reactive.Disposables; using System.Reactive.Disposables;
using System.Reactive.Linq; using System.Reactive.Linq;
using System.Reactive.Subjects; using System.Reactive.Subjects;
using Perspex.Controls;
using Perspex.Data; using Perspex.Data;
using Perspex.Styling; using Perspex.Styling;
@ -38,18 +39,20 @@ namespace Perspex.Markup.Xaml.Data
PerspexProperty targetProperty, PerspexProperty targetProperty,
IPerspexObject treeAnchor = null) IPerspexObject treeAnchor = null)
{ {
return new Subject(target, Name); return new Subject(target, Name, treeAnchor);
} }
private class Subject : ISubject<object> private class Subject : ISubject<object>
{ {
private IPerspexObject _target; private IPerspexObject _target;
private string _name; private string _name;
private IPerspexObject _treeAnchor;
public Subject(IPerspexObject target, string name) public Subject(IPerspexObject target, string name, IPerspexObject treeAnchor)
{ {
_target = target; _target = target;
_name = name; _name = name;
_treeAnchor = treeAnchor;
} }
public void OnCompleted() public void OnCompleted()
@ -66,24 +69,25 @@ namespace Perspex.Markup.Xaml.Data
public IDisposable Subscribe(IObserver<object> observer) public IDisposable Subscribe(IObserver<object> observer)
{ {
// HACK around OmniXAML issue #84. var host = (_target as IControl) ?? (_treeAnchor as IControl);
var po = (PerspexObject)_target;
var parent = PerspexPropertyRegistry.Instance.FindRegistered(po, "Parent"); if (host != null)
{
return po.GetObservable(parent) var resource = host.FindStyleResource(_name);
.Where(x => x != PerspexProperty.UnsetValue && x != null)
.Take(1) if (resource != PerspexProperty.UnsetValue)
.Subscribe(_ =>
{ {
var resource = ((IStyleHost)_target).FindStyleResource(_name); observer.OnNext(resource);
}
if (resource != PerspexProperty.UnsetValue) observer.OnCompleted();
{ }
observer.OnNext(resource); else
} {
// TODO: Log error.
}
observer.OnCompleted(); return Disposable.Empty;
});
} }
} }
} }

27
tests/Perspex.Markup.Xaml.UnitTests/Xaml/StyleTests.cs

@ -113,5 +113,32 @@ namespace Perspex.Markup.Xaml.UnitTests.Xaml
Assert.Equal(0xff506070, brush.Color.ToUint32()); Assert.Equal(0xff506070, brush.Color.ToUint32());
} }
} }
[Fact]
public void StyleResource_Can_Be_Assigned_To_StyleResource_Property()
{
using (UnitTestApplication.Start(TestServices.StyledWindow))
{
var xaml = @"
<Window xmlns='https://github.com/perspex'
xmlns:mut='https://github.com/perspex/mutable'
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>
<Window.Styles>
<Style>
<Style.Resources>
<Color x:Key='color'>#ff506070</Color>
<mut:SolidColorBrush x:Key='brush' Color='{StyleResource color}'/>
</Style.Resources>
</Style>
</Window.Styles>
</Window>";
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());
}
}
} }
} }

Loading…
Cancel
Save